On 2023/8/17 18:18, Eugenio Perez Martin wrote:
> On Fri, Jul 7, 2023 at 5:27 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>
>> ---
>> v3:
>>    - return early if mismatch the condition suggested by Eugenio
>>
>> v2: 
>> https://lore.kernel.org/all/2f2560f749186c0eb1055f9926f464587e419eeb.1688051252.git.yin31...@gmail.com/
>>    - 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 | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 52 insertions(+)
>>
>> diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
>> index 31ef6ad6ec..7189ccafaf 100644
>> --- a/net/vhost-vdpa.c
>> +++ b/net/vhost-vdpa.c
>> @@ -660,6 +660,58 @@ static int vhost_vdpa_net_load_mac(VhostVDPAState *s, 
>> const VirtIONet *n)
>>           }
>>       }
>>
>> +    /*
>> +     * According to VirtIO standard, "The device MUST have an
>> +     * empty MAC filtering table on reset.".
>> +     *
>> +     * 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.
>> +     */
>> +    if (!virtio_vdev_has_feature(&n->parent_obj, VIRTIO_NET_F_CTRL_RX) ||
>> +        n->mac_table.in_use == 0) {
>> +        return 0;
>> +    }
>> +
>> +    uint32_t uni_entries = n->mac_table.first_multi,
>
> QEMU coding style prefers declarations at the beginning of the code
> block. Previous uses of these variable names would need to be
> refactored to met this rule.

Hi Eugenio,

Thanks for the detailed explanation.

Since this patch series has already been merged into master, I will
submit a separate patch to correct this problem.

I will take care of this problem in the future.

Thanks!


>
> Apart from that,
>
> Acked-by: Eugenio Pérez <epere...@redhat.com>
>
>> +             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 -EIO;
>> +    }
>> +
>>       return 0;
>>   }
>>
>> --
>> 2.25.1
>>
>

Reply via email to