Message ID | 20220909085712.46006-5-lingshan.zhu@intel.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Conditionally read fields in dev cfg space | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch |
On Fri, Sep 9, 2022 at 5:05 PM Zhu Lingshan <lingshan.zhu@intel.com> wrote: > > The spec says: > mtu only exists if VIRTIO_NET_F_MTU is set > The mac address field always exists (though > is only valid if VIRTIO_NET_F_MAC is set) > > So vdpa_dev_net_config_fill() should read MTU and MAC > conditionally on the feature bits. > > Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> Acked-by: Jason Wang <jasowang@redhat.com> > --- > drivers/vdpa/vdpa.c | 37 +++++++++++++++++++++++++++++-------- > 1 file changed, 29 insertions(+), 8 deletions(-) > > diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c > index f8ff61232421..b332388d3375 100644 > --- a/drivers/vdpa/vdpa.c > +++ b/drivers/vdpa/vdpa.c > @@ -815,6 +815,29 @@ static int vdpa_dev_net_mq_config_fill(struct sk_buff *msg, u64 features, > return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MAX_VQP, val_u16); > } > > +static int vdpa_dev_net_mtu_config_fill(struct sk_buff *msg, u64 features, > + const struct virtio_net_config *config) > +{ > + u16 val_u16; > + > + if ((features & BIT_ULL(VIRTIO_NET_F_MTU)) == 0) > + return 0; > + > + val_u16 = __virtio16_to_cpu(true, config->mtu); > + > + return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16); > +} > + > +static int vdpa_dev_net_mac_config_fill(struct sk_buff *msg, u64 features, > + const struct virtio_net_config *config) > +{ > + if ((features & BIT_ULL(VIRTIO_NET_F_MAC)) == 0) > + return 0; > + > + return nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR, > + sizeof(config->mac), config->mac); > +} > + > static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *msg) > { > struct virtio_net_config config = {}; > @@ -824,18 +847,10 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms > > vdev->config->get_config(vdev, 0, &config, sizeof(config)); > > - if (nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR, sizeof(config.mac), > - config.mac)) > - return -EMSGSIZE; > - > val_u16 = __virtio16_to_cpu(true, config.status); > if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_STATUS, val_u16)) > return -EMSGSIZE; > > - val_u16 = __virtio16_to_cpu(true, config.mtu); > - if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16)) > - return -EMSGSIZE; > - > /* only read driver features after the feature negotiation is done */ > status = vdev->config->get_status(vdev); > if (status & VIRTIO_CONFIG_S_FEATURES_OK) { > @@ -852,6 +867,12 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms > VDPA_ATTR_PAD)) > return -EMSGSIZE; > > + if (vdpa_dev_net_mtu_config_fill(msg, features_device, &config)) > + return -EMSGSIZE; > + > + if (vdpa_dev_net_mac_config_fill(msg, features_device, &config)) > + return -EMSGSIZE; > + > return vdpa_dev_net_mq_config_fill(msg, features_device, &config); > } > > -- > 2.31.1 >
diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c index f8ff61232421..b332388d3375 100644 --- a/drivers/vdpa/vdpa.c +++ b/drivers/vdpa/vdpa.c @@ -815,6 +815,29 @@ static int vdpa_dev_net_mq_config_fill(struct sk_buff *msg, u64 features, return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MAX_VQP, val_u16); } +static int vdpa_dev_net_mtu_config_fill(struct sk_buff *msg, u64 features, + const struct virtio_net_config *config) +{ + u16 val_u16; + + if ((features & BIT_ULL(VIRTIO_NET_F_MTU)) == 0) + return 0; + + val_u16 = __virtio16_to_cpu(true, config->mtu); + + return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16); +} + +static int vdpa_dev_net_mac_config_fill(struct sk_buff *msg, u64 features, + const struct virtio_net_config *config) +{ + if ((features & BIT_ULL(VIRTIO_NET_F_MAC)) == 0) + return 0; + + return nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR, + sizeof(config->mac), config->mac); +} + static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *msg) { struct virtio_net_config config = {}; @@ -824,18 +847,10 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms vdev->config->get_config(vdev, 0, &config, sizeof(config)); - if (nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR, sizeof(config.mac), - config.mac)) - return -EMSGSIZE; - val_u16 = __virtio16_to_cpu(true, config.status); if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_STATUS, val_u16)) return -EMSGSIZE; - val_u16 = __virtio16_to_cpu(true, config.mtu); - if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16)) - return -EMSGSIZE; - /* only read driver features after the feature negotiation is done */ status = vdev->config->get_status(vdev); if (status & VIRTIO_CONFIG_S_FEATURES_OK) { @@ -852,6 +867,12 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms VDPA_ATTR_PAD)) return -EMSGSIZE; + if (vdpa_dev_net_mtu_config_fill(msg, features_device, &config)) + return -EMSGSIZE; + + if (vdpa_dev_net_mac_config_fill(msg, features_device, &config)) + return -EMSGSIZE; + return vdpa_dev_net_mq_config_fill(msg, features_device, &config); }
The spec says: mtu only exists if VIRTIO_NET_F_MTU is set The mac address field always exists (though is only valid if VIRTIO_NET_F_MAC is set) So vdpa_dev_net_config_fill() should read MTU and MAC conditionally on the feature bits. Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> --- drivers/vdpa/vdpa.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-)