Thread (6 messages) 6 messages, 2 authors, 2026-01-26

Re: [PATCH v3 2/3] vdpa/mlx5: reuse common function for MAC address updates

From: Cindy Lu <hidden>
Date: 2026-01-26 08:04:07
Also in: kvm, lkml, virtualization

On Mon, Jan 19, 2026 at 2:05 PM Hariprasad Kelam [off-list ref] wrote:
On 2026-01-19 at 11:23:52, Cindy Lu (lulu@redhat.com) wrote:
quoted
Factor out MAC address update logic and reuse it from handle_ctrl_mac().

This ensures that old MAC entries are removed from the MPFS table
before adding a new one and that the forwarding rules are updated
accordingly. If updating the flow table fails, the original MAC and
rules are restored as much as possible to keep the software and
hardware state consistent.

Signed-off-by: Cindy Lu <redacted>

Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
---
 drivers/vdpa/mlx5/net/mlx5_vnet.c | 131 ++++++++++++++++--------------
 1 file changed, 71 insertions(+), 60 deletions(-)
diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
index 6e42bae7c9a1..7a39843de243 100644
--- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
+++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
@@ -2125,86 +2125,97 @@ static void teardown_steering(struct mlx5_vdpa_net *ndev)
      mlx5_destroy_flow_table(ndev->rxft);
 }

-static virtio_net_ctrl_ack handle_ctrl_mac(struct mlx5_vdpa_dev *mvdev, u8 cmd)
+static int mlx5_vdpa_change_mac(struct mlx5_vdpa_net *ndev,
+                             struct mlx5_core_dev *pfmdev,
+                             const u8 *new_mac)
 {
-     struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
-     struct mlx5_control_vq *cvq = &mvdev->cvq;
-     virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
-     struct mlx5_core_dev *pfmdev;
-     size_t read;
-     u8 mac[ETH_ALEN], mac_back[ETH_ALEN];
+     struct mlx5_vdpa_dev *mvdev = &ndev->mvdev;
+     u8 old_mac[ETH_ALEN];

-     pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
-     switch (cmd) {
-     case VIRTIO_NET_CTRL_MAC_ADDR_SET:
-             read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, (void *)mac, ETH_ALEN);
-             if (read != ETH_ALEN)
-                     break;
+     if (is_zero_ether_addr(new_mac))
+             return -EINVAL;

-             if (!memcmp(ndev->config.mac, mac, 6)) {
-                     status = VIRTIO_NET_OK;
-                     break;
+     if (!is_zero_ether_addr(ndev->config.mac)) {
+             if (mlx5_mpfs_del_mac(pfmdev, ndev->config.mac)) {
+                     mlx5_vdpa_warn(mvdev, "failed to delete old MAC %pM from MPFS table\n",
+                                    ndev->config.mac);
+                     return -EIO;
              }
+     }

-             if (is_zero_ether_addr(mac))
-                     break;
+     if (mlx5_mpfs_add_mac(pfmdev, (u8 *)new_mac)) {
+             mlx5_vdpa_warn(mvdev, "failed to insert new MAC %pM into MPFS table\n",
+                            new_mac);
+             return -EIO;
+     }

-             if (!is_zero_ether_addr(ndev->config.mac)) {
-                     if (mlx5_mpfs_del_mac(pfmdev, ndev->config.mac)) {
-                             mlx5_vdpa_warn(mvdev, "failed to delete old MAC %pM from MPFS table\n",
-                                            ndev->config.mac);
-                             break;
-                     }
-             }
+     /* backup the original mac address so that if failed to add the forward rules
+      * we could restore it
+      */
+     memcpy(old_mac, ndev->config.mac, ETH_ALEN);
        can we use "ether_addr_copy" instead of memcpy?
Thanks,
Hariprasad k
Thanks  Hariprasad, will change this
Thanks
cindy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help