mvpp2: percpu buffers
authorMatteo Croce <mcroce@redhat.com>
Mon, 2 Sep 2019 10:21:37 +0000 (12:21 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Sep 2019 19:07:46 +0000 (12:07 -0700)
commit7d04b0b13b1175ce0c4bdc77f1278c1f120f874f
tree8c79108cdd29d552009e4d09acc23d9e1be51e02
parent136163618e3a9db403ef832ac32ab0b173ef503e
mvpp2: percpu buffers

Every mvpp2 unit can use up to 8 buffers mapped by the BM (the HW buffer
manager). The HW will place the frames in the buffer pool depending on the
frame size: short (< 128 bytes), long (< 1664) or jumbo (up to 9856).

As any unit can have up to 4 ports, the driver allocates only 2 pools,
one for small and one long frames, and share them between ports.
When the first port MTU is set higher than 1664 bytes, a third pool is
allocated for jumbo frames.

This shared allocation makes impossible to use percpu allocators,
and creates contention between HW queues.

If possible, i.e. if the number of possible CPU are less than 8 and jumbo
frames are not used, switch to a new scheme: allocate 8 per-cpu pools for
short and long frames and bind every pool to an RXQ.

When the first port MTU is set higher than 1664 bytes, the allocation
scheme is reverted to the old behaviour (3 shared pools), and when all
ports MTU are lowered, the per-cpu buffers are allocated again.

Signed-off-by: Matteo Croce <mcroce@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvpp2/mvpp2.h
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c