From ef88a65e33ea148f907012643cedecfb5c917e0a Mon Sep 17 00:00:00 2001 From: Matt Ranostay Date: Wed, 11 Mar 2020 07:29:42 +0200 Subject: linux-agl: add pfifo patchset for fixing CAN failures Backported upstream patchset to fix CAN failures with SocketCAN * net: sch_generic: Use pfifo_fast as fallback scheduler for CAN hardware Additional patchset for 4.14 kernels to bring in needed if_afp.h header Bug-AGL: SPEC-3171 Change-Id: I1ddb75d1aca64861cfc52f1df4ff810bd0367ab9 Signed-off-by: Matt Ranostay --- ...eric-add-if_afp.h-header-to-get-ARPHRD_CA.patch | 25 ++++++++ .../recipes-kernel/linux/linux-agl-4.14.inc | 3 + meta-agl-bsp/recipes-kernel/linux/linux-agl.inc | 6 ++ ...eric-Use-pfifo_fast-as-fallback-scheduler.patch | 75 ++++++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 meta-agl-bsp/recipes-kernel/linux/linux-4.14/net-sch_generic-add-if_afp.h-header-to-get-ARPHRD_CA.patch create mode 100644 meta-agl-bsp/recipes-kernel/linux/linux/net-sch_generic-Use-pfifo_fast-as-fallback-scheduler.patch diff --git a/meta-agl-bsp/recipes-kernel/linux/linux-4.14/net-sch_generic-add-if_afp.h-header-to-get-ARPHRD_CA.patch b/meta-agl-bsp/recipes-kernel/linux/linux-4.14/net-sch_generic-add-if_afp.h-header-to-get-ARPHRD_CA.patch new file mode 100644 index 000000000..7c34fb306 --- /dev/null +++ b/meta-agl-bsp/recipes-kernel/linux/linux-4.14/net-sch_generic-add-if_afp.h-header-to-get-ARPHRD_CA.patch @@ -0,0 +1,25 @@ +From 17d0075d95b5087d5df553444cca390fa479bad9 Mon Sep 17 00:00:00 2001 +From: Matt Ranostay +Date: Tue, 10 Mar 2020 22:27:28 -0700 +Subject: [PATCH] net: sch_generic: add if_afp.h header to get ARPHRD_CAN macro + +Signed-off-by: Matt Ranostay +--- + net/sched/sch_generic.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c +index bf8c81e07c70..1845ef8c7dbd 100644 +--- a/net/sched/sch_generic.c ++++ b/net/sched/sch_generic.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + #include +-- +2.25.0 + diff --git a/meta-agl-bsp/recipes-kernel/linux/linux-agl-4.14.inc b/meta-agl-bsp/recipes-kernel/linux/linux-agl-4.14.inc index 87249bdcd..8521b1d6c 100644 --- a/meta-agl-bsp/recipes-kernel/linux/linux-agl-4.14.inc +++ b/meta-agl-bsp/recipes-kernel/linux/linux-agl-4.14.inc @@ -8,3 +8,6 @@ SRC_URI_append_with-lsm-smack = "\ file://Smack-Handle-CGROUP2-in-the-same-way-that-CGROUP.patch \ " +SRC_URI_append = "\ + file://net-sch_generic-add-if_afp.h-header-to-get-ARPHRD_CA.patch \ + " diff --git a/meta-agl-bsp/recipes-kernel/linux/linux-agl.inc b/meta-agl-bsp/recipes-kernel/linux/linux-agl.inc index 17fe96dff..7e801e0a7 100644 --- a/meta-agl-bsp/recipes-kernel/linux/linux-agl.inc +++ b/meta-agl-bsp/recipes-kernel/linux/linux-agl.inc @@ -2,6 +2,12 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/linux:" DEPENDS += "kern-tools-native" +# canbus qdisc pfifo change +SRC_URI_append = " file://net-sch_generic-Use-pfifo_fast-as-fallback-scheduler.patch" + +# bbe target has this upstream patch already +SRC_URI_remove_bbe = " file://net-sch_generic-Use-pfifo_fast-as-fallback-scheduler.patch" + # returns all the elements from the src uri that are .cfg files def find_cfgs(d): sources=src_patches(d, True) diff --git a/meta-agl-bsp/recipes-kernel/linux/linux/net-sch_generic-Use-pfifo_fast-as-fallback-scheduler.patch b/meta-agl-bsp/recipes-kernel/linux/linux/net-sch_generic-Use-pfifo_fast-as-fallback-scheduler.patch new file mode 100644 index 000000000..37ace5a58 --- /dev/null +++ b/meta-agl-bsp/recipes-kernel/linux/linux/net-sch_generic-Use-pfifo_fast-as-fallback-scheduler.patch @@ -0,0 +1,75 @@ +From 546b85bb0aadb5a928b49b53dc02911996169c0b Mon Sep 17 00:00:00 2001 +From: Vincent Prince +Date: Wed, 23 Oct 2019 15:44:20 +0200 +Subject: [PATCH] net: sch_generic: Use pfifo_fast as fallback scheduler for + CAN hardware + +There is networking hardware that isn't based on Ethernet for layers 1 and 2. + +For example CAN. + +CAN is a multi-master serial bus standard for connecting Electronic Control +Units [ECUs] also known as nodes. A frame on the CAN bus carries up to 8 bytes +of payload. Frame corruption is detected by a CRC. However frame loss due to +corruption is possible, but a quite unusual phenomenon. + +While fq_codel works great for TCP/IP, it doesn't for CAN. There are a lot of +legacy protocols on top of CAN, which are not build with flow control or high +CAN frame drop rates in mind. + +When using fq_codel, as soon as the queue reaches a certain delay based length, +skbs from the head of the queue are silently dropped. Silently meaning that the +user space using a send() or similar syscall doesn't get an error. However +TCP's flow control algorithm will detect dropped packages and adjust the +bandwidth accordingly. + +When using fq_codel and sending raw frames over CAN, which is the common use +case, the user space thinks the package has been sent without problems, because +send() returned without an error. pfifo_fast will drop skbs, if the queue +length exceeds the maximum. But with this scheduler the skbs at the tail are +dropped, an error (-ENOBUFS) is propagated to user space. So that the user +space can slow down the package generation. + +On distributions, where fq_codel is made default via CONFIG_DEFAULT_NET_SCH +during compile time, or set default during runtime with sysctl +net.core.default_qdisc (see [1]), we get a bad user experience. In my test case +with pfifo_fast, I can transfer thousands of million CAN frames without a frame +drop. On the other hand with fq_codel there is more then one lost CAN frame per +thousand frames. + +As pointed out fq_codel is not suited for CAN hardware, so this patch changes +attach_one_default_qdisc() to use pfifo_fast for "ARPHRD_CAN" network devices. + +During transition of a netdev from down to up state the default queuing +discipline is attached by attach_default_qdiscs() with the help of +attach_one_default_qdisc(). This patch modifies attach_one_default_qdisc() to +attach the pfifo_fast (pfifo_fast_ops) if the network device type is +"ARPHRD_CAN". + +[1] https://github.com/systemd/systemd/issues/9194 + +Suggested-by: Marc Kleine-Budde +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Vincent Prince +Acked-by: Dave Taht +Signed-off-by: David S. Miller +--- + net/sched/sch_generic.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c +index ed5b0e9fd395..4c5dfcb01e00 100644 +--- a/net/sched/sch_generic.c ++++ b/net/sched/sch_generic.c +@@ -1038,6 +1038,8 @@ static void attach_one_default_qdisc(struct net_device *dev, + + if (dev->priv_flags & IFF_NO_QUEUE) + ops = &noqueue_qdisc_ops; ++ else if(dev->type == ARPHRD_CAN) ++ ops = &pfifo_fast_ops; + + qdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT, NULL); + if (!qdisc) { +-- +2.25.0 + -- cgit 1.2.3-korg