afs: Use ITER_XARRAY for writing
Use a single ITER_XARRAY iterator to describe the portion of a file to be transmitted to the server rather than generating a series of small ITER_BVEC iterators on the fly. This will make it easier to implement AIO in afs. In theory we could maybe use one giant ITER_BVEC, but that means potentially allocating a huge array of bio_vec structs (max 256 per page) when in fact the pagecache already has a structure listing all the relevant pages (radix_tree/xarray) that can be walked over. Signed-off-by: David Howells <dhowells@redhat.com> Tested-By: Marc Dionne <marc.dionne@auristor.com> cc: linux-afs@lists.infradead.org cc: linux-cachefs@redhat.com cc: linux-fsdevel@vger.kernel.org Link: https://lore.kernel.org/r/153685395197.14766.16289516750731233933.stgit@warthog.procyon.org.uk/ Link: https://lore.kernel.org/r/158861251312.340223.17924900795425422532.stgit@warthog.procyon.org.uk/ # rfc Link: https://lore.kernel.org/r/159465828607.1377938.6903132788463419368.stgit@warthog.procyon.org.uk/ Link: https://lore.kernel.org/r/160588535018.3465195.14509994354240338307.stgit@warthog.procyon.org.uk/ # rfc Link: https://lore.kernel.org/r/161118152415.1232039.6452879415814850025.stgit@warthog.procyon.org.uk/ # rfc Link: https://lore.kernel.org/r/161161048194.2537118.13763612220937637316.stgit@warthog.procyon.org.uk/ # v2 Link: https://lore.kernel.org/r/161340411602.1303470.4661108879482218408.stgit@warthog.procyon.org.uk/ # v3 Link: https://lore.kernel.org/r/161539555629.286939.5241869986617154517.stgit@warthog.procyon.org.uk/ # v4 Link: https://lore.kernel.org/r/161653811456.2770958.7017388543246759245.stgit@warthog.procyon.org.uk/ # v5 Link: https://lore.kernel.org/r/161789095005.6155.6789055030327407928.stgit@warthog.procyon.org.uk/ # v6
This commit is contained in:
@@ -886,65 +886,52 @@ TRACE_EVENT(afs_call_done,
|
||||
__entry->rx_call)
|
||||
);
|
||||
|
||||
TRACE_EVENT(afs_send_pages,
|
||||
TP_PROTO(struct afs_call *call, struct msghdr *msg,
|
||||
pgoff_t first, pgoff_t last, unsigned int offset),
|
||||
TRACE_EVENT(afs_send_data,
|
||||
TP_PROTO(struct afs_call *call, struct msghdr *msg),
|
||||
|
||||
TP_ARGS(call, msg, first, last, offset),
|
||||
TP_ARGS(call, msg),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, call )
|
||||
__field(pgoff_t, first )
|
||||
__field(pgoff_t, last )
|
||||
__field(unsigned int, nr )
|
||||
__field(unsigned int, bytes )
|
||||
__field(unsigned int, offset )
|
||||
__field(unsigned int, flags )
|
||||
__field(loff_t, offset )
|
||||
__field(loff_t, count )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->call = call->debug_id;
|
||||
__entry->first = first;
|
||||
__entry->last = last;
|
||||
__entry->nr = msg->msg_iter.nr_segs;
|
||||
__entry->bytes = msg->msg_iter.count;
|
||||
__entry->offset = offset;
|
||||
__entry->flags = msg->msg_flags;
|
||||
__entry->offset = msg->msg_iter.xarray_start + msg->msg_iter.iov_offset;
|
||||
__entry->count = iov_iter_count(&msg->msg_iter);
|
||||
),
|
||||
|
||||
TP_printk(" c=%08x %lx-%lx-%lx b=%x o=%x f=%x",
|
||||
__entry->call,
|
||||
__entry->first, __entry->first + __entry->nr - 1, __entry->last,
|
||||
__entry->bytes, __entry->offset,
|
||||
TP_printk(" c=%08x o=%llx n=%llx f=%x",
|
||||
__entry->call, __entry->offset, __entry->count,
|
||||
__entry->flags)
|
||||
);
|
||||
|
||||
TRACE_EVENT(afs_sent_pages,
|
||||
TP_PROTO(struct afs_call *call, pgoff_t first, pgoff_t last,
|
||||
pgoff_t cursor, int ret),
|
||||
TRACE_EVENT(afs_sent_data,
|
||||
TP_PROTO(struct afs_call *call, struct msghdr *msg, int ret),
|
||||
|
||||
TP_ARGS(call, first, last, cursor, ret),
|
||||
TP_ARGS(call, msg, ret),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, call )
|
||||
__field(pgoff_t, first )
|
||||
__field(pgoff_t, last )
|
||||
__field(pgoff_t, cursor )
|
||||
__field(int, ret )
|
||||
__field(loff_t, offset )
|
||||
__field(loff_t, count )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->call = call->debug_id;
|
||||
__entry->first = first;
|
||||
__entry->last = last;
|
||||
__entry->cursor = cursor;
|
||||
__entry->ret = ret;
|
||||
__entry->offset = msg->msg_iter.xarray_start + msg->msg_iter.iov_offset;
|
||||
__entry->count = iov_iter_count(&msg->msg_iter);
|
||||
),
|
||||
|
||||
TP_printk(" c=%08x %lx-%lx c=%lx r=%d",
|
||||
__entry->call,
|
||||
__entry->first, __entry->last,
|
||||
__entry->cursor, __entry->ret)
|
||||
TP_printk(" c=%08x o=%llx n=%llx r=%x",
|
||||
__entry->call, __entry->offset, __entry->count,
|
||||
__entry->ret)
|
||||
);
|
||||
|
||||
TRACE_EVENT(afs_dir_check_failed,
|
||||
|
||||
Reference in New Issue
Block a user