Skip to content

Commit 7d4194a

Browse files
Coly Lidavem330
authored andcommitted
nvme-tcp: check page by sendpage_ok() before calling kernel_sendpage()
Currently nvme_tcp_try_send_data() doesn't use kernel_sendpage() to send slab pages. But for pages allocated by __get_free_pages() without __GFP_COMP, which also have refcount as 0, they are still sent by kernel_sendpage() to remote end, this is problematic. The new introduced helper sendpage_ok() checks both PageSlab tag and page_count counter, and returns true if the checking page is OK to be sent by kernel_sendpage(). This patch fixes the page checking issue of nvme_tcp_try_send_data() with sendpage_ok(). If sendpage_ok() returns true, send this page by kernel_sendpage(), otherwise use sock_no_sendpage to handle this page. Signed-off-by: Coly Li <colyli@suse.de> Cc: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Hannes Reinecke <hare@suse.de> Cc: Jan Kara <jack@suse.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Mikhail Skorzhinskii <mskorzhinskiy@solarflare.com> Cc: Philipp Reisner <philipp.reisner@linbit.com> Cc: Sagi Grimberg <sagi@grimberg.me> Cc: Vlastimil Babka <vbabka@suse.com> Cc: stable@vger.kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 7b62d31 commit 7d4194a

1 file changed

Lines changed: 3 additions & 4 deletions

File tree

drivers/nvme/host/tcp.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -913,12 +913,11 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
913913
else
914914
flags |= MSG_MORE | MSG_SENDPAGE_NOTLAST;
915915

916-
/* can't zcopy slab pages */
917-
if (unlikely(PageSlab(page))) {
918-
ret = sock_no_sendpage(queue->sock, page, offset, len,
916+
if (sendpage_ok(page)) {
917+
ret = kernel_sendpage(queue->sock, page, offset, len,
919918
flags);
920919
} else {
921-
ret = kernel_sendpage(queue->sock, page, offset, len,
920+
ret = sock_no_sendpage(queue->sock, page, offset, len,
922921
flags);
923922
}
924923
if (ret <= 0)

0 commit comments

Comments
 (0)