qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH RFC v2 2/4] vdpa: Restore MAC address filtering state


From: Hawkins Jiawei
Subject: [PATCH RFC v2 2/4] vdpa: Restore MAC address filtering state
Date: Thu, 29 Jun 2023 23:25:33 +0800

This patch refactors vhost_vdpa_net_load_mac() to
restore the MAC address filtering state at device's startup.

Signed-off-by: Hawkins Jiawei <yin31149@gmail.com>
---
v2:
  - use iovec suggested by Eugenio
  - avoid sending CVQ command in default state

v1: 
00f72fe154a882fd6dc15bc39e3a1ac63f9dadce.1687402580.git.yin31149@gmail.com/">https://lore.kernel.org/all/00f72fe154a882fd6dc15bc39e3a1ac63f9dadce.1687402580.git.yin31149@gmail.com/

 net/vhost-vdpa.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
index 0bd1c7817c..cb45c84c88 100644
--- a/net/vhost-vdpa.c
+++ b/net/vhost-vdpa.c
@@ -665,6 +665,57 @@ static int vhost_vdpa_net_load_mac(VhostVDPAState *s, 
const VirtIONet *n)
         }
     }
 
+    if (virtio_vdev_has_feature(&n->parent_obj, VIRTIO_NET_F_CTRL_RX)) {
+        if (n->mac_table.in_use != 0) {
+            /*
+             * According to virtio_net_reset(), device uses an empty MAC filter
+             * table as its default state.
+             *
+             * Therefore, there is no need to send this CVQ command if the
+             * driver also sets an empty MAC filter table, which aligns with
+             * the device's defaults.
+             *
+             * Note that the device's defaults can mismatch the driver's
+             * configuration only at live migration.
+             */
+            uint32_t uni_entries = n->mac_table.first_multi,
+                     uni_macs_size = uni_entries * ETH_ALEN,
+                     mul_entries = n->mac_table.in_use - uni_entries,
+                     mul_macs_size = mul_entries * ETH_ALEN;
+            struct virtio_net_ctrl_mac uni = {
+                .entries = cpu_to_le32(uni_entries),
+            };
+            struct virtio_net_ctrl_mac mul = {
+                .entries = cpu_to_le32(mul_entries),
+            };
+            const struct iovec data[] = {
+                {
+                    .iov_base = &uni,
+                    .iov_len = sizeof(uni),
+                }, {
+                    .iov_base = n->mac_table.macs,
+                    .iov_len = uni_macs_size,
+                }, {
+                    .iov_base = &mul,
+                    .iov_len = sizeof(mul),
+                }, {
+                    .iov_base = &n->mac_table.macs[uni_macs_size],
+                    .iov_len = mul_macs_size,
+                },
+            };
+            ssize_t dev_written = vhost_vdpa_net_load_cmd(s,
+                                        VIRTIO_NET_CTRL_MAC,
+                                        VIRTIO_NET_CTRL_MAC_TABLE_SET,
+                                        data, ARRAY_SIZE(data));
+            if (unlikely(dev_written < 0)) {
+                return dev_written;
+            }
+            if (*s->status != VIRTIO_NET_OK) {
+                return -EINVAL;
+            }
+        }
+    }
+
     return 0;
 }
 
-- 
2.25.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]