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).
Showing the changes to include/uapi (1 of 7 files). Show all
Unified · Split
| @@ -147,6 +147,9 @@ · 146 unmodified lines | |||
| 147 | 147 | ||
| 148 | #define SO_PASSRIGHTS 83 | 148 | #define SO_PASSRIGHTS 83 |
| 149 | 149 | ||
| 150 | #define SO_INQ 84 | ||
| 151 | #define SCM_INQ SO_INQ | ||
| 152 | |||
| 150 | #if !defined(__KERNEL__) | 153 | #if !defined(__KERNEL__) |
| 151 | 154 | ||
| 152 | #if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__)) | 155 | #if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__)) |