On Wed, May 25, 2022 at 1:23 PM Dawar, Gautam <gautam.dawar@xxxxxxx> wrote: > > [AMD Official Use Only - General] > > -----Original Message----- > From: Eugenio Pérez <eperezma@xxxxxxxxxx> > Sent: Wednesday, May 25, 2022 4:29 PM > To: Michael S. Tsirkin <mst@xxxxxxxxxx>; netdev@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; kvm@xxxxxxxxxxxxxxx; virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx; Jason Wang <jasowang@xxxxxxxxxx> > Cc: Zhu Lingshan <lingshan.zhu@xxxxxxxxx>; martinh@xxxxxxxxxx; Stefano Garzarella <sgarzare@xxxxxxxxxx>; ecree.xilinx@xxxxxxxxx; Eli Cohen <elic@xxxxxxxxxx>; Dan Carpenter <dan.carpenter@xxxxxxxxxx>; Parav Pandit <parav@xxxxxxxxxx>; Wu Zongyong <wuzongyong@xxxxxxxxxxxxxxxxx>; dinang@xxxxxxxxxx; Christophe JAILLET <christophe.jaillet@xxxxxxxxxx>; Xie Yongji <xieyongji@xxxxxxxxxxxxx>; Dawar, Gautam <gautam.dawar@xxxxxxx>; lulu@xxxxxxxxxx; martinpo@xxxxxxxxxx; pabloc@xxxxxxxxxx; Longpeng <longpeng2@xxxxxxxxxx>; Piotr.Uminski@xxxxxxxxx; Kamde, Tanuj <tanuj.kamde@xxxxxxx>; Si-Wei Liu <si-wei.liu@xxxxxxxxxx>; habetsm.xilinx@xxxxxxxxx; lvivier@xxxxxxxxxx; Zhang Min <zhang.min9@xxxxxxxxxx>; hanand@xxxxxxxxxx > Subject: [PATCH v3 2/4] vhost-vdpa: introduce STOP backend feature bit > > [CAUTION: External Email] > > Userland knows if it can stop the device or not by checking this feature bit. > > It's only offered if the vdpa driver backend implements the stop() operation callback, and try to set it if the backend does not offer that callback is an error. > > Signed-off-by: Eugenio Pérez <eperezma@xxxxxxxxxx> > --- > drivers/vhost/vdpa.c | 16 +++++++++++++++- > include/uapi/linux/vhost_types.h | 2 ++ > 2 files changed, 17 insertions(+), 1 deletion(-) > > diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index 1f1d1c425573..32713db5831d 100644 > --- a/drivers/vhost/vdpa.c > +++ b/drivers/vhost/vdpa.c > @@ -347,6 +347,14 @@ static long vhost_vdpa_set_config(struct vhost_vdpa *v, > return 0; > } > > +static bool vhost_vdpa_can_stop(const struct vhost_vdpa *v) { > + struct vdpa_device *vdpa = v->vdpa; > + const struct vdpa_config_ops *ops = vdpa->config; > + > + return ops->stop; > [GD>>] Would it be better to explicitly return a bool to match the return type? I'm not sure about the kernel code style regarding that casting. Maybe it's better to return !!ops->stop here. The macros likely and unlikely do that. Thanks! > +} > + > static long vhost_vdpa_get_features(struct vhost_vdpa *v, u64 __user *featurep) { > struct vdpa_device *vdpa = v->vdpa; @@ -575,7 +583,11 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, > if (cmd == VHOST_SET_BACKEND_FEATURES) { > if (copy_from_user(&features, featurep, sizeof(features))) > return -EFAULT; > - if (features & ~VHOST_VDPA_BACKEND_FEATURES) > + if (features & ~(VHOST_VDPA_BACKEND_FEATURES | > + BIT_ULL(VHOST_BACKEND_F_STOP))) > + return -EOPNOTSUPP; > + if ((features & BIT_ULL(VHOST_BACKEND_F_STOP)) && > + !vhost_vdpa_can_stop(v)) > return -EOPNOTSUPP; > vhost_set_backend_features(&v->vdev, features); > return 0; > @@ -624,6 +636,8 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, > break; > case VHOST_GET_BACKEND_FEATURES: > features = VHOST_VDPA_BACKEND_FEATURES; > + if (vhost_vdpa_can_stop(v)) > + features |= BIT_ULL(VHOST_BACKEND_F_STOP); > if (copy_to_user(featurep, &features, sizeof(features))) > r = -EFAULT; > break; > diff --git a/include/uapi/linux/vhost_types.h b/include/uapi/linux/vhost_types.h > index 634cee485abb..2758e665791b 100644 > --- a/include/uapi/linux/vhost_types.h > +++ b/include/uapi/linux/vhost_types.h > @@ -161,5 +161,7 @@ struct vhost_vdpa_iova_range { > * message > */ > #define VHOST_BACKEND_F_IOTLB_ASID 0x3 > +/* Stop device from processing virtqueue buffers */ #define > +VHOST_BACKEND_F_STOP 0x4 > > #endif > -- > 2.27.0 >