Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

af_unix: Move CINQ/COUTQ code to helpers

Currently tcp diag reports rqlen and wqlen values similar to how
the CINQ/COUTQ iotcls do. To make unix diag report these values
in the same way move the respective code into helpers.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Pavel Emelyanov and committed by
David S. Miller
885ee74d 257b5298

+39 -23
+3
include/net/af_unix.h
··· 66 66 67 67 #define peer_wait peer_wq.wait 68 68 69 + long unix_inq_len(struct sock *sk); 70 + long unix_outq_len(struct sock *sk); 71 + 69 72 #ifdef CONFIG_SYSCTL 70 73 extern int unix_sysctl_register(struct net *net); 71 74 extern void unix_sysctl_unregister(struct net *net);
+36 -23
net/unix/af_unix.c
··· 2065 2065 return 0; 2066 2066 } 2067 2067 2068 + long unix_inq_len(struct sock *sk) 2069 + { 2070 + struct sk_buff *skb; 2071 + long amount = 0; 2072 + 2073 + if (sk->sk_state == TCP_LISTEN) 2074 + return -EINVAL; 2075 + 2076 + spin_lock(&sk->sk_receive_queue.lock); 2077 + if (sk->sk_type == SOCK_STREAM || 2078 + sk->sk_type == SOCK_SEQPACKET) { 2079 + skb_queue_walk(&sk->sk_receive_queue, skb) 2080 + amount += skb->len; 2081 + } else { 2082 + skb = skb_peek(&sk->sk_receive_queue); 2083 + if (skb) 2084 + amount = skb->len; 2085 + } 2086 + spin_unlock(&sk->sk_receive_queue.lock); 2087 + 2088 + return amount; 2089 + } 2090 + EXPORT_SYMBOL_GPL(unix_inq_len); 2091 + 2092 + long unix_outq_len(struct sock *sk) 2093 + { 2094 + return sk_wmem_alloc_get(sk); 2095 + } 2096 + EXPORT_SYMBOL_GPL(unix_outq_len); 2097 + 2068 2098 static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 2069 2099 { 2070 2100 struct sock *sk = sock->sk; ··· 2103 2073 2104 2074 switch (cmd) { 2105 2075 case SIOCOUTQ: 2106 - amount = sk_wmem_alloc_get(sk); 2076 + amount = unix_outq_len(sk); 2107 2077 err = put_user(amount, (int __user *)arg); 2108 2078 break; 2109 2079 case SIOCINQ: 2110 - { 2111 - struct sk_buff *skb; 2112 - 2113 - if (sk->sk_state == TCP_LISTEN) { 2114 - err = -EINVAL; 2115 - break; 2116 - } 2117 - 2118 - spin_lock(&sk->sk_receive_queue.lock); 2119 - if (sk->sk_type == SOCK_STREAM || 2120 - sk->sk_type == SOCK_SEQPACKET) { 2121 - skb_queue_walk(&sk->sk_receive_queue, skb) 2122 - amount += skb->len; 2123 - } else { 2124 - skb = skb_peek(&sk->sk_receive_queue); 2125 - if (skb) 2126 - amount = skb->len; 2127 - } 2128 - spin_unlock(&sk->sk_receive_queue.lock); 2080 + amount = unix_inq_len(sk); 2081 + if (amount < 0) 2082 + err = amount; 2083 + else 2129 2084 err = put_user(amount, (int __user *)arg); 2130 - break; 2131 - } 2132 - 2085 + break; 2133 2086 default: 2134 2087 err = -ENOIOCTLCMD; 2135 2088 break;