[PATCH v7 14/18] vdpa/ifc: add interrupt and handle for virtio blk

Pei, Andy andy.pei at intel.com
Fri May 13 12:10:09 CEST 2022


HI Chenbo,

Thanks for your reply.
My reply is inline.

> -----Original Message-----
> From: Xia, Chenbo <chenbo.xia at intel.com>
> Sent: Friday, May 13, 2022 10:53 AM
> To: Pei, Andy <andy.pei at intel.com>; dev at dpdk.org
> Cc: maxime.coquelin at redhat.com; Cao, Gang <gang.cao at intel.com>; Liu,
> Changpeng <changpeng.liu at intel.com>
> Subject: RE: [PATCH v7 14/18] vdpa/ifc: add interrupt and handle for virtio
> blk
> 
> > -----Original Message-----
> > From: Pei, Andy <andy.pei at intel.com>
> > Sent: Wednesday, April 27, 2022 4:30 PM
> > To: dev at dpdk.org
> > Cc: Xia, Chenbo <chenbo.xia at intel.com>; maxime.coquelin at redhat.com;
> > Cao, Gang <gang.cao at intel.com>; Liu, Changpeng
> > <changpeng.liu at intel.com>
> > Subject: [PATCH v7 14/18] vdpa/ifc: add interrupt and handle for
> > virtio blk
> 
> Better be: vdpa/ifc: add interrupt handling for config space
> 
Sure. I will fix it in next version.
> >
> > Create a thread to poll and relay config space change interrupt.
> > Use VHOST_USER_SLAVE_CONFIG_CHANGE_MSG to info qemu.
> 
> Inform QEMU. You don't need to save words in commit log. The commit log
> should be as detailed as possible to make readers understand quickly what
> the commit is doing :)
> 
Sure. I will fix it in next version.
> >
> > Signed-off-by: Andy Pei <andy.pei at intel.com>
> > ---
> >  drivers/vdpa/ifc/ifcvf_vdpa.c | 112
> > ++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 112 insertions(+)
> >
> > diff --git a/drivers/vdpa/ifc/ifcvf_vdpa.c
> > b/drivers/vdpa/ifc/ifcvf_vdpa.c index 5a8cf1c..0e94e1f 100644
> > --- a/drivers/vdpa/ifc/ifcvf_vdpa.c
> > +++ b/drivers/vdpa/ifc/ifcvf_vdpa.c
> > @@ -53,7 +53,9 @@ struct ifcvf_internal {
> >  	int vfio_group_fd;
> >  	int vfio_dev_fd;
> >  	pthread_t tid;	/* thread for notify relay */
> > +	pthread_t intr_tid;	/* thread for intr relay */
> 
> Thread for virtio-blk config space change interrupt relay
> 
Sure.
> >  	int epfd;
> > +	int csc_fd;
> 
> csc_epfd
> 
OK.
> >  	int vid;
> >  	struct rte_vdpa_device *vdev;
> >  	uint16_t max_queues;
> > @@ -558,6 +560,107 @@ struct rte_vdpa_dev_info {
> >  	return 0;
> >  }
> >
> > +static void
> > +virtio_interrupt_handler(struct ifcvf_internal *internal) {
> > +	int vid = internal->vid;
> > +	int ret;
> > +
> > +	ret = rte_vhost_slave_config_change(vid, 1);
> > +	if (ret)
> > +		DRV_LOG(ERR, "failed to notify the guest about configuration
> > space change.");
> > +}
> > +
> > +static void *
> > +intr_relay(void *arg)
> > +{
> > +	struct ifcvf_internal *internal = (struct ifcvf_internal *)arg;
> > +	struct epoll_event csc_event;
> > +	struct epoll_event ev;
> > +	uint64_t buf;
> > +	int nbytes;
> > +	int csc_fd, csc_val = 0;
> > +
> > +	csc_fd = epoll_create(1);
> > +	if (csc_fd < 0) {
> > +		DRV_LOG(ERR, "failed to create epoll for config space
> > change.");
> > +		return NULL;
> > +	}
> > +
> > +	ev.events = EPOLLIN | EPOLLPRI | EPOLLRDHUP | EPOLLHUP;
> > +	ev.data.fd = rte_intr_fd_get(internal->pdev->intr_handle);
> > +	if (epoll_ctl(csc_fd, EPOLL_CTL_ADD,
> > +		rte_intr_fd_get(internal->pdev->intr_handle), &ev) < 0) {
> > +		DRV_LOG(ERR, "epoll add error: %s", strerror(errno));
> > +		return NULL;
> 
> Close the epfd and set to -1 if err.
> 
I check other epoll usage in DPDK, it seems most usage do not close the epfd and set to -1.
I am not sure whether it is needed.
> > +	}
> > +
> > +	internal->csc_fd = csc_fd;
> > +
> > +	for (;;) {
> > +		csc_val = epoll_wait(csc_fd, &csc_event, 1, -1);
> > +		if (csc_val < 0) {
> > +			if (errno == EINTR)
> > +				continue;
> > +			DRV_LOG(ERR, "epoll_wait return fail\n");
> 
> Save '\n', it's not needed for DRV_LOG. Please check other DRV_LOGs
> 
OK
> > +			return NULL;
> > +		} else if (csc_val == 0) {
> > +			continue;
> > +		} else {
> > +			/* csc_val > 0 */
> > +			nbytes = read(csc_event.data.fd, &buf, 8);
> > +			if (nbytes < 0) {
> > +				if (errno == EINTR || errno == EWOULDBLOCK)
> 
> EAGAIN should also be this case?
> 
Yes, it will be add in next version.
> > +					continue;
> > +				DRV_LOG(ERR, "Error reading from file
> > descriptor %d: %s\n",
> > +					csc_event.data.fd,
> > +					strerror(errno));
> > +				return NULL;
> > +			} else if (nbytes == 0) {
> > +				DRV_LOG(ERR, "Read nothing from file
> > descriptor %d\n",
> > +					csc_event.data.fd);
> > +				continue;
> > +			} else {
> > +				virtio_interrupt_handler(internal);
> > +			}
> > +		}
> > +	}
> > +
> > +	return NULL;
> > +}
> > +
> > +static int
> > +setup_intr_relay(struct ifcvf_internal *internal) {
> > +	int ret;
> > +
> > +	ret = pthread_create(&internal->intr_tid, NULL, intr_relay,
> > +			(void *)internal);
> 
> EAL API: rte_ctrl_thread_create, will be preferred.
> 
Sure, I will use " rte_ctrl_thread_create " in next version.
> > +	if (ret) {
> > +		DRV_LOG(ERR, "failed to create notify relay pthread.");
> > +		return -1;
> > +	}
> > +	return 0;
> > +}
> > +
> > +static int
> > +unset_intr_relay(struct ifcvf_internal *internal) {
> > +	void *status;
> > +
> > +	if (internal->intr_tid) {
> > +		pthread_cancel(internal->intr_tid);
> > +		pthread_join(internal->intr_tid, &status);
> > +	}
> > +	internal->intr_tid = 0;
> > +
> > +	if (internal->csc_fd >= 0)
> > +		close(internal->csc_fd);
> > +	internal->csc_fd = -1;
> > +
> > +	return 0;
> > +}
> > +
> >  static int
> >  update_datapath(struct ifcvf_internal *internal)  { @@ -584,10
> > +687,16 @@ struct rte_vdpa_dev_info {
> >  		if (ret)
> >  			goto err;
> >
> > +		ret = setup_intr_relay(internal);
> > +		if (ret)
> > +			goto err;
> > +
> 
> But this is not needed for net, right? As I said, we should include validation
> for net also.
> 
> Thanks,
> Chenbo
> 
For net device, especially the harden virtio device,  fabric plug in or out will cause config change.
I think net device may also need this interrupt, but I am not sure.

> >  		rte_atomic32_set(&internal->running, 1);
> >  	} else if (rte_atomic32_read(&internal->running) &&
> >  		   (!rte_atomic32_read(&internal->started) ||
> >  		    !rte_atomic32_read(&internal->dev_attached))) {
> > +		ret = unset_intr_relay(internal);
> > +
> >  		ret = unset_notify_relay(internal);
> >  		if (ret)
> >  			goto err;
> > @@ -880,6 +989,9 @@ struct rte_vdpa_dev_info {
> >  	/* stop the direct IO data path */
> >  	unset_notify_relay(internal);
> >  	vdpa_ifcvf_stop(internal);
> > +
> > +	unset_intr_relay(internal);
> > +
> >  	vdpa_disable_vfio_intr(internal);
> >
> >  	ret = rte_vhost_host_notifier_ctrl(vid, RTE_VHOST_QUEUE_ALL,
> false);
> > --
> > 1.8.3.1
> 



More information about the dev mailing list