Message ID | d316b32f-3617-5f1a-8ae5-42a276ff9033@ozlabs.ru |
---|---|
State | Superseded |
Headers | show |
Alexey Kardashevskiy <aik@ozlabs.ru> writes: > On 02/08/17 04:14, Thomas Huth wrote: >> On 01.08.2017 08:39, Nikunj A Dadhania wrote: >>> Found that virtio-net is using a around 200K receive buffer per device, if we >>> connect more than 40 virtio-net devices the heap(8MB) gets over. Because of >>> which allocation starts failing and the VM does not boot. >>> >>> Use common receive buffer for all the virtio-net devices. This will reduce the >>> memory requirement per virtio-net device in slof. >> >> Not sure whether this is a really good idea... I think theoretically an >> OF client could open multiple network devices and use them in parallel - >> and then the devices would destroy their shared receive buffers mutually. >> Maybe you could change the code so that the buffers are only allocated >> when the device is opened, and released again when the device is closed >> again? > > Agree, something like this would make sense imho: Yes, similar thing, and we need virt-queues to be part of the private structure, so created a separate structure and embed net_driver within it. > > > diff --git a/include/netdriver.h b/include/netdriver.h > index d81134e..5fd1d6e 100644 > --- a/include/netdriver.h > +++ b/include/netdriver.h > @@ -19,6 +19,7 @@ typedef struct net_driver { > uint8_t mac_addr[6]; > uint32_t reg; > int running; > + void *dev; > } net_driver_t; > Regards Nikunj
diff --git a/include/netdriver.h b/include/netdriver.h index d81134e..5fd1d6e 100644 --- a/include/netdriver.h +++ b/include/netdriver.h @@ -19,6 +19,7 @@ typedef struct net_driver { uint8_t mac_addr[6]; uint32_t reg; int running; + void *dev; } net_driver_t; #endif diff --git a/lib/libvirtio/virtio-net.c b/lib/libvirtio/virtio-net.c index 2573031..bfbf718 100644 --- a/lib/libvirtio/virtio-net.c +++ b/lib/libvirtio/virtio-net.c @@ -197,6 +197,8 @@ dev_error: */ static int virtionet_term(net_driver_t *driver) { + struct virtio_device *dev = driver->dev; + dprintf("virtionet_term()\n"); if (driver->running == 0) @@ -210,6 +212,8 @@ static int virtionet_term(net_driver_t *driver) driver->running = 0; + /* free the buffers, etc */ + return 0; } @@ -334,6 +338,8 @@ net_driver_t *virtionet_open(struct virtio_device *dev) if (virtionet_init(driver)) goto FAIL; + driver->dev = dev; + return driver; FAIL: SLOF_free_mem(driver, sizeof(*driver));