Message ID | c7fc9005cc61d7ca53156ee5ece4c17980a78b15.1667542066.git.john.g.johnson@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio-user client | expand |
LGTM
Reviewed-by: John Levon <john.levon@nutanix.com>
regards
john
On 11/9/22 00:13, John Johnson wrote: > Signed-off-by: John G Johnson <john.g.johnson@oracle.com> > Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> > Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> > --- > hw/vfio/pci.c | 4 ++++ > hw/vfio/pci.h | 1 + > hw/vfio/user.c | 7 +++++-- > hw/vfio/user.h | 1 + > 4 files changed, 11 insertions(+), 2 deletions(-)> > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index 005fcf8..3ae3a13 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -3729,6 +3729,9 @@ static void vfio_user_pci_realize(PCIDevice *pdev, Error **errp) > if (udev->no_post) { > proxy->flags |= VFIO_PROXY_NO_POST; > } > + if (udev->wait_time) { > + proxy->wait_time = udev->wait_time; > + } > > vfio_user_validate_version(proxy, &err); > if (err != NULL) { > @@ -3848,6 +3851,7 @@ static Property vfio_user_pci_dev_properties[] = { > DEFINE_PROP_BOOL("secure-dma", VFIOUserPCIDevice, secure_dma, false), > DEFINE_PROP_BOOL("x-send-queued", VFIOUserPCIDevice, send_queued, false), > DEFINE_PROP_BOOL("x-no-posted-writes", VFIOUserPCIDevice, no_post, false), > + DEFINE_PROP_UINT32("x-msg-timeout", VFIOUserPCIDevice, wait_time, 0), I see that patch 9 introduced : +static int wait_time = 5000; /* wait up to 5 sec for busy servers */ May be use a define instead and assign "x-msg-timeout" to this default value. how do you plan to use the "x-msg-timeout" property ? Thanks, C. > DEFINE_PROP_END_OF_LIST(), > }; > > diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h > index c4b8e5c..48b19ee 100644 > --- a/hw/vfio/pci.h > +++ b/hw/vfio/pci.h > @@ -199,6 +199,7 @@ struct VFIOUserPCIDevice { > bool secure_dma; /* disable shared mem for DMA */ > bool send_queued; /* all sends are queued */ > bool no_post; /* all regions write are sync */ > + uint32_t wait_time; /* timeout for message replies */ > }; > > /* Use uin32_t for vendor & device so PCI_ANY_ID expands and cannot match hw */ > diff --git a/hw/vfio/user.c b/hw/vfio/user.c > index ddf9e13..a9e6cf5 100644 > --- a/hw/vfio/user.c > +++ b/hw/vfio/user.c > @@ -717,7 +717,8 @@ static void vfio_user_send_wait(VFIOProxy *proxy, VFIOUserHdr *hdr, > > if (ret == 0) { > while (!msg->complete) { > - if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, wait_time)) { > + if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, > + proxy->wait_time)) { > VFIOUserMsgQ *list; > > list = msg->pending ? &proxy->pending : &proxy->outgoing; > @@ -759,7 +760,8 @@ static void vfio_user_wait_reqs(VFIOProxy *proxy) > msg = proxy->last_nowait; > msg->type = VFIO_MSG_WAIT; > while (!msg->complete) { > - if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, wait_time)) { > + if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, > + proxy->wait_time)) { > VFIOUserMsgQ *list; > > list = msg->pending ? &proxy->pending : &proxy->outgoing; > @@ -881,6 +883,7 @@ VFIOProxy *vfio_user_connect_dev(SocketAddress *addr, Error **errp) > > proxy->flags = VFIO_PROXY_CLIENT; > proxy->state = VFIO_PROXY_CONNECTED; > + proxy->wait_time = wait_time; > > qemu_mutex_init(&proxy->lock); > qemu_cond_init(&proxy->close_cv); > diff --git a/hw/vfio/user.h b/hw/vfio/user.h > index d88ffe5..f711861 100644 > --- a/hw/vfio/user.h > +++ b/hw/vfio/user.h > @@ -62,6 +62,7 @@ typedef struct VFIOProxy { > uint64_t max_bitmap; > uint64_t migr_pgsize; > int flags; > + uint32_t wait_time; > QemuCond close_cv; > AioContext *ctx; > QEMUBH *req_bh;
> On Dec 15, 2022, at 4:56 AM, Cédric Le Goater <clg@redhat.com> wrote: > > On 11/9/22 00:13, John Johnson wrote: >> >> + DEFINE_PROP_UINT32("x-msg-timeout", VFIOUserPCIDevice, wait_time, 0), > > I see that patch 9 introduced : > > +static int wait_time = 5000; /* wait up to 5 sec for busy servers */ > > May be use a define instead and assign "x-msg-timeout" to this default > value. > > how do you plan to use the "x-msg-timeout" property ? > It was originally used to empirically discover a value that wouldn't timeout with the device servers we’re using. I kept in case new devices with longer response times are encountered. JJ
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 005fcf8..3ae3a13 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3729,6 +3729,9 @@ static void vfio_user_pci_realize(PCIDevice *pdev, Error **errp) if (udev->no_post) { proxy->flags |= VFIO_PROXY_NO_POST; } + if (udev->wait_time) { + proxy->wait_time = udev->wait_time; + } vfio_user_validate_version(proxy, &err); if (err != NULL) { @@ -3848,6 +3851,7 @@ static Property vfio_user_pci_dev_properties[] = { DEFINE_PROP_BOOL("secure-dma", VFIOUserPCIDevice, secure_dma, false), DEFINE_PROP_BOOL("x-send-queued", VFIOUserPCIDevice, send_queued, false), DEFINE_PROP_BOOL("x-no-posted-writes", VFIOUserPCIDevice, no_post, false), + DEFINE_PROP_UINT32("x-msg-timeout", VFIOUserPCIDevice, wait_time, 0), DEFINE_PROP_END_OF_LIST(), }; diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h index c4b8e5c..48b19ee 100644 --- a/hw/vfio/pci.h +++ b/hw/vfio/pci.h @@ -199,6 +199,7 @@ struct VFIOUserPCIDevice { bool secure_dma; /* disable shared mem for DMA */ bool send_queued; /* all sends are queued */ bool no_post; /* all regions write are sync */ + uint32_t wait_time; /* timeout for message replies */ }; /* Use uin32_t for vendor & device so PCI_ANY_ID expands and cannot match hw */ diff --git a/hw/vfio/user.c b/hw/vfio/user.c index ddf9e13..a9e6cf5 100644 --- a/hw/vfio/user.c +++ b/hw/vfio/user.c @@ -717,7 +717,8 @@ static void vfio_user_send_wait(VFIOProxy *proxy, VFIOUserHdr *hdr, if (ret == 0) { while (!msg->complete) { - if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, wait_time)) { + if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, + proxy->wait_time)) { VFIOUserMsgQ *list; list = msg->pending ? &proxy->pending : &proxy->outgoing; @@ -759,7 +760,8 @@ static void vfio_user_wait_reqs(VFIOProxy *proxy) msg = proxy->last_nowait; msg->type = VFIO_MSG_WAIT; while (!msg->complete) { - if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, wait_time)) { + if (!qemu_cond_timedwait(&msg->cv, &proxy->lock, + proxy->wait_time)) { VFIOUserMsgQ *list; list = msg->pending ? &proxy->pending : &proxy->outgoing; @@ -881,6 +883,7 @@ VFIOProxy *vfio_user_connect_dev(SocketAddress *addr, Error **errp) proxy->flags = VFIO_PROXY_CLIENT; proxy->state = VFIO_PROXY_CONNECTED; + proxy->wait_time = wait_time; qemu_mutex_init(&proxy->lock); qemu_cond_init(&proxy->close_cv); diff --git a/hw/vfio/user.h b/hw/vfio/user.h index d88ffe5..f711861 100644 --- a/hw/vfio/user.h +++ b/hw/vfio/user.h @@ -62,6 +62,7 @@ typedef struct VFIOProxy { uint64_t max_bitmap; uint64_t migr_pgsize; int flags; + uint32_t wait_time; QemuCond close_cv; AioContext *ctx; QEMUBH *req_bh;