]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: change sock_queue_rcv_skb_reason() to return a drop_reason
authorEric Dumazet <edumazet@google.com>
Thu, 9 Apr 2026 14:56:20 +0000 (14:56 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sun, 12 Apr 2026 21:30:25 +0000 (14:30 -0700)
Change sock_queue_rcv_skb_reason() to return the drop_reason directly
instead of using a reference.

This is part of an effort to remove stack canaries and reduce bloat.

$ scripts/bloat-o-meter -t vmlinux.old vmlinux.new
add/remove: 0/0 grow/shrink: 3/7 up/down: 79/-301 (-222)
Function                                     old     new   delta
vsock_queue_rcv_skb                           50      79     +29
ipmr_cache_report                           1290    1315     +25
ip6mr_cache_report                          1322    1347     +25
packet_rcv_spkt                              329     327      -2
sock_queue_rcv_skb_reason                    166     128     -38
raw_rcv_skb                                  122      80     -42
ping_queue_rcv_skb                           109      61     -48
ping_rcv                                     215     162     -53
rawv6_rcv_skb                                278     224     -54
raw_rcv                                      591     527     -64
Total: Before=29722890, After=29722668, chg -0.00%

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260409145625.2306224-2-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/sock.h
net/can/bcm.c
net/can/isotp.c
net/can/j1939/socket.c
net/can/raw.c
net/core/sock.c
net/ipv4/ping.c
net/ipv4/raw.c
net/ipv6/raw.c

index 7d51ac9e7d9a87a7f6f0453a3d3e2c6ed34dc151..5831a4d1ebe77e3d6f568d208fafb072f9635242 100644 (file)
@@ -2502,12 +2502,23 @@ int __sk_queue_drop_skb(struct sock *sk, struct sk_buff_head *sk_queue,
                                           struct sk_buff *skb));
 int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
 
-int sock_queue_rcv_skb_reason(struct sock *sk, struct sk_buff *skb,
-                             enum skb_drop_reason *reason);
+enum skb_drop_reason
+sock_queue_rcv_skb_reason(struct sock *sk, struct sk_buff *skb);
 
 static inline int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 {
-       return sock_queue_rcv_skb_reason(sk, skb, NULL);
+       enum skb_drop_reason drop_reason = sock_queue_rcv_skb_reason(sk, skb);
+
+       switch (drop_reason) {
+       case SKB_DROP_REASON_SOCKET_RCVBUFF:
+               return -ENOMEM;
+       case SKB_DROP_REASON_PROTO_MEM:
+               return -ENOBUFS;
+       case 0:
+               return 0;
+       default:
+               return -EPERM;
+       }
 }
 
 int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb);
index fd9fa072881e22ced725fa77dd096dea07fb73a6..d6291381afb09c36b30557f1d1a328c9ed0579f7 100644 (file)
@@ -363,7 +363,6 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
        struct sockaddr_can *addr;
        struct sock *sk = op->sk;
        unsigned int datalen = head->nframes * op->cfsiz;
-       int err;
        unsigned int *pflags;
        enum skb_drop_reason reason;
 
@@ -420,8 +419,8 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
        addr->can_family  = AF_CAN;
        addr->can_ifindex = op->rx_ifindex;
 
-       err = sock_queue_rcv_skb_reason(sk, skb, &reason);
-       if (err < 0) {
+       reason = sock_queue_rcv_skb_reason(sk, skb);
+       if (reason) {
                struct bcm_sock *bo = bcm_sk(sk);
 
                sk_skb_reason_drop(sk, skb, reason);
index 2770f43f4951884658d54ac90bd1e0ae21c24102..c48b4a818297e2a1348a2b64016d0f4ff613e683 100644 (file)
@@ -291,7 +291,8 @@ static void isotp_rcv_skb(struct sk_buff *skb, struct sock *sk)
        addr->can_family = AF_CAN;
        addr->can_ifindex = skb->dev->ifindex;
 
-       if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0)
+       reason = sock_queue_rcv_skb_reason(sk, skb);
+       if (reason)
                sk_skb_reason_drop(sk, skb, reason);
 }
 
index 0502b030d23851652be252f1342861332ce97367..50a598ef5fd4a5f5e007816a341e04ddbcc724e6 100644 (file)
@@ -333,7 +333,8 @@ static void j1939_sk_recv_one(struct j1939_sock *jsk, struct sk_buff *oskb)
        if (skb->sk)
                skcb->msg_flags |= MSG_DONTROUTE;
 
-       if (sock_queue_rcv_skb_reason(&jsk->sk, skb, &reason) < 0)
+       reason = sock_queue_rcv_skb_reason(&jsk->sk, skb);
+       if (reason)
                sk_skb_reason_drop(&jsk->sk, skb, reason);
 }
 
index eee244ffc31ecc0e1cc1aae29cd1d13a4e6b54ca..56c95c768778accaec42cb998c7d679a42c85894 100644 (file)
@@ -207,7 +207,8 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
        if (oskb->sk == sk)
                *pflags |= MSG_CONFIRM;
 
-       if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0)
+       reason = sock_queue_rcv_skb_reason(sk, skb);
+       if (reason)
                sk_skb_reason_drop(sk, skb, reason);
 }
 
index e821b95e00151ab6b4be89209abcbaa494234433..d39a4d6ccafd9e03f4e82482d3f3e46ce5d58771 100644 (file)
@@ -520,32 +520,24 @@ int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 }
 EXPORT_SYMBOL(__sock_queue_rcv_skb);
 
-int sock_queue_rcv_skb_reason(struct sock *sk, struct sk_buff *skb,
-                             enum skb_drop_reason *reason)
+enum skb_drop_reason
+sock_queue_rcv_skb_reason(struct sock *sk, struct sk_buff *skb)
 {
        enum skb_drop_reason drop_reason;
        int err;
 
        err = sk_filter_reason(sk, skb, &drop_reason);
        if (err)
-               goto out;
+               return drop_reason;
 
        err = __sock_queue_rcv_skb(sk, skb);
        switch (err) {
        case -ENOMEM:
-               drop_reason = SKB_DROP_REASON_SOCKET_RCVBUFF;
-               break;
+               return SKB_DROP_REASON_SOCKET_RCVBUFF;
        case -ENOBUFS:
-               drop_reason = SKB_DROP_REASON_PROTO_MEM;
-               break;
-       default:
-               drop_reason = SKB_NOT_DROPPED_YET;
-               break;
+               return SKB_DROP_REASON_PROTO_MEM;
        }
-out:
-       if (reason)
-               *reason = drop_reason;
-       return err;
+       return SKB_NOT_DROPPED_YET;
 }
 EXPORT_SYMBOL(sock_queue_rcv_skb_reason);
 
index bda245c808938cf2a26270bcd83c74898e5b36dd..1273d1028ed9ca91734481f65652bfc43efd039a 100644 (file)
@@ -935,7 +935,8 @@ static enum skb_drop_reason __ping_queue_rcv_skb(struct sock *sk,
 
        pr_debug("ping_queue_rcv_skb(sk=%p,sk->num=%d,skb=%p)\n",
                 inet_sk(sk), inet_sk(sk)->inet_num, skb);
-       if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0) {
+       reason = sock_queue_rcv_skb_reason(sk, skb);
+       if (reason) {
                sk_skb_reason_drop(sk, skb, reason);
                pr_debug("ping_queue_rcv_skb -> failed\n");
                return reason;
index 34859e537b4926f15996dd1a684ae59a55a1643a..319428bf06bb89932c0b4295a0f96c275f8ecab1 100644 (file)
@@ -300,7 +300,8 @@ static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)
        /* Charge it to the socket. */
 
        ipv4_pktinfo_prepare(sk, skb, true);
-       if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0) {
+       reason = sock_queue_rcv_skb_reason(sk, skb);
+       if (reason) {
                sk_skb_reason_drop(sk, skb, reason);
                return NET_RX_DROP;
        }
index 0ac7046911000d30056e0d1f49a58964c61308cf..3cc58698cbbd3a16cf0145e0afff7a6cec8dc56f 100644 (file)
@@ -369,7 +369,8 @@ static inline int rawv6_rcv_skb(struct sock *sk, struct sk_buff *skb)
 
        /* Charge it to the socket. */
        skb_dst_drop(skb);
-       if (sock_queue_rcv_skb_reason(sk, skb, &reason) < 0) {
+       reason = sock_queue_rcv_skb_reason(sk, skb);
+       if (reason) {
                sk_skb_reason_drop(sk, skb, reason);
                return NET_RX_DROP;
        }