net/mlx5: make Rx queue reinitialization safer
authorAdrien Mazarguil <adrien.mazarguil@6wind.com>
Fri, 24 Jun 2016 13:18:03 +0000 (15:18 +0200)
committerBruce Richardson <bruce.richardson@intel.com>
Mon, 27 Jun 2016 14:17:52 +0000 (16:17 +0200)
commitcd9ea11454f50855facef7875c9d872ddd4dc662
tree9e0a9a220b6dc6fe4d2b999d70057d6528cd8834
parentc6cb3a8fb5da52bf9298c7cbf27d752863012044
net/mlx5: make Rx queue reinitialization safer

The primary purpose of rxq_rehash() function is to stop and restart
reception on a queue after re-posting buffers. This may fail if the array
that temporarily stores existing buffers for reuse cannot be allocated.

Update rxq_rehash() to work on the target queue directly (not through a
template copy) and avoid this allocation.

rxq_alloc_elts() is modified accordingly to take buffers from an existing
queue directly and update their refcount.

Unlike rxq_rehash(), rxq_setup() must work on a temporary structure but
should not allocate new mbufs from the pool while reinitializing an
existing queue. This is achieved by using the refcount-aware
rxq_alloc_elts() before overwriting queue data.

Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Signed-off-by: Vasily Philipov <vasilyf@mellanox.com>
drivers/net/mlx5/mlx5_rxq.c