Commit df30285b authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Jakub Kicinski
Browse files

af_unix: Introduce SO_INQ.



We have an application that uses almost the same code for TCP and
AF_UNIX (SOCK_STREAM).

TCP can use TCP_INQ, but AF_UNIX doesn't have it and requires an
extra syscall, ioctl(SIOCINQ) or getsockopt(SO_MEMINFO) as an
alternative.

Let's introduce the generic version of TCP_INQ.

If SO_INQ is enabled, recvmsg() will put a cmsg of SCM_INQ that
contains the exact value of ioctl(SIOCINQ).  The cmsg is also
included when msg->msg_get_inq is non-zero to make sockets
io_uring-friendly.

Note that SOCK_CUSTOM_SOCKOPT is flagged only for SOCK_STREAM to
override setsockopt() for SOL_SOCKET.

By having the flag in struct unix_sock, instead of struct sock, we
can later add SO_INQ support for TCP and reuse tcp_sk(sk)->recvmsg_inq.

Note also that supporting custom getsockopt() for SOL_SOCKET will need
preparation for other SOCK_CUSTOM_SOCKOPT users (UDP, vsock, MPTCP).

Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@google.com>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20250702223606.1054680-7-kuniyu@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 8b77338e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -152,6 +152,9 @@

#define SO_PASSRIGHTS		83

#define SO_INQ			84
#define SCM_INQ			SO_INQ

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+3 −0
Original line number Diff line number Diff line
@@ -163,6 +163,9 @@

#define SO_PASSRIGHTS		83

#define SO_INQ			84
#define SCM_INQ			SO_INQ

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+3 −0
Original line number Diff line number Diff line
@@ -144,6 +144,9 @@

#define SO_PASSRIGHTS		0x4051

#define SO_INQ			0x4052
#define SCM_INQ			SO_INQ

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+3 −0
Original line number Diff line number Diff line
@@ -145,6 +145,9 @@

#define SO_PASSRIGHTS            0x005c

#define SO_INQ                   0x005d
#define SCM_INQ                  SO_INQ

#if !defined(__KERNEL__)


+1 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ struct unix_sock {
	wait_queue_entry_t	peer_wake;
	struct scm_stat		scm_stat;
	int			inq_len;
	bool			recvmsg_inq;
#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
	struct sk_buff		*oob_skb;
#endif
Loading