Skip to content

Commit cadee54

Browse files
hartkoppgregkh
authored andcommitted
can: use skb hash instead of private variable in headroom
commit d4fb651 upstream. The can_skb_priv::skbcnt variable is used to identify CAN skbs in the RX path analogue to the skb->hash. As the skb hash is not filled in CAN skbs move the private skbcnt value to skb->hash and set skb->sw_hash accordingly. The skb->hash is a value used for RPS to identify skbs. Use it as intended. Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> Link: https://patch.msgid.link/20260201-can_skb_ext-v8-1-3635d790fe8b@hartkopp.net Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent eb6b775 commit cadee54

9 files changed

Lines changed: 15 additions & 19 deletions

File tree

drivers/net/can/dev/skb.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,6 @@ static void init_can_skb_reserve(struct sk_buff *skb)
202202
skb_reset_transport_header(skb);
203203

204204
can_skb_reserve(skb);
205-
can_skb_prv(skb)->skbcnt = 0;
206205
}
207206

208207
struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
@@ -312,7 +311,6 @@ static bool can_skb_headroom_valid(struct net_device *dev, struct sk_buff *skb)
312311
if (skb->ip_summed == CHECKSUM_NONE) {
313312
/* init headroom */
314313
can_skb_prv(skb)->ifindex = dev->ifindex;
315-
can_skb_prv(skb)->skbcnt = 0;
316314

317315
skb->ip_summed = CHECKSUM_UNNECESSARY;
318316

include/linux/can/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ extern void can_rx_unregister(struct net *net, struct net_device *dev,
5858
void *data);
5959

6060
extern int can_send(struct sk_buff *skb, int loop);
61+
void can_set_skb_uid(struct sk_buff *skb);
6162
void can_sock_destruct(struct sock *sk);
6263

6364
#endif /* !_CAN_CORE_H */

include/linux/can/skb.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,11 @@ bool can_dropped_invalid_skb(struct net_device *dev, struct sk_buff *skb);
4949
/**
5050
* struct can_skb_priv - private additional data inside CAN sk_buffs
5151
* @ifindex: ifindex of the first interface the CAN frame appeared on
52-
* @skbcnt: atomic counter to have an unique id together with skb pointer
5352
* @frame_len: length of CAN frame in data link layer
5453
* @cf: align to the following CAN frame at skb->data
5554
*/
5655
struct can_skb_priv {
5756
int ifindex;
58-
int skbcnt;
5957
unsigned int frame_len;
6058
struct can_frame cf[];
6159
};

net/can/af_can.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,16 @@ static int can_rcv_filter(struct can_dev_rcv_lists *dev_rcv_lists, struct sk_buf
640640
return matches;
641641
}
642642

643+
void can_set_skb_uid(struct sk_buff *skb)
644+
{
645+
/* create non-zero unique skb identifier together with *skb */
646+
while (!(skb->hash))
647+
skb->hash = atomic_inc_return(&skbcounter);
648+
649+
skb->sw_hash = 1;
650+
}
651+
EXPORT_SYMBOL(can_set_skb_uid);
652+
643653
static void can_receive(struct sk_buff *skb, struct net_device *dev)
644654
{
645655
struct can_dev_rcv_lists *dev_rcv_lists;
@@ -651,9 +661,7 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev)
651661
atomic_long_inc(&pkg_stats->rx_frames);
652662
atomic_long_inc(&pkg_stats->rx_frames_delta);
653663

654-
/* create non-zero unique skb identifier together with *skb */
655-
while (!(can_skb_prv(skb)->skbcnt))
656-
can_skb_prv(skb)->skbcnt = atomic_inc_return(&skbcounter);
664+
can_set_skb_uid(skb);
657665

658666
rcu_read_lock();
659667

net/can/bcm.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,6 @@ static void bcm_can_tx(struct bcm_op *op, struct canfd_frame *cf)
338338

339339
can_skb_reserve(skb);
340340
can_skb_prv(skb)->ifindex = dev->ifindex;
341-
can_skb_prv(skb)->skbcnt = 0;
342341

343342
skb_put_data(skb, cf, op->cfsiz);
344343

@@ -1582,7 +1581,6 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk,
15821581
}
15831582

15841583
can_skb_prv(skb)->ifindex = dev->ifindex;
1585-
can_skb_prv(skb)->skbcnt = 0;
15861584
skb->dev = dev;
15871585
can_skb_set_owner(skb, sk);
15881586
err = can_send(skb, 1); /* send with loopback */

net/can/isotp.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,6 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 flowstatus)
218218

219219
can_skb_reserve(nskb);
220220
can_skb_prv(nskb)->ifindex = dev->ifindex;
221-
can_skb_prv(nskb)->skbcnt = 0;
222221

223222
nskb->dev = dev;
224223
can_skb_set_owner(nskb, sk);
@@ -773,7 +772,6 @@ static void isotp_send_cframe(struct isotp_sock *so)
773772

774773
can_skb_reserve(skb);
775774
can_skb_prv(skb)->ifindex = dev->ifindex;
776-
can_skb_prv(skb)->skbcnt = 0;
777775

778776
cf = (struct canfd_frame *)skb->data;
779777
skb_put_zero(skb, so->ll.mtu);
@@ -1069,7 +1067,6 @@ static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
10691067

10701068
can_skb_reserve(skb);
10711069
can_skb_prv(skb)->ifindex = dev->ifindex;
1072-
can_skb_prv(skb)->skbcnt = 0;
10731070

10741071
so->tx.len = size;
10751072
so->tx.idx = 0;

net/can/j1939/socket.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,6 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_device *ndev,
889889

890890
can_skb_reserve(skb);
891891
can_skb_prv(skb)->ifindex = ndev->ifindex;
892-
can_skb_prv(skb)->skbcnt = 0;
893892
skb_reserve(skb, offsetof(struct can_frame, data));
894893

895894
ret = memcpy_from_msg(skb_put(skb, size), msg, size);

net/can/j1939/transport.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,6 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv,
613613
skb->dev = priv->ndev;
614614
can_skb_reserve(skb);
615615
can_skb_prv(skb)->ifindex = priv->ndev->ifindex;
616-
can_skb_prv(skb)->skbcnt = 0;
617616
/* reserve CAN header */
618617
skb_reserve(skb, offsetof(struct can_frame, data));
619618

@@ -1553,7 +1552,6 @@ j1939_session *j1939_session_fresh_new(struct j1939_priv *priv,
15531552
skb->dev = priv->ndev;
15541553
can_skb_reserve(skb);
15551554
can_skb_prv(skb)->ifindex = priv->ndev->ifindex;
1556-
can_skb_prv(skb)->skbcnt = 0;
15571555
skcb = j1939_skb_to_cb(skb);
15581556
memcpy(skcb, rel_skcb, sizeof(*skcb));
15591557

net/can/raw.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ MODULE_ALIAS("can-proto-1");
7575
*/
7676

7777
struct uniqframe {
78-
int skbcnt;
7978
const struct sk_buff *skb;
79+
u32 hash;
8080
unsigned int join_rx_count;
8181
};
8282

@@ -140,7 +140,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
140140

141141
/* eliminate multiple filter matches for the same skb */
142142
if (this_cpu_ptr(ro->uniq)->skb == oskb &&
143-
this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
143+
this_cpu_ptr(ro->uniq)->hash == oskb->hash) {
144144
if (!ro->join_filters)
145145
return;
146146

@@ -150,7 +150,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
150150
return;
151151
} else {
152152
this_cpu_ptr(ro->uniq)->skb = oskb;
153-
this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;
153+
this_cpu_ptr(ro->uniq)->hash = oskb->hash;
154154
this_cpu_ptr(ro->uniq)->join_rx_count = 1;
155155
/* drop first frame to check all enabled filters? */
156156
if (ro->join_filters && ro->count > 1)
@@ -870,7 +870,6 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
870870

871871
can_skb_reserve(skb);
872872
can_skb_prv(skb)->ifindex = dev->ifindex;
873-
can_skb_prv(skb)->skbcnt = 0;
874873

875874
/* fill the skb before testing for valid CAN frames */
876875
err = memcpy_from_msg(skb_put(skb, size), msg, size);

0 commit comments

Comments
 (0)