Message ID | 20230712161513.134860-6-aaptel@nvidia.com (mailing list archive) |
---|---|
State | RFC |
Headers | show |
Series | nvme-tcp receive offloads | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply, async |
On 12/07/2023 19:14, Aurelien Aptel wrote: > From: Ben Ben-Ishay <benishay@nvidia.com> > > When using direct data placement (DDP) the NIC could write the payload > directly into the destination buffer and constructs SKBs such that > they point to this data. To skip copies when SKB data already resides > in the destination buffer we check if (src == dst), and skip the copy > when it's true. > > Signed-off-by: Ben Ben-Ishay <benishay@nvidia.com> > Signed-off-by: Boris Pismenny <borisp@nvidia.com> > Signed-off-by: Or Gerlitz <ogerlitz@nvidia.com> > Signed-off-by: Yoray Zack <yorayz@nvidia.com> > Signed-off-by: Shai Malin <smalin@nvidia.com> > Signed-off-by: Aurelien Aptel <aaptel@nvidia.com> > Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> > --- > lib/iov_iter.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/lib/iov_iter.c b/lib/iov_iter.c > index b667b1e2f688..1c9b10e1e1c8 100644 > --- a/lib/iov_iter.c > +++ b/lib/iov_iter.c > @@ -313,9 +313,15 @@ size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) > return 0; > if (user_backed_iter(i)) > might_fault(); > + /* > + * When using direct data placement (DDP) the hardware writes > + * data directly to the destination buffer, and constructs > + * IOVs such that they point to this data. > + * Thus, when the src == dst we skip the memcpy. > + */ > iterate_and_advance(i, bytes, base, len, off, > copyout(base, addr + off, len), > - memcpy(base, addr + off, len) > + (base != addr + off) && memcpy(base, addr + off, len) > ) > > return bytes; Looks good, Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
diff --git a/lib/iov_iter.c b/lib/iov_iter.c index b667b1e2f688..1c9b10e1e1c8 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -313,9 +313,15 @@ size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) return 0; if (user_backed_iter(i)) might_fault(); + /* + * When using direct data placement (DDP) the hardware writes + * data directly to the destination buffer, and constructs + * IOVs such that they point to this data. + * Thus, when the src == dst we skip the memcpy. + */ iterate_and_advance(i, bytes, base, len, off, copyout(base, addr + off, len), - memcpy(base, addr + off, len) + (base != addr + off) && memcpy(base, addr + off, len) ) return bytes;