Message ID | 20240202215332.118728-3-david@redhat.com |
---|---|
State | New |
Headers | show |
Series | libvhost-user: support more memslots and cleanup memslot handling code | expand |
On Fri, Feb 2, 2024 at 4:54 PM David Hildenbrand <david@redhat.com> wrote: > > Let's prepare for increasing VHOST_USER_MAX_RAM_SLOTS by dynamically > allocating dev->regions. We don't have any ABI guarantees (not > dynamically linked), so we can simply change the layout of VuDev. > > Let's zero out the memory, just as we used to do. > > Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Raphael Norwitz <raphael@enfabrica.net> > --- > subprojects/libvhost-user/libvhost-user.c | 11 +++++++++++ > subprojects/libvhost-user/libvhost-user.h | 2 +- > 2 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/subprojects/libvhost-user/libvhost-user.c b/subprojects/libvhost-user/libvhost-user.c > index 7e515ed15d..8a5a7a2295 100644 > --- a/subprojects/libvhost-user/libvhost-user.c > +++ b/subprojects/libvhost-user/libvhost-user.c > @@ -2171,6 +2171,8 @@ vu_deinit(VuDev *dev) > > free(dev->vq); > dev->vq = NULL; > + free(dev->regions); > + dev->regions = NULL; > } > > bool > @@ -2205,9 +2207,18 @@ vu_init(VuDev *dev, > dev->backend_fd = -1; > dev->max_queues = max_queues; > > + dev->regions = malloc(VHOST_USER_MAX_RAM_SLOTS * sizeof(dev->regions[0])); > + if (!dev->regions) { > + DPRINT("%s: failed to malloc mem regions\n", __func__); > + return false; > + } > + memset(dev->regions, 0, VHOST_USER_MAX_RAM_SLOTS * sizeof(dev->regions[0])); > + > dev->vq = malloc(max_queues * sizeof(dev->vq[0])); > if (!dev->vq) { > DPRINT("%s: failed to malloc virtqueues\n", __func__); > + free(dev->regions); > + dev->regions = NULL; > return false; > } > > diff --git a/subprojects/libvhost-user/libvhost-user.h b/subprojects/libvhost-user/libvhost-user.h > index c2352904f0..c882b4e3a2 100644 > --- a/subprojects/libvhost-user/libvhost-user.h > +++ b/subprojects/libvhost-user/libvhost-user.h > @@ -398,7 +398,7 @@ typedef struct VuDevInflightInfo { > struct VuDev { > int sock; > uint32_t nregions; > - VuDevRegion regions[VHOST_USER_MAX_RAM_SLOTS]; > + VuDevRegion *regions; > VuVirtq *vq; > VuDevInflightInfo inflight_info; > int log_call_fd; > -- > 2.43.0 > >
diff --git a/subprojects/libvhost-user/libvhost-user.c b/subprojects/libvhost-user/libvhost-user.c index 7e515ed15d..8a5a7a2295 100644 --- a/subprojects/libvhost-user/libvhost-user.c +++ b/subprojects/libvhost-user/libvhost-user.c @@ -2171,6 +2171,8 @@ vu_deinit(VuDev *dev) free(dev->vq); dev->vq = NULL; + free(dev->regions); + dev->regions = NULL; } bool @@ -2205,9 +2207,18 @@ vu_init(VuDev *dev, dev->backend_fd = -1; dev->max_queues = max_queues; + dev->regions = malloc(VHOST_USER_MAX_RAM_SLOTS * sizeof(dev->regions[0])); + if (!dev->regions) { + DPRINT("%s: failed to malloc mem regions\n", __func__); + return false; + } + memset(dev->regions, 0, VHOST_USER_MAX_RAM_SLOTS * sizeof(dev->regions[0])); + dev->vq = malloc(max_queues * sizeof(dev->vq[0])); if (!dev->vq) { DPRINT("%s: failed to malloc virtqueues\n", __func__); + free(dev->regions); + dev->regions = NULL; return false; } diff --git a/subprojects/libvhost-user/libvhost-user.h b/subprojects/libvhost-user/libvhost-user.h index c2352904f0..c882b4e3a2 100644 --- a/subprojects/libvhost-user/libvhost-user.h +++ b/subprojects/libvhost-user/libvhost-user.h @@ -398,7 +398,7 @@ typedef struct VuDevInflightInfo { struct VuDev { int sock; uint32_t nregions; - VuDevRegion regions[VHOST_USER_MAX_RAM_SLOTS]; + VuDevRegion *regions; VuVirtq *vq; VuDevInflightInfo inflight_info; int log_call_fd;
Let's prepare for increasing VHOST_USER_MAX_RAM_SLOTS by dynamically allocating dev->regions. We don't have any ABI guarantees (not dynamically linked), so we can simply change the layout of VuDev. Let's zero out the memory, just as we used to do. Signed-off-by: David Hildenbrand <david@redhat.com> --- subprojects/libvhost-user/libvhost-user.c | 11 +++++++++++ subprojects/libvhost-user/libvhost-user.h | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-)