Message ID | 1437008477-3469-1-git-send-email-kamal@canonical.com |
---|---|
State | New |
Headers | show |
Hello Kamal, this patch is only relevant for v4.1.x where the problematic commit 514ac99c64b "can: fix multiple delivery of a single CAN frame for overlapping CAN filters" has been introduced. So we can omit this patch below for 3.19.y-ckt stable as it does not fix anything there. We just missed to add a marker '# v4.1' in that fix. Sorry for the noise. Best regards, Oliver On 16.07.2015 03:01, Kamal Mostafa wrote: > This is a note to let you know that I have just added a patch titled > > can: fix loss of CAN frames in raw_rcv > > to the linux-3.19.y-queue branch of the 3.19.y-ckt extended stable tree > which can be found at: > > http://kernel.ubuntu.com/git/ubuntu/linux.git/log/?h=linux-3.19.y-queue > > This patch is scheduled to be released in version 3.19.y-ckt4. > > If you, or anyone else, feels it should not be added to this tree, please > reply to this email. > > For more information about the 3.19.y-ckt tree, see > https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable > > Thanks. > -Kamal > > ------ > > From 42fd9bd1b9ba6558f060f9077070f71a9f31de90 Mon Sep 17 00:00:00 2001 > From: Oliver Hartkopp <socketcan@hartkopp.net> > Date: Sun, 21 Jun 2015 18:50:44 +0200 > Subject: can: fix loss of CAN frames in raw_rcv > > commit 36c01245eb8046c16eee6431e7dbfbb302635fa8 upstream. > > As reported by Manfred Schlaegl here > > http://marc.info/?l=linux-netdev&m=143482089824232&w=2 > > commit 514ac99c64b "can: fix multiple delivery of a single CAN frame for > overlapping CAN filters" requires the skb->tstamp to be set to check for > identical CAN skbs. > > As net timestamping is influenced by several players (netstamp_needed and > netdev_tstamp_prequeue) Manfred missed a proper timestamp which leads to > CAN frame loss. > > As skb timestamping became now mandatory for CAN related skbs this patch > makes sure that received CAN skbs always have a proper timestamp set. > Maybe there's a better solution in the future but this patch fixes the > CAN frame loss so far. > > Reported-by: Manfred Schlaegl <manfred.schlaegl@gmx.at> > Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> > Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> > Signed-off-by: Kamal Mostafa <kamal@canonical.com> > --- > drivers/net/can/dev.c | 5 +++++ > drivers/net/can/slcan.c | 1 + > drivers/net/can/vcan.c | 3 +++ > net/can/af_can.c | 6 +++++- > 4 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c > index 62ca0e8..44fc75f 100644 > --- a/drivers/net/can/dev.c > +++ b/drivers/net/can/dev.c > @@ -438,6 +438,9 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) > struct can_frame *cf = (struct can_frame *)skb->data; > u8 dlc = cf->can_dlc; > > + if (!(skb->tstamp.tv64)) > + __net_timestamp(skb); > + > netif_rx(priv->echo_skb[idx]); > priv->echo_skb[idx] = NULL; > > @@ -574,6 +577,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) > if (unlikely(!skb)) > return NULL; > > + __net_timestamp(skb); > skb->protocol = htons(ETH_P_CAN); > skb->pkt_type = PACKET_BROADCAST; > skb->ip_summed = CHECKSUM_UNNECESSARY; > @@ -602,6 +606,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, > if (unlikely(!skb)) > return NULL; > > + __net_timestamp(skb); > skb->protocol = htons(ETH_P_CANFD); > skb->pkt_type = PACKET_BROADCAST; > skb->ip_summed = CHECKSUM_UNNECESSARY; > diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c > index c837eb9..f64f529 100644 > --- a/drivers/net/can/slcan.c > +++ b/drivers/net/can/slcan.c > @@ -207,6 +207,7 @@ static void slc_bump(struct slcan *sl) > if (!skb) > return; > > + __net_timestamp(skb); > skb->dev = sl->dev; > skb->protocol = htons(ETH_P_CAN); > skb->pkt_type = PACKET_BROADCAST; > diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c > index 674f367..0ce868d 100644 > --- a/drivers/net/can/vcan.c > +++ b/drivers/net/can/vcan.c > @@ -78,6 +78,9 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) > skb->dev = dev; > skb->ip_summed = CHECKSUM_UNNECESSARY; > > + if (!(skb->tstamp.tv64)) > + __net_timestamp(skb); > + > netif_rx_ni(skb); > } > > diff --git a/net/can/af_can.c b/net/can/af_can.c > index 32d710e..689c818 100644 > --- a/net/can/af_can.c > +++ b/net/can/af_can.c > @@ -310,8 +310,12 @@ int can_send(struct sk_buff *skb, int loop) > return err; > } > > - if (newskb) > + if (newskb) { > + if (!(newskb->tstamp.tv64)) > + __net_timestamp(newskb); > + > netif_rx_ni(newskb); > + } > > /* update statistics */ > can_stats.tx_frames++; > -- > 1.9.1 >
On Thu, 2015-07-16 at 07:03 +0200, Oliver Hartkopp wrote: > Hello Kamal, > > this patch is only relevant for v4.1.x where the problematic commit > 514ac99c64b "can: fix multiple delivery of a single CAN frame for overlapping > CAN filters" has been introduced. > > So we can omit this patch below for 3.19.y-ckt stable as it does not fix > anything there. > > We just missed to add a marker '# v4.1' in that fix. > > Sorry for the noise. No worries -- I'll drop this patch from 3.19-stable. Thanks Oliver! -Kamal > Best regards, > Oliver > > > On 16.07.2015 03:01, Kamal Mostafa wrote: > > This is a note to let you know that I have just added a patch titled > > > > can: fix loss of CAN frames in raw_rcv > > > > to the linux-3.19.y-queue branch of the 3.19.y-ckt extended stable tree > > which can be found at: > > > > http://kernel.ubuntu.com/git/ubuntu/linux.git/log/?h=linux-3.19.y-queue > > > > This patch is scheduled to be released in version 3.19.y-ckt4. > > > > If you, or anyone else, feels it should not be added to this tree, please > > reply to this email. > > > > For more information about the 3.19.y-ckt tree, see > > https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable > > > > Thanks. > > -Kamal > > > > ------ > > > > From 42fd9bd1b9ba6558f060f9077070f71a9f31de90 Mon Sep 17 00:00:00 2001 > > From: Oliver Hartkopp <socketcan@hartkopp.net> > > Date: Sun, 21 Jun 2015 18:50:44 +0200 > > Subject: can: fix loss of CAN frames in raw_rcv > > > > commit 36c01245eb8046c16eee6431e7dbfbb302635fa8 upstream. > > > > As reported by Manfred Schlaegl here > > > > http://marc.info/?l=linux-netdev&m=143482089824232&w=2 > > > > commit 514ac99c64b "can: fix multiple delivery of a single CAN frame for > > overlapping CAN filters" requires the skb->tstamp to be set to check for > > identical CAN skbs. > > > > As net timestamping is influenced by several players (netstamp_needed and > > netdev_tstamp_prequeue) Manfred missed a proper timestamp which leads to > > CAN frame loss. > > > > As skb timestamping became now mandatory for CAN related skbs this patch > > makes sure that received CAN skbs always have a proper timestamp set. > > Maybe there's a better solution in the future but this patch fixes the > > CAN frame loss so far. > > > > Reported-by: Manfred Schlaegl <manfred.schlaegl@gmx.at> > > Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> > > Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> > > Signed-off-by: Kamal Mostafa <kamal@canonical.com> > > --- > > drivers/net/can/dev.c | 5 +++++ > > drivers/net/can/slcan.c | 1 + > > drivers/net/can/vcan.c | 3 +++ > > net/can/af_can.c | 6 +++++- > > 4 files changed, 14 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c > > index 62ca0e8..44fc75f 100644 > > --- a/drivers/net/can/dev.c > > +++ b/drivers/net/can/dev.c > > @@ -438,6 +438,9 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) > > struct can_frame *cf = (struct can_frame *)skb->data; > > u8 dlc = cf->can_dlc; > > > > + if (!(skb->tstamp.tv64)) > > + __net_timestamp(skb); > > + > > netif_rx(priv->echo_skb[idx]); > > priv->echo_skb[idx] = NULL; > > > > @@ -574,6 +577,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) > > if (unlikely(!skb)) > > return NULL; > > > > + __net_timestamp(skb); > > skb->protocol = htons(ETH_P_CAN); > > skb->pkt_type = PACKET_BROADCAST; > > skb->ip_summed = CHECKSUM_UNNECESSARY; > > @@ -602,6 +606,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, > > if (unlikely(!skb)) > > return NULL; > > > > + __net_timestamp(skb); > > skb->protocol = htons(ETH_P_CANFD); > > skb->pkt_type = PACKET_BROADCAST; > > skb->ip_summed = CHECKSUM_UNNECESSARY; > > diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c > > index c837eb9..f64f529 100644 > > --- a/drivers/net/can/slcan.c > > +++ b/drivers/net/can/slcan.c > > @@ -207,6 +207,7 @@ static void slc_bump(struct slcan *sl) > > if (!skb) > > return; > > > > + __net_timestamp(skb); > > skb->dev = sl->dev; > > skb->protocol = htons(ETH_P_CAN); > > skb->pkt_type = PACKET_BROADCAST; > > diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c > > index 674f367..0ce868d 100644 > > --- a/drivers/net/can/vcan.c > > +++ b/drivers/net/can/vcan.c > > @@ -78,6 +78,9 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) > > skb->dev = dev; > > skb->ip_summed = CHECKSUM_UNNECESSARY; > > > > + if (!(skb->tstamp.tv64)) > > + __net_timestamp(skb); > > + > > netif_rx_ni(skb); > > } > > > > diff --git a/net/can/af_can.c b/net/can/af_can.c > > index 32d710e..689c818 100644 > > --- a/net/can/af_can.c > > +++ b/net/can/af_can.c > > @@ -310,8 +310,12 @@ int can_send(struct sk_buff *skb, int loop) > > return err; > > } > > > > - if (newskb) > > + if (newskb) { > > + if (!(newskb->tstamp.tv64)) > > + __net_timestamp(newskb); > > + > > netif_rx_ni(newskb); > > + } > > > > /* update statistics */ > > can_stats.tx_frames++; > > -- > > 1.9.1 > > >
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 62ca0e8..44fc75f 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c @@ -438,6 +438,9 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) struct can_frame *cf = (struct can_frame *)skb->data; u8 dlc = cf->can_dlc; + if (!(skb->tstamp.tv64)) + __net_timestamp(skb); + netif_rx(priv->echo_skb[idx]); priv->echo_skb[idx] = NULL; @@ -574,6 +577,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) if (unlikely(!skb)) return NULL; + __net_timestamp(skb); skb->protocol = htons(ETH_P_CAN); skb->pkt_type = PACKET_BROADCAST; skb->ip_summed = CHECKSUM_UNNECESSARY; @@ -602,6 +606,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, if (unlikely(!skb)) return NULL; + __net_timestamp(skb); skb->protocol = htons(ETH_P_CANFD); skb->pkt_type = PACKET_BROADCAST; skb->ip_summed = CHECKSUM_UNNECESSARY; diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index c837eb9..f64f529 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -207,6 +207,7 @@ static void slc_bump(struct slcan *sl) if (!skb) return; + __net_timestamp(skb); skb->dev = sl->dev; skb->protocol = htons(ETH_P_CAN); skb->pkt_type = PACKET_BROADCAST; diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index 674f367..0ce868d 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c @@ -78,6 +78,9 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) skb->dev = dev; skb->ip_summed = CHECKSUM_UNNECESSARY; + if (!(skb->tstamp.tv64)) + __net_timestamp(skb); + netif_rx_ni(skb); } diff --git a/net/can/af_can.c b/net/can/af_can.c index 32d710e..689c818 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -310,8 +310,12 @@ int can_send(struct sk_buff *skb, int loop) return err; } - if (newskb) + if (newskb) { + if (!(newskb->tstamp.tv64)) + __net_timestamp(newskb); + netif_rx_ni(newskb); + } /* update statistics */ can_stats.tx_frames++;