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@xxxxxx> >> Signed-off-by: Ofir Gal <ofir.gal@xxxxxxxxxxx> >> --- >> 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@xxxxxxxxxxx> Thanks for the review.