Message ID | 20240606161219.2745817-2-ofir.gal@volumez.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3,1/4] net: introduce helper sendpages_ok() | expand |
On 06/06/2024 19:12, Ofir Gal wrote: > Network drivers are using sendpage_ok() to check the first page of an > iterator in order to disable MSG_SPLICE_PAGES. The iterator can > represent list of contiguous pages. > > When MSG_SPLICE_PAGES is enabled skb_splice_from_iter() is being used, > it requires all pages in the iterator to be sendable. Therefore it needs > to check that each page is sendable. > > The patch introduces a helper sendpages_ok(), it returns true if all the > contiguous pages are sendable. > > Drivers who want to send contiguous pages with MSG_SPLICE_PAGES may use > this helper to check whether the page list is OK. If the helper does not > return true, the driver should remove MSG_SPLICE_PAGES flag. > > Reviewed-by: Christoph Hellwig <hch@lst.de> > Signed-off-by: Ofir Gal <ofir.gal@volumez.com> > --- > include/linux/net.h | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/include/linux/net.h b/include/linux/net.h > index 688320b79fcc..421a6b5b9ad1 100644 > --- a/include/linux/net.h > +++ b/include/linux/net.h > @@ -322,6 +322,28 @@ static inline bool sendpage_ok(struct page *page) > return !PageSlab(page) && page_count(page) >= 1; > } > > +/* > + * Check sendpage_ok on contiguous pages. > + */ > +static inline bool sendpages_ok(struct page *page, size_t len, size_t offset) > +{ > + struct page *p; > + size_t count; > + > + p = page + (offset >> PAGE_SHIFT); > + > + count = 0; Assignment can move to the declaration. > + while (count < len) { > + if (!sendpage_ok(p)) > + return false; > + > + p++; > + count += PAGE_SIZE; > + } > + > + return true; > +} > + > int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, > size_t num, size_t len); > int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg, Other than that, Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
On 10/06/2024 13:05, Sagi Grimberg wrote: > > > On 06/06/2024 19:12, Ofir Gal wrote: >> Network drivers are using sendpage_ok() to check the first page of an >> iterator in order to disable MSG_SPLICE_PAGES. The iterator can >> represent list of contiguous pages. >> >> When MSG_SPLICE_PAGES is enabled skb_splice_from_iter() is being used, >> it requires all pages in the iterator to be sendable. Therefore it needs >> to check that each page is sendable. >> >> The patch introduces a helper sendpages_ok(), it returns true if all the >> contiguous pages are sendable. >> >> Drivers who want to send contiguous pages with MSG_SPLICE_PAGES may use >> this helper to check whether the page list is OK. If the helper does not >> return true, the driver should remove MSG_SPLICE_PAGES flag. >> >> Reviewed-by: Christoph Hellwig <hch@lst.de> >> Signed-off-by: Ofir Gal <ofir.gal@volumez.com> >> --- >> include/linux/net.h | 22 ++++++++++++++++++++++ >> 1 file changed, 22 insertions(+) >> >> diff --git a/include/linux/net.h b/include/linux/net.h >> index 688320b79fcc..421a6b5b9ad1 100644 >> --- a/include/linux/net.h >> +++ b/include/linux/net.h >> @@ -322,6 +322,28 @@ static inline bool sendpage_ok(struct page *page) >> return !PageSlab(page) && page_count(page) >= 1; >> } >> +/* >> + * Check sendpage_ok on contiguous pages. >> + */ >> +static inline bool sendpages_ok(struct page *page, size_t len, size_t offset) >> +{ >> + struct page *p; >> + size_t count; >> + >> + p = page + (offset >> PAGE_SHIFT); >> + >> + count = 0; > > Assignment can move to the declaration. Applying to v4. > > >> + while (count < len) { >> + if (!sendpage_ok(p)) >> + return false; >> + >> + p++; >> + count += PAGE_SIZE; >> + } >> + >> + return true; >> +} >> + >> int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, >> size_t num, size_t len); >> int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg, > > Other than that, > > Reviewed-by: Sagi Grimberg <sagi@grimberg.me> Thanks for the review.
diff --git a/include/linux/net.h b/include/linux/net.h index 688320b79fcc..421a6b5b9ad1 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -322,6 +322,28 @@ static inline bool sendpage_ok(struct page *page) return !PageSlab(page) && page_count(page) >= 1; } +/* + * Check sendpage_ok on contiguous pages. + */ +static inline bool sendpages_ok(struct page *page, size_t len, size_t offset) +{ + struct page *p; + size_t count; + + p = page + (offset >> PAGE_SHIFT); + + count = 0; + while (count < len) { + if (!sendpage_ok(p)) + return false; + + p++; + count += PAGE_SIZE; + } + + return true; +} + int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, size_t num, size_t len); int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg,