Commit 8f0b3cc9 authored by Mina Almasry's avatar Mina Almasry Committed by Jakub Kicinski
Browse files

tcp: RX path for devmem TCP



In tcp_recvmsg_locked(), detect if the skb being received by the user
is a devmem skb. In this case - if the user provided the MSG_SOCK_DEVMEM
flag - pass it to tcp_recvmsg_devmem() for custom handling.

tcp_recvmsg_devmem() copies any data in the skb header to the linear
buffer, and returns a cmsg to the user indicating the number of bytes
returned in the linear buffer.

tcp_recvmsg_devmem() then loops over the unaccessible devmem skb frags,
and returns to the user a cmsg_devmem indicating the location of the
data in the dmabuf device memory. cmsg_devmem contains this information:

1. the offset into the dmabuf where the payload starts. 'frag_offset'.
2. the size of the frag. 'frag_size'.
3. an opaque token 'frag_token' to return to the kernel when the buffer
is to be released.

The pages awaiting freeing are stored in the newly added
sk->sk_user_frags, and each page passed to userspace is get_page()'d.
This reference is dropped once the userspace indicates that it is
done reading this page.  All pages are released when the socket is
destroyed.

Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarKaiyuan Zhang <kaiyuanz@google.com>
Signed-off-by: default avatarMina Almasry <almasrymina@google.com>
Reviewed-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20240910171458.219195-10-almasrymina@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 65249feb
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -140,6 +140,11 @@
#define SO_PASSPIDFD		76
#define SO_PEERPIDFD		77

#define SO_DEVMEM_LINEAR	78
#define SCM_DEVMEM_LINEAR	SO_DEVMEM_LINEAR
#define SO_DEVMEM_DMABUF	79
#define SCM_DEVMEM_DMABUF	SO_DEVMEM_DMABUF

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+5 −0
Original line number Diff line number Diff line
@@ -151,6 +151,11 @@
#define SO_PASSPIDFD		76
#define SO_PEERPIDFD		77

#define SO_DEVMEM_LINEAR	78
#define SCM_DEVMEM_LINEAR	SO_DEVMEM_LINEAR
#define SO_DEVMEM_DMABUF	79
#define SCM_DEVMEM_DMABUF	SO_DEVMEM_DMABUF

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+5 −0
Original line number Diff line number Diff line
@@ -132,6 +132,11 @@
#define SO_PASSPIDFD		0x404A
#define SO_PEERPIDFD		0x404B

#define SO_DEVMEM_LINEAR	78
#define SCM_DEVMEM_LINEAR	SO_DEVMEM_LINEAR
#define SO_DEVMEM_DMABUF	79
#define SCM_DEVMEM_DMABUF	SO_DEVMEM_DMABUF

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+5 −0
Original line number Diff line number Diff line
@@ -133,6 +133,11 @@
#define SO_PASSPIDFD             0x0055
#define SO_PEERPIDFD             0x0056

#define SO_DEVMEM_LINEAR         0x0057
#define SCM_DEVMEM_LINEAR        SO_DEVMEM_LINEAR
#define SO_DEVMEM_DMABUF         0x0058
#define SCM_DEVMEM_DMABUF        SO_DEVMEM_DMABUF

#if !defined(__KERNEL__)


+1 −0
Original line number Diff line number Diff line
@@ -327,6 +327,7 @@ struct ucred {
					  * plain text and require encryption
					  */

#define MSG_SOCK_DEVMEM 0x2000000	/* Receive devmem skbs as cmsg */
#define MSG_ZEROCOPY	0x4000000	/* Use user data in kernel path */
#define MSG_SPLICE_PAGES 0x8000000	/* Splice the pages from the iterator in sendmsg() */
#define MSG_FASTOPEN	0x20000000	/* Send data in TCP SYN */
Loading