On Mon, Dec 19, 2022 at 1:04 PM Yongji Xie <xieyongji@xxxxxxxxxxxxx> wrote: > > On Fri, Dec 16, 2022 at 12:02 PM Jason Wang <jasowang@xxxxxxxxxx> wrote: > > > > On Mon, Dec 5, 2022 at 4:44 PM Xie Yongji <xieyongji@xxxxxxxxxxxxx> wrote: > > > > > > This introduces a bound workqueue to support running > > > irq callback in a specified cpu. > > > > > > Signed-off-by: Xie Yongji <xieyongji@xxxxxxxxxxxxx> > > > --- > > > drivers/vdpa/vdpa_user/vduse_dev.c | 29 ++++++++++++++++++++++------- > > > 1 file changed, 22 insertions(+), 7 deletions(-) > > > > > > diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c > > > index 37809bfcb7ef..d126f3e32a20 100644 > > > --- a/drivers/vdpa/vdpa_user/vduse_dev.c > > > +++ b/drivers/vdpa/vdpa_user/vduse_dev.c > > > @@ -57,6 +57,7 @@ struct vduse_virtqueue { > > > struct vdpa_callback cb; > > > struct work_struct inject; > > > struct work_struct kick; > > > + int irq_effective_cpu; > > > > I wonder why it's a cpu number instead of a cpumask. The latter seems > > more flexible, e.g when using NUMA. > > > > This variable represents the CPU that runs the interrupt callback > rather than CPU affinity. Ok, but for some reason it only gets updated when a new affinity is set? (Btw, I don't see how the code deals with cpu hotplug, do we need cpuhot notifier?) Thanks > > > > }; > > > > > > struct vduse_dev; > > > @@ -128,6 +129,7 @@ static struct class *vduse_class; > > > static struct cdev vduse_ctrl_cdev; > > > static struct cdev vduse_cdev; > > > static struct workqueue_struct *vduse_irq_wq; > > > +static struct workqueue_struct *vduse_irq_bound_wq; > > > > > > static u32 allowed_device_id[] = { > > > VIRTIO_ID_BLOCK, > > > @@ -917,7 +919,8 @@ static void vduse_vq_irq_inject(struct work_struct *work) > > > } > > > > > > static int vduse_dev_queue_irq_work(struct vduse_dev *dev, > > > - struct work_struct *irq_work) > > > + struct work_struct *irq_work, > > > + int irq_effective_cpu) > > > { > > > int ret = -EINVAL; > > > > > > @@ -926,7 +929,11 @@ static int vduse_dev_queue_irq_work(struct vduse_dev *dev, > > > goto unlock; > > > > > > ret = 0; > > > - queue_work(vduse_irq_wq, irq_work); > > > + if (irq_effective_cpu == -1) > > > > Is it better to have a macro for this magic number? > > > > It makes sense to me. > > Thanks, > Yongji > _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization