Messages in this thread | | | Date | Tue, 31 Jan 2023 14:17:59 +0200 | Subject | Re: [PATCH 3/6] vdpa: validate provisioned device features against specified attribute | From | Eli Cohen <> |
| |
On 30/01/2023 22:30, Si-Wei Liu wrote: > With device feature provisioning, there's a chance for misconfiguration > that the vdpa feature attribute supplied in 'vdpa dev add' command doesn't > get selected on the device_features to be provisioned. For instance, when > a @mac attribute is specified, the corresponding feature bit _F_MAC in > device_features should be set for consistency. If there's conflict on > provisioned features against the attribute, it should be treated as an > error to fail the ambiguous command. Noted the opposite is not > necessarily true, for e.g. it's okay to have _F_MAC set in device_features > without providing a corresponding @mac attribute, in which case the vdpa > vendor driver could load certain default value for attribute that is not > explicitly specified. > > Generalize this check in vdpa core so that there's no duplicate code in > each vendor driver. > > Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com> Reviewed-by: Eli Cohen <elic@nvidia.com> > --- > drivers/vdpa/vdpa.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c > index 5f4883b..6d02b8c 100644 > --- a/drivers/vdpa/vdpa.c > +++ b/drivers/vdpa/vdpa.c > @@ -601,8 +601,26 @@ static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *i > config.mask |= BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MAX_VQP); > } > if (nl_attrs[VDPA_ATTR_DEV_FEATURES]) { > + u64 missing = 0x0ULL; > + > config.device_features = > nla_get_u64(nl_attrs[VDPA_ATTR_DEV_FEATURES]); > + if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR] && > + !(config.device_features & BIT_ULL(VIRTIO_NET_F_MAC))) > + missing |= BIT_ULL(VIRTIO_NET_F_MAC); > + if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU] && > + !(config.device_features & BIT_ULL(VIRTIO_NET_F_MTU))) > + missing |= BIT_ULL(VIRTIO_NET_F_MTU); > + if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MAX_VQP] && > + config.net.max_vq_pairs > 1 && > + !(config.device_features & BIT_ULL(VIRTIO_NET_F_MQ))) > + missing |= BIT_ULL(VIRTIO_NET_F_MQ); > + if (missing) { > + NL_SET_ERR_MSG_FMT_MOD(info->extack, > + "Missing features 0x%llx for provided attributes", > + missing); > + return -EINVAL; > + } > config.mask |= BIT_ULL(VDPA_ATTR_DEV_FEATURES); > } >
| |