Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1533682 > unrolled thread
| Started by | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| First post | 2016-12-01 00:50 +0100 |
| Last post | 2016-12-01 00:50 +0100 |
| Articles | 11 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH v2 0/6] introduce DAX tracepoint support Ross Zwisler <ross.zwisler@linux.intel.com> - 2016-12-01 00:50 +0100
[PATCH v2 5/6] dax: add tracepoints to dax_pmd_load_hole() Ross Zwisler <ross.zwisler@linux.intel.com> - 2016-12-01 00:50 +0100
[PATCH v2 2/6] dax: remove leading space from labels Ross Zwisler <ross.zwisler@linux.intel.com> - 2016-12-01 00:50 +0100
Re: [PATCH v2 2/6] dax: remove leading space from labels Jan Kara <jack@suse.cz> - 2016-12-01 09:30 +0100
Re: [PATCH v2 2/6] dax: remove leading space from labels Ross Zwisler <ross.zwisler@linux.intel.com> - 2016-12-01 16:30 +0100
Re: [PATCH v2 2/6] dax: remove leading space from labels Jan Kara <jack@suse.cz> - 2016-12-01 17:40 +0100
[PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() Ross Zwisler <ross.zwisler@linux.intel.com> - 2016-12-01 00:50 +0100
Re: [PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() Steven Rostedt <rostedt@goodmis.org> - 2016-12-01 15:20 +0100
Re: [PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() Ross Zwisler <ross.zwisler@linux.intel.com> - 2016-12-01 16:50 +0100
Re: [PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() Steven Rostedt <rostedt@goodmis.org> - 2016-12-01 17:20 +0100
[PATCH v2 4/6] dax: update MAINTAINERS entries for FS DAX Ross Zwisler <ross.zwisler@linux.intel.com> - 2016-12-01 00:50 +0100
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2016-12-01 00:50 +0100 |
| Subject | [PATCH v2 0/6] introduce DAX tracepoint support |
| Message-ID | <sJmNr-4n7-9@gated-at.bofh.it> |
Tracepoints are the standard way to capture debugging and tracing information in many parts of the kernel, including the XFS and ext4 filesystems. This series creates a tracepoint header for FS DAX and add the first few DAX tracepoints to the PMD fault handler. This allows the tracing for DAX to be done in the same way as the filesystem tracing so that developers can look at them together and get a coherent idea of what the system is doing. I do intend to add tracepoints to the normal 4k DAX fault path and to the DAX I/O path, but I wanted to get feedback on the PMD tracepoints before I went any further. This series is based on Jan Kara's "dax: Clear dirty bits after flushing caches" series: https://lists.01.org/pipermail/linux-nvdimm/2016-November/007864.html I've pushed a git tree with this work here: https://git.kernel.org/cgit/linux/kernel/git/zwisler/linux.git/log/?h=dax_tracepoints_v2 Changes since v1: - Dropped the patch fixing the build issue between DAX, ext4 and FS_IOMAP. I'll resend an updated patch if needed once Jan's patches for this issue are applied. - Added incude/linux/dax.h to MAINTAINERS in patch 4. (Matthew) - Begin each DAX tracepoint with the device major/minor and the inode so that we are consistent with the XFS tracepoints. This will allow for easy grepping of the tracepoint output. (Dave) - Print all PMD fault flags, not just whether we are doing a read or a write. (Jan) - Added __print_flags_u64() and the necessary helpers to the tracing infrastructure. These functions allow us to print symbols associated with flags that are 64 bits wide even on 32 bit machines. We need this for the pfn_t flags. Ross Zwisler (6): tracing: add __print_flags_u64() dax: remove leading space from labels dax: add tracepoint infrastructure, PMD tracing dax: update MAINTAINERS entries for FS DAX dax: add tracepoints to dax_pmd_load_hole() dax: add tracepoints to dax_pmd_insert_mapping() MAINTAINERS | 5 +- fs/dax.c | 80 +++++++++++++-------- include/linux/mm.h | 25 +++++++ include/linux/pfn_t.h | 6 ++ include/linux/trace_events.h | 4 ++ include/trace/events/fs_dax.h | 161 ++++++++++++++++++++++++++++++++++++++++++ include/trace/trace_events.h | 11 +++ kernel/trace/trace_output.c | 38 ++++++++++ 8 files changed, 300 insertions(+), 30 deletions(-) create mode 100644 include/trace/events/fs_dax.h -- 2.7.4
[toc] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2016-12-01 00:50 +0100 |
| Subject | [PATCH v2 5/6] dax: add tracepoints to dax_pmd_load_hole() |
| Message-ID | <sJmNr-4n7-15@gated-at.bofh.it> |
| In reply to | #1533682 |
Add tracepoints to dax_pmd_load_hole(), following the same logging
conventions as the tracepoints in dax_iomap_pmd_fault().
Here is an example PMD fault showing the new tracepoints:
read_big-1478 [004] .... 238.242188: xfs_filemap_pmd_fault: dev 259:0
ino 0x1003
read_big-1478 [004] .... 238.242191: dax_pmd_fault: dev 259:0 ino 0x1003
shared ALLOW_RETRY|KILLABLE|USER address 0x10400000 vm_start 0x10200000
vm_end 0x10600000 pgoff 0x200 max_pgoff 0x1400
read_big-1478 [004] .... 238.242390: dax_pmd_load_hole: dev 259:0 ino
0x1003 shared address 0x10400000 zero_page ffffea0002c20000 radix_entry
0x1e
read_big-1478 [004] .... 238.242392: dax_pmd_fault_done: dev 259:0 ino
0x1003 shared ALLOW_RETRY|KILLABLE|USER address 0x10400000 vm_start
0x10200000 vm_end 0x10600000 pgoff 0x200 max_pgoff 0x1400 NOPAGE
Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Reviewed-by: Jan Kara <jack@suse.cz>
---
fs/dax.c | 14 ++++++++++----
include/trace/events/fs_dax.h | 42 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index 4a99c2e..ad18366 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1269,33 +1269,39 @@ static int dax_pmd_load_hole(struct vm_area_struct *vma, pmd_t *pmd,
{
struct address_space *mapping = vma->vm_file->f_mapping;
unsigned long pmd_addr = address & PMD_MASK;
+ struct inode *inode = mapping->host;
struct page *zero_page;
+ void *ret = NULL;
spinlock_t *ptl;
pmd_t pmd_entry;
- void *ret;
zero_page = mm_get_huge_zero_page(vma->vm_mm);
if (unlikely(!zero_page))
- return VM_FAULT_FALLBACK;
+ goto fallback;
ret = dax_insert_mapping_entry(mapping, vmf, *entryp, 0,
RADIX_DAX_PMD | RADIX_DAX_HZP);
if (IS_ERR(ret))
- return VM_FAULT_FALLBACK;
+ goto fallback;
*entryp = ret;
ptl = pmd_lock(vma->vm_mm, pmd);
if (!pmd_none(*pmd)) {
spin_unlock(ptl);
- return VM_FAULT_FALLBACK;
+ goto fallback;
}
pmd_entry = mk_pmd(zero_page, vma->vm_page_prot);
pmd_entry = pmd_mkhuge(pmd_entry);
set_pmd_at(vma->vm_mm, pmd_addr, pmd, pmd_entry);
spin_unlock(ptl);
+ trace_dax_pmd_load_hole(inode, vma, address, zero_page, ret);
return VM_FAULT_NOPAGE;
+
+fallback:
+ trace_dax_pmd_load_hole_fallback(inode, vma, address, zero_page, ret);
+ return VM_FAULT_FALLBACK;
}
int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address,
diff --git a/include/trace/events/fs_dax.h b/include/trace/events/fs_dax.h
index 5acc016..9f0a455 100644
--- a/include/trace/events/fs_dax.h
+++ b/include/trace/events/fs_dax.h
@@ -61,6 +61,48 @@ DEFINE_EVENT(dax_pmd_fault_class, name, \
DEFINE_PMD_FAULT_EVENT(dax_pmd_fault);
DEFINE_PMD_FAULT_EVENT(dax_pmd_fault_done);
+DECLARE_EVENT_CLASS(dax_pmd_load_hole_class,
+ TP_PROTO(struct inode *inode, struct vm_area_struct *vma,
+ unsigned long address, struct page *zero_page,
+ void *radix_entry),
+ TP_ARGS(inode, vma, address, zero_page, radix_entry),
+ TP_STRUCT__entry(
+ __field(dev_t, dev)
+ __field(unsigned long, ino)
+ __field(unsigned long, vm_flags)
+ __field(unsigned long, address)
+ __field(struct page *, zero_page)
+ __field(void *, radix_entry)
+ ),
+ TP_fast_assign(
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->ino = inode->i_ino;
+ __entry->vm_flags = vma->vm_flags;
+ __entry->address = address;
+ __entry->zero_page = zero_page;
+ __entry->radix_entry = radix_entry;
+ ),
+ TP_printk("dev %d:%d ino %#lx %s address %#lx zero_page %p "
+ "radix_entry %#lx",
+ MAJOR(__entry->dev),
+ MINOR(__entry->dev),
+ __entry->ino,
+ __entry->vm_flags & VM_SHARED ? "shared" : "private",
+ __entry->address,
+ __entry->zero_page,
+ (unsigned long)__entry->radix_entry
+ )
+)
+
+#define DEFINE_PMD_LOAD_HOLE_EVENT(name) \
+DEFINE_EVENT(dax_pmd_load_hole_class, name, \
+ TP_PROTO(struct inode *inode, struct vm_area_struct *vma, \
+ unsigned long address, struct page *zero_page, \
+ void *radix_entry), \
+ TP_ARGS(inode, vma, address, zero_page, radix_entry))
+
+DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole);
+DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback);
#endif /* _TRACE_FS_DAX_H */
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2016-12-01 00:50 +0100 |
| Subject | [PATCH v2 2/6] dax: remove leading space from labels |
| Message-ID | <sJmNr-4n7-17@gated-at.bofh.it> |
| In reply to | #1533682 |
No functional change.
As of this commit:
commit 218dd85887da (".gitattributes: set git diff driver for C source code
files")
git-diff and git-format-patch both generate diffs whose hunks are correctly
prefixed by function names instead of labels, even if those labels aren't
indented with spaces.
Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
---
fs/dax.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index be39633..b14335c 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -422,7 +422,7 @@ static void *grab_mapping_entry(struct address_space *mapping, pgoff_t index,
return page;
}
entry = lock_slot(mapping, slot);
- out_unlock:
+out_unlock:
spin_unlock_irq(&mapping->tree_lock);
return entry;
}
@@ -557,7 +557,7 @@ static int dax_load_hole(struct address_space *mapping, void **entry,
vmf->gfp_mask | __GFP_ZERO);
if (!page)
return VM_FAULT_OOM;
- out:
+out:
vmf->page = page;
ret = finish_fault(vmf);
vmf->page = NULL;
@@ -659,7 +659,7 @@ static void *dax_insert_mapping_entry(struct address_space *mapping,
}
if (vmf->flags & FAULT_FLAG_WRITE)
radix_tree_tag_set(page_tree, index, PAGECACHE_TAG_DIRTY);
- unlock:
+unlock:
spin_unlock_irq(&mapping->tree_lock);
if (hole_fill) {
radix_tree_preload_end();
@@ -812,12 +812,12 @@ static int dax_writeback_one(struct block_device *bdev,
spin_lock_irq(&mapping->tree_lock);
radix_tree_tag_clear(page_tree, index, PAGECACHE_TAG_DIRTY);
spin_unlock_irq(&mapping->tree_lock);
- unmap:
+unmap:
dax_unmap_atomic(bdev, &dax);
put_locked_mapping_entry(mapping, index, entry);
return ret;
- put_unlocked:
+put_unlocked:
put_unlocked_mapping_entry(mapping, index, entry2);
spin_unlock_irq(&mapping->tree_lock);
return ret;
@@ -1194,11 +1194,11 @@ int dax_iomap_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
break;
}
- error_unlock_entry:
+error_unlock_entry:
vmf_ret = dax_fault_return(error) | major;
- unlock_entry:
+unlock_entry:
put_locked_mapping_entry(mapping, vmf->pgoff, entry);
- finish_iomap:
+finish_iomap:
if (ops->iomap_end) {
int copied = PAGE_SIZE;
@@ -1255,7 +1255,7 @@ static int dax_pmd_insert_mapping(struct vm_area_struct *vma, pmd_t *pmd,
return vmf_insert_pfn_pmd(vma, address, pmd, dax.pfn, write);
- unmap_fallback:
+unmap_fallback:
dax_unmap_atomic(bdev, &dax);
return VM_FAULT_FALLBACK;
}
@@ -1379,9 +1379,9 @@ int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address,
break;
}
- unlock_entry:
+unlock_entry:
put_locked_mapping_entry(mapping, pgoff, entry);
- finish_iomap:
+finish_iomap:
if (ops->iomap_end) {
int copied = PMD_SIZE;
@@ -1396,7 +1396,7 @@ int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address,
ops->iomap_end(inode, pos, PMD_SIZE, copied, iomap_flags,
&iomap);
}
- fallback:
+fallback:
if (result == VM_FAULT_FALLBACK) {
split_huge_pmd(vma, pmd, address);
count_vm_event(THP_FAULT_FALLBACK);
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Jan Kara <jack@suse.cz> |
|---|---|
| Date | 2016-12-01 09:30 +0100 |
| Subject | Re: [PATCH v2 2/6] dax: remove leading space from labels |
| Message-ID | <sJuUG-1mt-1@gated-at.bofh.it> |
| In reply to | #1533684 |
On Wed 30-11-16 16:45:29, Ross Zwisler wrote:
> No functional change.
>
> As of this commit:
>
> commit 218dd85887da (".gitattributes: set git diff driver for C source code
> files")
>
> git-diff and git-format-patch both generate diffs whose hunks are correctly
> prefixed by function names instead of labels, even if those labels aren't
> indented with spaces.
>
> Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Didn't we agree do leave this for a bit later?
Honza
> ---
> fs/dax.c | 24 ++++++++++++------------
> 1 file changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/fs/dax.c b/fs/dax.c
> index be39633..b14335c 100644
> --- a/fs/dax.c
> +++ b/fs/dax.c
> @@ -422,7 +422,7 @@ static void *grab_mapping_entry(struct address_space *mapping, pgoff_t index,
> return page;
> }
> entry = lock_slot(mapping, slot);
> - out_unlock:
> +out_unlock:
> spin_unlock_irq(&mapping->tree_lock);
> return entry;
> }
> @@ -557,7 +557,7 @@ static int dax_load_hole(struct address_space *mapping, void **entry,
> vmf->gfp_mask | __GFP_ZERO);
> if (!page)
> return VM_FAULT_OOM;
> - out:
> +out:
> vmf->page = page;
> ret = finish_fault(vmf);
> vmf->page = NULL;
> @@ -659,7 +659,7 @@ static void *dax_insert_mapping_entry(struct address_space *mapping,
> }
> if (vmf->flags & FAULT_FLAG_WRITE)
> radix_tree_tag_set(page_tree, index, PAGECACHE_TAG_DIRTY);
> - unlock:
> +unlock:
> spin_unlock_irq(&mapping->tree_lock);
> if (hole_fill) {
> radix_tree_preload_end();
> @@ -812,12 +812,12 @@ static int dax_writeback_one(struct block_device *bdev,
> spin_lock_irq(&mapping->tree_lock);
> radix_tree_tag_clear(page_tree, index, PAGECACHE_TAG_DIRTY);
> spin_unlock_irq(&mapping->tree_lock);
> - unmap:
> +unmap:
> dax_unmap_atomic(bdev, &dax);
> put_locked_mapping_entry(mapping, index, entry);
> return ret;
>
> - put_unlocked:
> +put_unlocked:
> put_unlocked_mapping_entry(mapping, index, entry2);
> spin_unlock_irq(&mapping->tree_lock);
> return ret;
> @@ -1194,11 +1194,11 @@ int dax_iomap_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
> break;
> }
>
> - error_unlock_entry:
> +error_unlock_entry:
> vmf_ret = dax_fault_return(error) | major;
> - unlock_entry:
> +unlock_entry:
> put_locked_mapping_entry(mapping, vmf->pgoff, entry);
> - finish_iomap:
> +finish_iomap:
> if (ops->iomap_end) {
> int copied = PAGE_SIZE;
>
> @@ -1255,7 +1255,7 @@ static int dax_pmd_insert_mapping(struct vm_area_struct *vma, pmd_t *pmd,
>
> return vmf_insert_pfn_pmd(vma, address, pmd, dax.pfn, write);
>
> - unmap_fallback:
> +unmap_fallback:
> dax_unmap_atomic(bdev, &dax);
> return VM_FAULT_FALLBACK;
> }
> @@ -1379,9 +1379,9 @@ int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address,
> break;
> }
>
> - unlock_entry:
> +unlock_entry:
> put_locked_mapping_entry(mapping, pgoff, entry);
> - finish_iomap:
> +finish_iomap:
> if (ops->iomap_end) {
> int copied = PMD_SIZE;
>
> @@ -1396,7 +1396,7 @@ int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address,
> ops->iomap_end(inode, pos, PMD_SIZE, copied, iomap_flags,
> &iomap);
> }
> - fallback:
> +fallback:
> if (result == VM_FAULT_FALLBACK) {
> split_huge_pmd(vma, pmd, address);
> count_vm_event(THP_FAULT_FALLBACK);
> --
> 2.7.4
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
[toc] | [prev] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2016-12-01 16:30 +0100 |
| Subject | Re: [PATCH v2 2/6] dax: remove leading space from labels |
| Message-ID | <sJBt7-5DE-27@gated-at.bofh.it> |
| In reply to | #1533892 |
On Thu, Dec 01, 2016 at 09:11:44AM +0100, Jan Kara wrote:
> On Wed 30-11-16 16:45:29, Ross Zwisler wrote:
> > No functional change.
> >
> > As of this commit:
> >
> > commit 218dd85887da (".gitattributes: set git diff driver for C source code
> > files")
> >
> > git-diff and git-format-patch both generate diffs whose hunks are correctly
> > prefixed by function names instead of labels, even if those labels aren't
> > indented with spaces.
> >
> > Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
>
> Didn't we agree do leave this for a bit later?
Sorry, I thought you just asked to not have to edit your "Page invalidation
fixes" series because of this change. This series is based on a tree that
already includes your page invalidation work, so it shouldn't cause you any
thrash.
I'll pull it out of the next version of this series.
[toc] | [prev] | [next] | [standalone]
| From | Jan Kara <jack@suse.cz> |
|---|---|
| Date | 2016-12-01 17:40 +0100 |
| Subject | Re: [PATCH v2 2/6] dax: remove leading space from labels |
| Message-ID | <sJCyS-6te-31@gated-at.bofh.it> |
| In reply to | #1534189 |
On Thu 01-12-16 08:26:19, Ross Zwisler wrote:
> On Thu, Dec 01, 2016 at 09:11:44AM +0100, Jan Kara wrote:
> > On Wed 30-11-16 16:45:29, Ross Zwisler wrote:
> > > No functional change.
> > >
> > > As of this commit:
> > >
> > > commit 218dd85887da (".gitattributes: set git diff driver for C source code
> > > files")
> > >
> > > git-diff and git-format-patch both generate diffs whose hunks are correctly
> > > prefixed by function names instead of labels, even if those labels aren't
> > > indented with spaces.
> > >
> > > Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
> >
> > Didn't we agree do leave this for a bit later?
>
> Sorry, I thought you just asked to not have to edit your "Page invalidation
> fixes" series because of this change. This series is based on a tree that
> already includes your page invalidation work, so it shouldn't cause you any
> thrash.
Ah, I see, I didn't notice. Then it's fine :). Thanks.
Honza
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
[toc] | [prev] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2016-12-01 00:50 +0100 |
| Subject | [PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() |
| Message-ID | <sJmNr-4n7-29@gated-at.bofh.it> |
| In reply to | #1533682 |
Add tracepoints to dax_pmd_insert_mapping(), following the same logging
conventions as the tracepoints in dax_iomap_pmd_fault().
Here is an example PMD fault showing the new tracepoints:
big-1504 [001] .... 326.960743: xfs_filemap_pmd_fault: dev 259:0 ino
0x1003
big-1504 [001] .... 326.960753: dax_pmd_fault: dev 259:0 ino 0x1003
shared WRITE|ALLOW_RETRY|KILLABLE|USER address 0x10505000 vm_start
0x10200000 vm_end 0x10700000 pgoff 0x200 max_pgoff 0x1400
big-1504 [001] .... 326.960981: dax_pmd_insert_mapping: dev 259:0 ino
0x1003 shared write address 0x10505000 length 0x200000 pfn 0x100600 DEV|MAP
radix_entry 0xc000e
big-1504 [001] .... 326.960986: dax_pmd_fault_done: dev 259:0 ino 0x1003
shared WRITE|ALLOW_RETRY|KILLABLE|USER address 0x10505000 vm_start
0x10200000 vm_end 0x10700000 pgoff 0x200 max_pgoff 0x1400 NOPAGE
Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Reviewed-by: Jan Kara <jack@suse.cz>
---
fs/dax.c | 12 +++++++---
include/linux/pfn_t.h | 6 +++++
include/trace/events/fs_dax.h | 51 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 66 insertions(+), 3 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index ad18366..66bbd2d 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1232,15 +1232,16 @@ static int dax_pmd_insert_mapping(struct vm_area_struct *vma, pmd_t *pmd,
{
struct address_space *mapping = vma->vm_file->f_mapping;
struct block_device *bdev = iomap->bdev;
+ struct inode *inode = mapping->host;
struct blk_dax_ctl dax = {
.sector = dax_iomap_sector(iomap, pos),
.size = PMD_SIZE,
};
long length = dax_map_atomic(bdev, &dax);
- void *ret;
+ void *ret = NULL;
if (length < 0) /* dax_map_atomic() failed */
- return VM_FAULT_FALLBACK;
+ goto fallback;
if (length < PMD_SIZE)
goto unmap_fallback;
if (pfn_t_to_pfn(dax.pfn) & PG_PMD_COLOUR)
@@ -1253,13 +1254,18 @@ static int dax_pmd_insert_mapping(struct vm_area_struct *vma, pmd_t *pmd,
ret = dax_insert_mapping_entry(mapping, vmf, *entryp, dax.sector,
RADIX_DAX_PMD);
if (IS_ERR(ret))
- return VM_FAULT_FALLBACK;
+ goto fallback;
*entryp = ret;
+ trace_dax_pmd_insert_mapping(inode, vma, address, write, length,
+ dax.pfn, ret);
return vmf_insert_pfn_pmd(vma, address, pmd, dax.pfn, write);
unmap_fallback:
dax_unmap_atomic(bdev, &dax);
+fallback:
+ trace_dax_pmd_insert_mapping_fallback(inode, vma, address, write,
+ length, dax.pfn, ret);
return VM_FAULT_FALLBACK;
}
diff --git a/include/linux/pfn_t.h b/include/linux/pfn_t.h
index a3d90b9..033fc7b 100644
--- a/include/linux/pfn_t.h
+++ b/include/linux/pfn_t.h
@@ -15,6 +15,12 @@
#define PFN_DEV (1ULL << (BITS_PER_LONG_LONG - 3))
#define PFN_MAP (1ULL << (BITS_PER_LONG_LONG - 4))
+#define PFN_FLAGS_TRACE \
+ { PFN_SG_CHAIN, "SG_CHAIN" }, \
+ { PFN_SG_LAST, "SG_LAST" }, \
+ { PFN_DEV, "DEV" }, \
+ { PFN_MAP, "MAP" }
+
static inline pfn_t __pfn_to_pfn_t(unsigned long pfn, u64 flags)
{
pfn_t pfn_t = { .val = pfn | (flags & PFN_FLAGS_MASK), };
diff --git a/include/trace/events/fs_dax.h b/include/trace/events/fs_dax.h
index 9f0a455..7d0ea33 100644
--- a/include/trace/events/fs_dax.h
+++ b/include/trace/events/fs_dax.h
@@ -104,6 +104,57 @@ DEFINE_EVENT(dax_pmd_load_hole_class, name, \
DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole);
DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback);
+DECLARE_EVENT_CLASS(dax_pmd_insert_mapping_class,
+ TP_PROTO(struct inode *inode, struct vm_area_struct *vma,
+ unsigned long address, int write, long length, pfn_t pfn,
+ void *radix_entry),
+ TP_ARGS(inode, vma, address, write, length, pfn, radix_entry),
+ TP_STRUCT__entry(
+ __field(dev_t, dev)
+ __field(unsigned long, ino)
+ __field(unsigned long, vm_flags)
+ __field(unsigned long, address)
+ __field(int, write)
+ __field(long, length)
+ __field(u64, pfn_val)
+ __field(void *, radix_entry)
+ ),
+ TP_fast_assign(
+ __entry->dev = inode->i_sb->s_dev;
+ __entry->ino = inode->i_ino;
+ __entry->vm_flags = vma->vm_flags;
+ __entry->address = address;
+ __entry->write = write;
+ __entry->length = length;
+ __entry->pfn_val = pfn.val;
+ __entry->radix_entry = radix_entry;
+ ),
+ TP_printk("dev %d:%d ino %#lx %s %s address %#lx length %#lx "
+ "pfn %#llx %s radix_entry %#lx",
+ MAJOR(__entry->dev),
+ MINOR(__entry->dev),
+ __entry->ino,
+ __entry->vm_flags & VM_SHARED ? "shared" : "private",
+ __entry->write ? "write" : "read",
+ __entry->address,
+ __entry->length,
+ __entry->pfn_val & ~PFN_FLAGS_MASK,
+ __print_flags_u64(__entry->pfn_val & PFN_FLAGS_MASK, "|",
+ PFN_FLAGS_TRACE),
+ (unsigned long)__entry->radix_entry
+ )
+)
+
+#define DEFINE_PMD_INSERT_MAPPING_EVENT(name) \
+DEFINE_EVENT(dax_pmd_insert_mapping_class, name, \
+ TP_PROTO(struct inode *inode, struct vm_area_struct *vma, \
+ unsigned long address, int write, long length, pfn_t pfn, \
+ void *radix_entry), \
+ TP_ARGS(inode, vma, address, write, length, pfn, radix_entry))
+
+DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping);
+DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping_fallback);
+
#endif /* _TRACE_FS_DAX_H */
/* This part must be outside protection */
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Steven Rostedt <rostedt@goodmis.org> |
|---|---|
| Date | 2016-12-01 15:20 +0100 |
| Subject | Re: [PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() |
| Message-ID | <sJAno-4Xx-25@gated-at.bofh.it> |
| In reply to | #1533687 |
On Wed, 30 Nov 2016 16:45:33 -0700
Ross Zwisler <ross.zwisler@linux.intel.com> wrote:
> diff --git a/include/linux/pfn_t.h b/include/linux/pfn_t.h
> index a3d90b9..033fc7b 100644
> --- a/include/linux/pfn_t.h
> +++ b/include/linux/pfn_t.h
> @@ -15,6 +15,12 @@
> #define PFN_DEV (1ULL << (BITS_PER_LONG_LONG - 3))
> #define PFN_MAP (1ULL << (BITS_PER_LONG_LONG - 4))
>
> +#define PFN_FLAGS_TRACE \
> + { PFN_SG_CHAIN, "SG_CHAIN" }, \
> + { PFN_SG_LAST, "SG_LAST" }, \
> + { PFN_DEV, "DEV" }, \
> + { PFN_MAP, "MAP" }
> +
> static inline pfn_t __pfn_to_pfn_t(unsigned long pfn, u64 flags)
> {
> pfn_t pfn_t = { .val = pfn | (flags & PFN_FLAGS_MASK), };
> diff --git a/include/trace/events/fs_dax.h b/include/trace/events/fs_dax.h
> index 9f0a455..7d0ea33 100644
> --- a/include/trace/events/fs_dax.h
> +++ b/include/trace/events/fs_dax.h
> @@ -104,6 +104,57 @@ DEFINE_EVENT(dax_pmd_load_hole_class, name, \
> DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole);
> DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback);
>
> +DECLARE_EVENT_CLASS(dax_pmd_insert_mapping_class,
> + TP_PROTO(struct inode *inode, struct vm_area_struct *vma,
> + unsigned long address, int write, long length, pfn_t pfn,
> + void *radix_entry),
> + TP_ARGS(inode, vma, address, write, length, pfn, radix_entry),
> + TP_STRUCT__entry(
> + __field(dev_t, dev)
> + __field(unsigned long, ino)
> + __field(unsigned long, vm_flags)
> + __field(unsigned long, address)
> + __field(int, write)
Place "write" at the end. The ring buffer is 4 byte aligned, so on
archs that can access 8 bytes on 4 byte alignment, this will be packed
tighter. Otherwise, you'll get 4 empty bytes after "write".
-- Steve
> + __field(long, length)
> + __field(u64, pfn_val)
> + __field(void *, radix_entry)
> + ),
> + TP_fast_assign(
> + __entry->dev = inode->i_sb->s_dev;
> + __entry->ino = inode->i_ino;
> + __entry->vm_flags = vma->vm_flags;
> + __entry->address = address;
> + __entry->write = write;
> + __entry->length = length;
> + __entry->pfn_val = pfn.val;
> + __entry->radix_entry = radix_entry;
> + ),
> + TP_printk("dev %d:%d ino %#lx %s %s address %#lx length %#lx "
> + "pfn %#llx %s radix_entry %#lx",
> + MAJOR(__entry->dev),
> + MINOR(__entry->dev),
> + __entry->ino,
> + __entry->vm_flags & VM_SHARED ? "shared" : "private",
> + __entry->write ? "write" : "read",
> + __entry->address,
> + __entry->length,
> + __entry->pfn_val & ~PFN_FLAGS_MASK,
> + __print_flags_u64(__entry->pfn_val & PFN_FLAGS_MASK, "|",
> + PFN_FLAGS_TRACE),
> + (unsigned long)__entry->radix_entry
> + )
> +)
> +
> +#define DEFINE_PMD_INSERT_MAPPING_EVENT(name) \
> +DEFINE_EVENT(dax_pmd_insert_mapping_class, name, \
> + TP_PROTO(struct inode *inode, struct vm_area_struct *vma, \
> + unsigned long address, int write, long length, pfn_t pfn, \
> + void *radix_entry), \
> + TP_ARGS(inode, vma, address, write, length, pfn, radix_entry))
> +
> +DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping);
> +DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping_fallback);
> +
> #endif /* _TRACE_FS_DAX_H */
>
> /* This part must be outside protection */
[toc] | [prev] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2016-12-01 16:50 +0100 |
| Subject | Re: [PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() |
| Message-ID | <sJBMu-5TK-13@gated-at.bofh.it> |
| In reply to | #1534138 |
On Thu, Dec 01, 2016 at 09:19:30AM -0500, Steven Rostedt wrote:
> On Wed, 30 Nov 2016 16:45:33 -0700
> Ross Zwisler <ross.zwisler@linux.intel.com> wrote:
>
> > diff --git a/include/linux/pfn_t.h b/include/linux/pfn_t.h
> > index a3d90b9..033fc7b 100644
> > --- a/include/linux/pfn_t.h
> > +++ b/include/linux/pfn_t.h
> > @@ -15,6 +15,12 @@
> > #define PFN_DEV (1ULL << (BITS_PER_LONG_LONG - 3))
> > #define PFN_MAP (1ULL << (BITS_PER_LONG_LONG - 4))
> >
> > +#define PFN_FLAGS_TRACE \
> > + { PFN_SG_CHAIN, "SG_CHAIN" }, \
> > + { PFN_SG_LAST, "SG_LAST" }, \
> > + { PFN_DEV, "DEV" }, \
> > + { PFN_MAP, "MAP" }
> > +
> > static inline pfn_t __pfn_to_pfn_t(unsigned long pfn, u64 flags)
> > {
> > pfn_t pfn_t = { .val = pfn | (flags & PFN_FLAGS_MASK), };
> > diff --git a/include/trace/events/fs_dax.h b/include/trace/events/fs_dax.h
> > index 9f0a455..7d0ea33 100644
> > --- a/include/trace/events/fs_dax.h
> > +++ b/include/trace/events/fs_dax.h
> > @@ -104,6 +104,57 @@ DEFINE_EVENT(dax_pmd_load_hole_class, name, \
> > DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole);
> > DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback);
> >
> > +DECLARE_EVENT_CLASS(dax_pmd_insert_mapping_class,
> > + TP_PROTO(struct inode *inode, struct vm_area_struct *vma,
> > + unsigned long address, int write, long length, pfn_t pfn,
> > + void *radix_entry),
> > + TP_ARGS(inode, vma, address, write, length, pfn, radix_entry),
> > + TP_STRUCT__entry(
> > + __field(dev_t, dev)
> > + __field(unsigned long, ino)
> > + __field(unsigned long, vm_flags)
> > + __field(unsigned long, address)
> > + __field(int, write)
>
> Place "write" at the end. The ring buffer is 4 byte aligned, so on
> archs that can access 8 bytes on 4 byte alignment, this will be packed
> tighter. Otherwise, you'll get 4 empty bytes after "write".
Actually I think it may be ideal to stick it as the 2nd entry after 'dev'.
dev_t is:
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t dev_t;
So those two 32 bit values should combine into a single 64 bit space.
Thanks for the help, I obviously wasn't considering packing when ordering the
elements.
[toc] | [prev] | [next] | [standalone]
| From | Steven Rostedt <rostedt@goodmis.org> |
|---|---|
| Date | 2016-12-01 17:20 +0100 |
| Subject | Re: [PATCH v2 6/6] dax: add tracepoints to dax_pmd_insert_mapping() |
| Message-ID | <sJCfv-6mQ-7@gated-at.bofh.it> |
| In reply to | #1534226 |
On Thu, 1 Dec 2016 08:44:32 -0700 Ross Zwisler <ross.zwisler@linux.intel.com> wrote: > Actually I think it may be ideal to stick it as the 2nd entry after 'dev'. > dev_t is: > > typedef __u32 __kernel_dev_t; > typedef __kernel_dev_t dev_t; > > So those two 32 bit values should combine into a single 64 bit space. Yeah that should work too. -- Steve > > Thanks for the help, I obviously wasn't considering packing when ordering the > elements.
[toc] | [prev] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2016-12-01 00:50 +0100 |
| Subject | [PATCH v2 4/6] dax: update MAINTAINERS entries for FS DAX |
| Message-ID | <sJmNs-4n7-33@gated-at.bofh.it> |
| In reply to | #1533682 |
Add the new include/trace/events/fs_dax.h tracepoint header, the existing include/linux/dax.h header, update Matthew's email address and add myself as a maintainer for filesystem DAX. Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com> Suggested-by: Matthew Wilcox <mawilcox@microsoft.com> --- MAINTAINERS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 2a58eea..b93ea2a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3855,10 +3855,13 @@ S: Maintained F: drivers/i2c/busses/i2c-diolan-u2c.c DIRECT ACCESS (DAX) -M: Matthew Wilcox <willy@linux.intel.com> +M: Matthew Wilcox <mawilcox@microsoft.com> +M: Ross Zwisler <ross.zwisler@linux.intel.com> L: linux-fsdevel@vger.kernel.org S: Supported F: fs/dax.c +F: include/linux/dax.h +F: include/trace/events/fs_dax.h DIRECTORY NOTIFICATION (DNOTIFY) M: Eric Paris <eparis@parisplace.org> -- 2.7.4
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web