diff mbox

virtio-net: use common receive buffer for devices

Message ID d316b32f-3617-5f1a-8ae5-42a276ff9033@ozlabs.ru
State Superseded
Headers show

Commit Message

Alexey Kardashevskiy Aug. 2, 2017, 4:33 a.m. UTC
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:

Comments

Nikunj A Dadhania Aug. 3, 2017, 5:11 a.m. UTC | #1
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 mbox

Patch

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));