can: omit unneeded skb_clone() calls
The AF_CAN core delivered always cloned sk_buffs to the AF_CAN protocols, although this was _only_ needed by the can-raw protocol. With this (additionally documented) change, the AF_CAN core calls the callback functions of the registered AF_CAN protocols with the original (uncloned) sk_buff pointer and let's the can-raw protocol do the skb_clone() itself which omits all unneeded skb_clone() calls for other AF_CAN protocols. Signed-off-by: Oliver Hartkopp <oliver@hartkopp.net> Signed-off-by: Urs Thuermann <urs.thuermann@volkswagen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
98658bc9dc
commit
1fa17d4ba4
@@ -414,6 +414,12 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
|
||||
* The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
|
||||
* filter for error frames (CAN_ERR_FLAG bit set in mask).
|
||||
*
|
||||
* The provided pointer to the sk_buff is guaranteed to be valid as long as
|
||||
* the callback function is running. The callback function must *not* free
|
||||
* the given sk_buff while processing it's task. When the given sk_buff is
|
||||
* needed after the end of the callback function it must be cloned inside
|
||||
* the callback function with skb_clone().
|
||||
*
|
||||
* Return:
|
||||
* 0 on success
|
||||
* -ENOMEM on missing cache mem to create subscription entry
|
||||
@@ -569,13 +575,8 @@ EXPORT_SYMBOL(can_rx_unregister);
|
||||
|
||||
static inline void deliver(struct sk_buff *skb, struct receiver *r)
|
||||
{
|
||||
struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
|
||||
|
||||
if (clone) {
|
||||
clone->sk = skb->sk;
|
||||
r->func(clone, r->data);
|
||||
r->matches++;
|
||||
}
|
||||
r->func(skb, r->data);
|
||||
r->matches++;
|
||||
}
|
||||
|
||||
static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb)
|
||||
|
Reference in New Issue
Block a user