@@ -46,6 +46,10 @@ struct arfs_table {
4646 struct hlist_head rules_hash [ARFS_HASH_SIZE ];
4747};
4848
49+ enum {
50+ MLX5E_ARFS_STATE_ENABLED ,
51+ };
52+
4953enum arfs_type {
5054 ARFS_IPV4_TCP ,
5155 ARFS_IPV6_TCP ,
@@ -60,6 +64,7 @@ struct mlx5e_arfs_tables {
6064 spinlock_t arfs_lock ;
6165 int last_filter_id ;
6266 struct workqueue_struct * wq ;
67+ unsigned long state ;
6368};
6469
6570struct arfs_tuple {
@@ -170,6 +175,8 @@ int mlx5e_arfs_enable(struct mlx5e_flow_steering *fs)
170175 return err ;
171176 }
172177 }
178+ set_bit (MLX5E_ARFS_STATE_ENABLED , & arfs -> state );
179+
173180 return 0 ;
174181}
175182
@@ -455,6 +462,8 @@ static void arfs_del_rules(struct mlx5e_flow_steering *fs)
455462 int i ;
456463 int j ;
457464
465+ clear_bit (MLX5E_ARFS_STATE_ENABLED , & arfs -> state );
466+
458467 spin_lock_bh (& arfs -> arfs_lock );
459468 mlx5e_for_each_arfs_rule (rule , htmp , arfs -> arfs_tables , i , j ) {
460469 hlist_del_init (& rule -> hlist );
@@ -627,17 +636,8 @@ static void arfs_handle_work(struct work_struct *work)
627636 struct mlx5_flow_handle * rule ;
628637
629638 arfs = mlx5e_fs_get_arfs (priv -> fs );
630- mutex_lock (& priv -> state_lock );
631- if (!test_bit (MLX5E_STATE_OPENED , & priv -> state )) {
632- spin_lock_bh (& arfs -> arfs_lock );
633- hlist_del (& arfs_rule -> hlist );
634- spin_unlock_bh (& arfs -> arfs_lock );
635-
636- mutex_unlock (& priv -> state_lock );
637- kfree (arfs_rule );
638- goto out ;
639- }
640- mutex_unlock (& priv -> state_lock );
639+ if (!test_bit (MLX5E_ARFS_STATE_ENABLED , & arfs -> state ))
640+ return ;
641641
642642 if (!arfs_rule -> rule ) {
643643 rule = arfs_add_rule (priv , arfs_rule );
@@ -753,6 +753,11 @@ int mlx5e_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
753753 return - EPROTONOSUPPORT ;
754754
755755 spin_lock_bh (& arfs -> arfs_lock );
756+ if (!test_bit (MLX5E_ARFS_STATE_ENABLED , & arfs -> state )) {
757+ spin_unlock_bh (& arfs -> arfs_lock );
758+ return - EPERM ;
759+ }
760+
756761 arfs_rule = arfs_find_rule (arfs_t , & fk );
757762 if (arfs_rule ) {
758763 if (arfs_rule -> rxq == rxq_index || work_busy (& arfs_rule -> arfs_work )) {
0 commit comments