• Julian Wiedmann's avatar
    s390/qeth: implement smarter resizing of the RX buffer pool · 5d4f7856
    Julian Wiedmann authored
    The RX buffer pool is allocated in qeth_alloc_qdio_queues().
    A subsequent pool resizing is then handled in a very simple way:
    first free the current pool, then allocate a new pool of the requested
    size.
    
    There's two ways where this can go wrong:
    1. if the resize action happens _before_ the initial pool was allocated,
       then a subsequent initialization will call qeth_alloc_qdio_queues()
       and fill the pool with a second(!) set of pages. We consume twice the
       planned amount of memory.
       This is easy to fix - just skip the resizing if the queues haven't
       been allocated yet.
    2. if the initial pool was created by qeth_alloc_qdio_queues() but a
       subsequent resizing fails, then the device has no(!) RX buffer pool.
       The next initialization will _not_ call qeth_alloc_qdio_queues(), and
       attempting to back the RX buffers with pages in
       qeth_init_qdio_queues() will fail.
       Not very difficult to fix either - instead of re-allocating the whole
       pool, just allocate/free as many entries to match the desired size.
    
    Fixes: 4a71df50 ("qeth: new qeth device driver")
    Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5d4f7856
qeth_core_main.c 177 KB