dpdk: patch broken virtio macro 90/29990/2
authorMatthew Smith <mgsmith@netgate.com>
Wed, 18 Nov 2020 19:40:31 +0000 (13:40 -0600)
committerBeno�t Ganne <bganne@cisco.com>
Wed, 25 Nov 2020 10:51:09 +0000 (10:51 +0000)
Type: fix

In DPDK 20.08, the macro ASSIGN_UNLESS_EQUAL(), which is defined in the
virtio PMD code, is broken. It does not actually set the variable that is
passed in to the value that is passed in. It just assigns the value
to a local variable that it declares. This results in
virtqueue_clear_net_hdr() failing to clear the fields in the virtio
net header. This can cause packets which were sent over an IPsec tunnel
and are subsequently transmitted on a virtio interface to have garbage
in the virtio net header.

Apply a post-20.08 patch from upstream to fix it.

Change-Id: Ic53e89d859db628e26a3c1988e53b626fede94d7
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
build/external/patches/dpdk_20.08/0001-net-virtio-fix-variable-assignment-in-helper-macro.patch [new file with mode: 0644]

diff --git a/build/external/patches/dpdk_20.08/0001-net-virtio-fix-variable-assignment-in-helper-macro.patch b/build/external/patches/dpdk_20.08/0001-net-virtio-fix-variable-assignment-in-helper-macro.patch
new file mode 100644 (file)
index 0000000..a4c00b9
--- /dev/null
@@ -0,0 +1,42 @@
+From a1412e05caa2678757156d4de2755ab5140ecc24 Mon Sep 17 00:00:00 2001
+From: Vipul Ashri <vipul.ashri@oracle.com>
+Date: Fri, 18 Sep 2020 15:25:04 +0530
+Subject: [PATCH] net/virtio: fix variable assignment in helper macro
+
+Inside Macro ASSIGN_UNLESS_EQUAL(var, val), assignment to var is always
+failing as assignment done using var_ having local scope only.
+This leads to TX packets not going out and found broken due to cleanup
+malfunctioning. This patch fixes the wrong variable assignment.
+
+Fixes: 57f90f894588 ("net/virtio: reuse packed ring functions")
+Cc: stable@dpdk.org
+
+Signed-off-by: Vipul Ashri <vipul.ashri@oracle.com>
+Acked-by: Andrew Rybchenko <arybchenko@solarflare.com>
+Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
+---
+ drivers/net/virtio/virtqueue.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
+index 105a9c00c..6ed50648c 100644
+--- a/drivers/net/virtio/virtqueue.h
++++ b/drivers/net/virtio/virtqueue.h
+@@ -607,10 +607,10 @@ virtqueue_notify(struct virtqueue *vq)
+ /* avoid write operation when necessary, to lessen cache issues */
+ #define ASSIGN_UNLESS_EQUAL(var, val) do {    \
+-      typeof(var) var_ = (var);               \
+-      typeof(val) val_ = (val);               \
+-      if ((var_) != (val_))                   \
+-              (var_) = (val_);                \
++      typeof(var) *const var_ = &(var);       \
++      typeof(val)  const val_ = (val);        \
++      if (*var_ != val_)                      \
++              *var_ = val_;                   \
+ } while (0)
+ #define virtqueue_clear_net_hdr(hdr) do {             \
+-- 
+2.18.4
+