On Thu, Jun 29, 2023 at 5:26 PM Hawkins Jiawei <yin31...@gmail.com> wrote:
>
> This patch refactors vhost_vdpa_net_load_mac() to
> restore the MAC address filtering state at device's startup.
>
> Signed-off-by: Hawkins Jiawei <yin31...@gmail.com>
> ---
> v2:
>   - use iovec suggested by Eugenio
>   - avoid sending CVQ command in default state
>
> v1: 
> https://lore.kernel.org/all/00f72fe154a882fd6dc15bc39e3a1ac63f9dadce.1687402580.git.yin31...@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) {

This may be just style nitpicking, but I find it more clear to return
early if conditions are not met and then send the CVQ command.
Something like:
/*
 * According to ...
 */
if (!virtio_vdev_has_feature(&n->parent_obj, VIRTIO_NET_F_CTRL_RX)) ||
(n->mac_table.in_use == 0)) {
  return 0
}

uni_entries = n->mac_table.first_multi,
...
---

Now I just realized vhost_vdpa_net_load_mac does not follow this for
checking VIRTIO_NET_F_CTRL_MAC_ADDR.

I'm ok if you leave it this way though.

Thanks!

> +            /*
> +             * 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