[libvirt] [PATCH v2] qemu: handle multicast overflow on macvtap NIC_RX_FILTER_CHANGED

Michael S. Tsirkin mst at redhat.com
Fri Nov 30 19:56:22 UTC 2018


On Fri, Nov 30, 2018 at 12:50:26PM -0500, Jason Baron wrote:
> Guest network devices can set 'overflow' when there are a number of multicast
> ips configured. For virtio_net, the limit is only 64. In this case, the list
> of mac addresses is empty and the 'overflow' condition is set. Thus, the guest
> will currently receive no multicast traffic in this state.
> 
> When 'overflow' is set in the guest, let's turn this into ALLMULTI on the host.
> 
> Signed-off-by: Jason Baron <jbaron at akamai.com>

Acked-by: Michael S. Tsirkin <mst at redhat.com>

> ---
> v1->v2:
>  1. check for < 0 in virNetDevSetRcvAllMulti() (Michal Privoznik)
>  2. restrict overflow check to VIR_NETDEV_RX_FILTER_MODE_NORMAL mode as to
>     avoid unnecessarily calling rx filter updates for other modes 
>  3. update virNetDevSetRcvAllMulti() call to use guestFilter->multicast.overflow
>     directly (Michal Privoznik)
> 
>  src/qemu/qemu_driver.c | 22 +++++++++++++++-------
>  1 file changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 7fb9102..f4bbfea 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4443,11 +4443,12 @@ static void
>  syncNicRxFilterMultiMode(char *ifname, virNetDevRxFilterPtr guestFilter,
>                           virNetDevRxFilterPtr hostFilter)
>  {
> -    if (hostFilter->multicast.mode != guestFilter->multicast.mode) {
> +    if (hostFilter->multicast.mode != guestFilter->multicast.mode ||
> +        (guestFilter->multicast.overflow &&
> +        guestFilter->multicast.mode == VIR_NETDEV_RX_FILTER_MODE_NORMAL)) {
>          switch (guestFilter->multicast.mode) {
>              case VIR_NETDEV_RX_FILTER_MODE_ALL:
>                  if (virNetDevSetRcvAllMulti(ifname, true)) {
> -
>                      VIR_WARN("Couldn't set allmulticast flag to 'on' for "
>                               "device %s while responding to "
>                               "NIC_RX_FILTER_CHANGED", ifname);
> @@ -4455,17 +4456,24 @@ syncNicRxFilterMultiMode(char *ifname, virNetDevRxFilterPtr guestFilter,
>                  break;
>  
>              case VIR_NETDEV_RX_FILTER_MODE_NORMAL:
> -                if (virNetDevSetRcvMulti(ifname, true)) {
> +                if (guestFilter->multicast.overflow &&
> +                    (hostFilter->multicast.mode == VIR_NETDEV_RX_FILTER_MODE_ALL)) {
> +                    break;
> +                }
>  
> +                if (virNetDevSetRcvMulti(ifname, true)) {
>                      VIR_WARN("Couldn't set multicast flag to 'on' for "
>                               "device %s while responding to "
>                               "NIC_RX_FILTER_CHANGED", ifname);
>                  }
>  
> -                if (virNetDevSetRcvAllMulti(ifname, false)) {
> -                    VIR_WARN("Couldn't set allmulticast flag to 'off' for "
> -                             "device %s while responding to "
> -                             "NIC_RX_FILTER_CHANGED", ifname);
> +                if (virNetDevSetRcvAllMulti(ifname,
> +                                            guestFilter->multicast.overflow) < 0) {
> +                     VIR_WARN("Couldn't set allmulticast flag to '%s' for "
> +                              "device %s while responding to "
> +                              "NIC_RX_FILTER_CHANGED",
> +                              virTristateSwitchTypeToString(virTristateSwitchFromBool(guestFilter->multicast.overflow)),
> +                              ifname);
>                  }
>                  break;
>  
> -- 
> 2.7.4




More information about the libvir-list mailing list