Skip to content

Commit db6735e

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 efbb6ba commit db6735e

10 files changed

Lines changed: 15 additions & 21 deletions

File tree

‎drivers/net/can/dev/skb.c‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,6 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
203203

204204
can_skb_reserve(skb);
205205
can_skb_prv(skb)->ifindex = dev->ifindex;
206-
can_skb_prv(skb)->skbcnt = 0;
207206

208207
*cf = skb_put_zero(skb, sizeof(struct can_frame));
209208

@@ -234,7 +233,6 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev,
234233

235234
can_skb_reserve(skb);
236235
can_skb_prv(skb)->ifindex = dev->ifindex;
237-
can_skb_prv(skb)->skbcnt = 0;
238236

239237
*cfd = skb_put_zero(skb, sizeof(struct canfd_frame));
240238

‎drivers/net/can/slcan.c‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ static void slc_bump(struct slcan *sl)
213213

214214
can_skb_reserve(skb);
215215
can_skb_prv(skb)->ifindex = sl->dev->ifindex;
216-
can_skb_prv(skb)->skbcnt = 0;
217216

218217
skb_put_data(skb, &cf, sizeof(struct can_frame));
219218

‎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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,11 @@ struct sk_buff *alloc_can_err_skb(struct net_device *dev,
4343
/**
4444
* struct can_skb_priv - private additional data inside CAN sk_buffs
4545
* @ifindex: ifindex of the first interface the CAN frame appeared on
46-
* @skbcnt: atomic counter to have an unique id together with skb pointer
4746
* @frame_len: length of CAN frame in data link layer
4847
* @cf: align to the following CAN frame at skb->data
4948
*/
5049
struct can_skb_priv {
5150
int ifindex;
52-
int skbcnt;
5351
unsigned int frame_len;
5452
struct can_frame cf[];
5553
};
@@ -107,7 +105,6 @@ static inline bool can_skb_headroom_valid(struct net_device *dev,
107105
if (skb->ip_summed == CHECKSUM_NONE) {
108106
/* init headroom */
109107
can_skb_prv(skb)->ifindex = dev->ifindex;
110-
can_skb_prv(skb)->skbcnt = 0;
111108

112109
skb->ip_summed = CHECKSUM_UNNECESSARY;
113110

‎net/can/af_can.c‎

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

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

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

659667
rcu_read_lock();
660668

‎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

@@ -1577,7 +1576,6 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk,
15771576
}
15781577

15791578
can_skb_prv(skb)->ifindex = dev->ifindex;
1580-
can_skb_prv(skb)->skbcnt = 0;
15811579
skb->dev = dev;
15821580
can_skb_set_owner(skb, sk);
15831581
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
@@ -612,7 +612,6 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv,
612612
skb->dev = priv->ndev;
613613
can_skb_reserve(skb);
614614
can_skb_prv(skb)->ifindex = priv->ndev->ifindex;
615-
can_skb_prv(skb)->skbcnt = 0;
616615
/* reserve CAN header */
617616
skb_reserve(skb, offsetof(struct can_frame, data));
618617

@@ -1551,7 +1550,6 @@ j1939_session *j1939_session_fresh_new(struct j1939_priv *priv,
15511550
skb->dev = priv->ndev;
15521551
can_skb_reserve(skb);
15531552
can_skb_prv(skb)->ifindex = priv->ndev->ifindex;
1554-
can_skb_prv(skb)->skbcnt = 0;
15551553
skcb = j1939_skb_to_cb(skb);
15561554
memcpy(skcb, rel_skcb, sizeof(*skcb));
15571555

‎net/can/raw.c‎

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

7676
struct uniqframe {
77-
int skbcnt;
7877
const struct sk_buff *skb;
78+
u32 hash;
7979
unsigned int join_rx_count;
8080
};
8181

@@ -136,7 +136,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
136136

137137
/* eliminate multiple filter matches for the same skb */
138138
if (this_cpu_ptr(ro->uniq)->skb == oskb &&
139-
this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
139+
this_cpu_ptr(ro->uniq)->hash == oskb->hash) {
140140
if (ro->join_filters) {
141141
this_cpu_inc(ro->uniq->join_rx_count);
142142
/* drop frame until all enabled filters matched */
@@ -147,7 +147,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
147147
}
148148
} else {
149149
this_cpu_ptr(ro->uniq)->skb = oskb;
150-
this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;
150+
this_cpu_ptr(ro->uniq)->hash = oskb->hash;
151151
this_cpu_ptr(ro->uniq)->join_rx_count = 1;
152152
/* drop first frame to check all enabled filters? */
153153
if (ro->join_filters && ro->count > 1)
@@ -829,7 +829,6 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
829829

830830
can_skb_reserve(skb);
831831
can_skb_prv(skb)->ifindex = dev->ifindex;
832-
can_skb_prv(skb)->skbcnt = 0;
833832

834833
err = memcpy_from_msg(skb_put(skb, size), msg, size);
835834
if (err < 0)

0 commit comments

Comments
 (0)