net/mlx5: Support multiple updates of steering rules in parallel
authorMaor Gottlieb <maorg@mellanox.com>
Sun, 27 Aug 2017 06:19:11 +0000 (09:19 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 26 Sep 2017 17:52:03 +0000 (20:52 +0300)
commitbd71b08ec2ee4504bcc3b37a9283ce15e93dfacd
tree7bfff28b77ff1a56eebb0455c3ce55d14676e76c
parentc7784b1c8ab3f44dc2e643a8feb77584792c9108
net/mlx5: Support multiple updates of steering rules in parallel

Most of the time spent on adding new flow steering rule
is executing the firmware command.
The most common action is adding a new flow steering entry.
In order to enhance the update rate we parallelize the
commands by doing the following:

1) Replace the mutex lock with readers-writers semaphore and take
the write lock only when necessary (e.g. allocating a new flow
table entry index or adding a node to the parent's children list).
When we try to find a suitable child in the parent's children list
(e.g. search for flow group with the same match_criteria of the rule)
then we only take the read lock.

2) Add versioning mechanism - each steering entity (FT, FG, FTE, DST)
will have an incremental version. The version is increased when the
entity is changed (e.g. when a new FTE was added to FG - the FG's
version is increased).
Versioning is used in order to determine if the last traverse of an
entity's children is valid or a rescan under write lock is required.

This support improves the insertion rate of steering rules
from ~5k/sec to ~40k/sec.

Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h