OSDN Git Service

net: hns3: split function hclge_get_fd_rule_info()
authorJian Shen <shenjian15@huawei.com>
Thu, 2 Dec 2021 08:35:58 +0000 (16:35 +0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 2 Dec 2021 11:53:42 +0000 (11:53 +0000)
Currently the function hclge_get_fd_rule_info() is a bit long.
Split it to several small functions, to improve readability.

Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index 81492a9..e813a06 100644 (file)
@@ -7172,6 +7172,37 @@ static void hclge_fd_get_ext_info(struct ethtool_rx_flow_spec *fs,
        }
 }
 
+static struct hclge_fd_rule *hclge_get_fd_rule(struct hclge_dev *hdev,
+                                              u16 location)
+{
+       struct hclge_fd_rule *rule = NULL;
+       struct hlist_node *node2;
+
+       hlist_for_each_entry_safe(rule, node2, &hdev->fd_rule_list, rule_node) {
+               if (rule->location == location)
+                       return rule;
+               else if (rule->location > location)
+                       return NULL;
+       }
+
+       return NULL;
+}
+
+static void hclge_fd_get_ring_cookie(struct ethtool_rx_flow_spec *fs,
+                                    struct hclge_fd_rule *rule)
+{
+       if (rule->action == HCLGE_FD_ACTION_DROP_PACKET) {
+               fs->ring_cookie = RX_CLS_FLOW_DISC;
+       } else {
+               u64 vf_id;
+
+               fs->ring_cookie = rule->queue_id;
+               vf_id = rule->vf_id;
+               vf_id <<= ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF;
+               fs->ring_cookie |= vf_id;
+       }
+}
+
 static int hclge_get_fd_rule_info(struct hnae3_handle *handle,
                                  struct ethtool_rxnfc *cmd)
 {
@@ -7179,7 +7210,6 @@ static int hclge_get_fd_rule_info(struct hnae3_handle *handle,
        struct hclge_fd_rule *rule = NULL;
        struct hclge_dev *hdev = vport->back;
        struct ethtool_rx_flow_spec *fs;
-       struct hlist_node *node2;
 
        if (!hnae3_dev_fd_supported(hdev))
                return -EOPNOTSUPP;
@@ -7188,14 +7218,9 @@ static int hclge_get_fd_rule_info(struct hnae3_handle *handle,
 
        spin_lock_bh(&hdev->fd_rule_lock);
 
-       hlist_for_each_entry_safe(rule, node2, &hdev->fd_rule_list, rule_node) {
-               if (rule->location >= fs->location)
-                       break;
-       }
-
-       if (!rule || fs->location != rule->location) {
+       rule = hclge_get_fd_rule(hdev, fs->location);
+       if (!rule) {
                spin_unlock_bh(&hdev->fd_rule_lock);
-
                return -ENOENT;
        }
 
@@ -7233,16 +7258,7 @@ static int hclge_get_fd_rule_info(struct hnae3_handle *handle,
 
        hclge_fd_get_ext_info(fs, rule);
 
-       if (rule->action == HCLGE_FD_ACTION_DROP_PACKET) {
-               fs->ring_cookie = RX_CLS_FLOW_DISC;
-       } else {
-               u64 vf_id;
-
-               fs->ring_cookie = rule->queue_id;
-               vf_id = rule->vf_id;
-               vf_id <<= ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF;
-               fs->ring_cookie |= vf_id;
-       }
+       hclge_fd_get_ring_cookie(fs, rule);
 
        spin_unlock_bh(&hdev->fd_rule_lock);