Commit 4d1c7d87 authored by Miquel Raynal's avatar Miquel Raynal Committed by Stefan Schmidt

mac802154: Move an skb free within the rx path

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: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Acked-by: default avatarAlexander Aring <aahringo@redhat.com>
Link: https://lore.kernel.org/r/20221026093502.602734-2-miquel.raynal@bootlin.comSigned-off-by: default avatarStefan Schmidt <stefan@datenfreihafen.org>
parent 95d9a3da
...@@ -234,8 +234,6 @@ __ieee802154_rx_handle_packet(struct ieee802154_local *local, ...@@ -234,8 +234,6 @@ __ieee802154_rx_handle_packet(struct ieee802154_local *local,
skb = NULL; skb = NULL;
break; break;
} }
kfree_skb(skb);
} }
static void static void
...@@ -274,7 +272,7 @@ void ieee802154_rx(struct ieee802154_local *local, struct sk_buff *skb) ...@@ -274,7 +272,7 @@ void ieee802154_rx(struct ieee802154_local *local, struct sk_buff *skb)
WARN_ON_ONCE(softirq_count() == 0); WARN_ON_ONCE(softirq_count() == 0);
if (local->suspended) if (local->suspended)
goto drop; goto free_skb;
/* TODO: When a transceiver omits the checksum here, we /* TODO: When a transceiver omits the checksum here, we
* add an own calculated one. This is currently an ugly * 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) ...@@ -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 */ /* Level 1 filtering: Check the FCS by software when relevant */
if (local->hw.phy->filtering == IEEE802154_FILTERING_NONE) { if (local->hw.phy->filtering == IEEE802154_FILTERING_NONE) {
crc = crc_ccitt(0, skb->data, skb->len); crc = crc_ccitt(0, skb->data, skb->len);
if (crc) { if (crc)
rcu_read_unlock();
goto drop; goto drop;
} }
}
/* remove crc */ /* remove crc */
skb_trim(skb, skb->len - 2); skb_trim(skb, skb->len - 2);
__ieee802154_rx_handle_packet(local, skb); __ieee802154_rx_handle_packet(local, skb);
rcu_read_unlock();
return;
drop: drop:
rcu_read_unlock();
free_skb:
kfree_skb(skb); kfree_skb(skb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment