mac802154: Move an skb free within the rx path
authorMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 26 Oct 2022 09:35:00 +0000 (11:35 +0200)
committerStefan Schmidt <stefan@datenfreihafen.org>
Tue, 1 Nov 2022 10:22:54 +0000 (11:22 +0100)
It may appear clearer to free the skb at the end of the path rather than
in the middle, within a helper.

Move kfree_skb() from the end of __ieee802154_rx_handle_packet() to
right after it in the calling function ieee802154_rx(). Doing so implies
reworking a little bit the exit path.

Suggested-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Acked-by: Alexander Aring <aahringo@redhat.com>
Link: https://lore.kernel.org/r/20221026093502.602734-2-miquel.raynal@bootlin.com
Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
net/mac802154/rx.c

index 2ae23a2..499f71d 100644 (file)
@@ -234,8 +234,6 @@ __ieee802154_rx_handle_packet(struct ieee802154_local *local,
                skb = NULL;
                break;
        }
-
-       kfree_skb(skb);
 }
 
 static void
@@ -274,7 +272,7 @@ void ieee802154_rx(struct ieee802154_local *local, struct sk_buff *skb)
        WARN_ON_ONCE(softirq_count() == 0);
 
        if (local->suspended)
-               goto drop;
+               goto free_skb;
 
        /* TODO: When a transceiver omits the checksum here, we
         * add an own calculated one. This is currently an ugly
@@ -292,20 +290,17 @@ void ieee802154_rx(struct ieee802154_local *local, struct sk_buff *skb)
        /* Level 1 filtering: Check the FCS by software when relevant */
        if (local->hw.phy->filtering == IEEE802154_FILTERING_NONE) {
                crc = crc_ccitt(0, skb->data, skb->len);
-               if (crc) {
-                       rcu_read_unlock();
+               if (crc)
                        goto drop;
-               }
        }
        /* remove crc */
        skb_trim(skb, skb->len - 2);
 
        __ieee802154_rx_handle_packet(local, skb);
 
-       rcu_read_unlock();
-
-       return;
 drop:
+       rcu_read_unlock();
+free_skb:
        kfree_skb(skb);
 }