Commit 51a0c00c authored by David S. Miller's avatar David S. Miller

Merge tag 'mlx5-updates-2017-10-06' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux

Saeed Mahameed says:

====================
Mellanox, mlx5 updates 2017-10-06

This series includes some shared code updates for kernel 4.15 to both
net-next and rdma-next trees.

The series includes mlx5 low level flow steering updates and optimizations
to support firmware command parallelism for flow steering requests from
Maor Gottlieb and two other small fixes from Matan and Maor.

One fix from Matan adds error handling for when the destination
list of the flow steering rule is full.

Maor introduced a patch to avoid NULL pointer dereference on steering cleanup.

Then Some refactoring patches needed by the series for code sharing purposes.
and split the Flow Table Entry (FTE) and Flow Group (FG) creation code to two parts:
    1) Object allocation - allocate the steering node and initialize
    its resources.

    2) The firmware command execution.

This change will give us the ability to take write lock on the
parent node (e.g. FG for FTE creating) only on the software data struct allocation
and creation part of the procedure where the synchronization is really required,
and will allow us to execute multiple firmware commands simultaneously and overcome the
firmware bottleneck.

Refactor the locking scheme of the mlx5 core flow steering as follows:

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.

Last patch adds FGs and FTEs memory pool, It is useful because these objects
are not small and could be allocated/deallocated many times.

This support improves the insertion rate of steering rules
from ~5k/sec to ~40k/sec.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 28f50eb2 a369d4ac
...@@ -66,6 +66,8 @@ enum fs_fte_status { ...@@ -66,6 +66,8 @@ enum fs_fte_status {
struct mlx5_flow_steering { struct mlx5_flow_steering {
struct mlx5_core_dev *dev; struct mlx5_core_dev *dev;
struct kmem_cache *fgs_cache;
struct kmem_cache *ftes_cache;
struct mlx5_flow_root_namespace *root_ns; struct mlx5_flow_root_namespace *root_ns;
struct mlx5_flow_root_namespace *fdb_root_ns; struct mlx5_flow_root_namespace *fdb_root_ns;
struct mlx5_flow_root_namespace *esw_egress_root_ns; struct mlx5_flow_root_namespace *esw_egress_root_ns;
...@@ -81,9 +83,12 @@ struct fs_node { ...@@ -81,9 +83,12 @@ struct fs_node {
struct fs_node *parent; struct fs_node *parent;
struct fs_node *root; struct fs_node *root;
/* lock the node for writing and traversing */ /* lock the node for writing and traversing */
struct mutex lock; struct rw_semaphore lock;
atomic_t refcount; atomic_t refcount;
void (*remove_func)(struct fs_node *); bool active;
void (*del_hw_func)(struct fs_node *);
void (*del_sw_func)(struct fs_node *);
atomic_t version;
}; };
struct mlx5_flow_rule { struct mlx5_flow_rule {
...@@ -120,7 +125,6 @@ struct mlx5_flow_table { ...@@ -120,7 +125,6 @@ struct mlx5_flow_table {
/* FWD rules that point on this flow table */ /* FWD rules that point on this flow table */
struct list_head fwd_rules; struct list_head fwd_rules;
u32 flags; u32 flags;
struct ida fte_allocator;
struct rhltable fgs_hash; struct rhltable fgs_hash;
}; };
...@@ -200,6 +204,7 @@ struct mlx5_flow_group { ...@@ -200,6 +204,7 @@ struct mlx5_flow_group {
struct mlx5_flow_group_mask mask; struct mlx5_flow_group_mask mask;
u32 start_index; u32 start_index;
u32 max_ftes; u32 max_ftes;
struct ida fte_allocator;
u32 id; u32 id;
struct rhashtable ftes_hash; struct rhashtable ftes_hash;
struct rhlist_head hash; struct rhlist_head hash;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment