]> www.infradead.org Git - nvme.git/commitdiff
net: hns3: fix invalid mutex between tc qdisc and dcb ets command issue
authorJijie Shao <shaojijie@huawei.com>
Wed, 6 Sep 2023 07:20:16 +0000 (15:20 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 7 Sep 2023 09:08:03 +0000 (11:08 +0200)
We hope that tc qdisc and dcb ets commands can not be used crosswise.
If we want to use any of the commands to configure tc,
We must use the other command to clear the existing configuration.

However, when we configure a single tc with tc qdisc,
we can still configure it with dcb ets.
Because we use mqprio_active as the tag of tc qdisc configuration,
but with dcb ets, we do not check mqprio_active.

This patch fix this issue by check mqprio_active before
executing the dcb ets command. and add dcb_ets_active to
replace HCLGE_FLAG_DCB_ENABLE and HCLGE_FLAG_MQPRIO_ENABLE
at the hclge layer,

Fixes: cacde272dd00 ("net: hns3: Add hclge_dcb module for the support of DCB feature")
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h

index a4b43bcd2f0c9c80ed96d529f988231dd456abe0..aaf1f42624a79b609e617b2700b0af82a2c5d81b 100644 (file)
@@ -814,6 +814,7 @@ struct hnae3_tc_info {
        u8 max_tc; /* Total number of TCs */
        u8 num_tc; /* Total number of enabled TCs */
        bool mqprio_active;
+       bool dcb_ets_active;
 };
 
 #define HNAE3_MAX_DSCP                 64
index fad5a5ff3cda54f5dfd4717a362d83cbac9e6358..b98301e205f7fff69b21f36a96e93ec358a371c1 100644 (file)
@@ -259,7 +259,7 @@ static int hclge_ieee_setets(struct hnae3_handle *h, struct ieee_ets *ets)
        int ret;
 
        if (!(hdev->dcbx_cap & DCB_CAP_DCBX_VER_IEEE) ||
-           hdev->flag & HCLGE_FLAG_MQPRIO_ENABLE)
+           h->kinfo.tc_info.mqprio_active)
                return -EINVAL;
 
        ret = hclge_ets_validate(hdev, ets, &num_tc, &map_changed);
@@ -275,10 +275,7 @@ static int hclge_ieee_setets(struct hnae3_handle *h, struct ieee_ets *ets)
        }
 
        hclge_tm_schd_info_update(hdev, num_tc);
-       if (num_tc > 1)
-               hdev->flag |= HCLGE_FLAG_DCB_ENABLE;
-       else
-               hdev->flag &= ~HCLGE_FLAG_DCB_ENABLE;
+       h->kinfo.tc_info.dcb_ets_active = num_tc > 1;
 
        ret = hclge_ieee_ets_to_tm_info(hdev, ets);
        if (ret)
@@ -487,7 +484,7 @@ static u8 hclge_getdcbx(struct hnae3_handle *h)
        struct hclge_vport *vport = hclge_get_vport(h);
        struct hclge_dev *hdev = vport->back;
 
-       if (hdev->flag & HCLGE_FLAG_MQPRIO_ENABLE)
+       if (h->kinfo.tc_info.mqprio_active)
                return 0;
 
        return hdev->dcbx_cap;
@@ -611,7 +608,8 @@ static int hclge_setup_tc(struct hnae3_handle *h,
        if (!test_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state))
                return -EBUSY;
 
-       if (hdev->flag & HCLGE_FLAG_DCB_ENABLE)
+       kinfo = &vport->nic.kinfo;
+       if (kinfo->tc_info.dcb_ets_active)
                return -EINVAL;
 
        ret = hclge_mqprio_qopt_check(hdev, mqprio_qopt);
@@ -625,7 +623,6 @@ static int hclge_setup_tc(struct hnae3_handle *h,
        if (ret)
                return ret;
 
-       kinfo = &vport->nic.kinfo;
        memcpy(&old_tc_info, &kinfo->tc_info, sizeof(old_tc_info));
        hclge_sync_mqprio_qopt(&kinfo->tc_info, mqprio_qopt);
        kinfo->tc_info.mqprio_active = tc > 0;
@@ -634,13 +631,6 @@ static int hclge_setup_tc(struct hnae3_handle *h,
        if (ret)
                goto err_out;
 
-       hdev->flag &= ~HCLGE_FLAG_DCB_ENABLE;
-
-       if (tc > 1)
-               hdev->flag |= HCLGE_FLAG_MQPRIO_ENABLE;
-       else
-               hdev->flag &= ~HCLGE_FLAG_MQPRIO_ENABLE;
-
        return hclge_notify_init_up(hdev);
 
 err_out:
index 0f50dba6cc4780792b88b077df493daf89225434..8ca368424436205c00951112a2ed7abaf4700153 100644 (file)
@@ -11026,6 +11026,7 @@ static void hclge_get_mdix_mode(struct hnae3_handle *handle,
 
 static void hclge_info_show(struct hclge_dev *hdev)
 {
+       struct hnae3_handle *handle = &hdev->vport->nic;
        struct device *dev = &hdev->pdev->dev;
 
        dev_info(dev, "PF info begin:\n");
@@ -11042,9 +11043,9 @@ static void hclge_info_show(struct hclge_dev *hdev)
        dev_info(dev, "This is %s PF\n",
                 hdev->flag & HCLGE_FLAG_MAIN ? "main" : "not main");
        dev_info(dev, "DCB %s\n",
-                hdev->flag & HCLGE_FLAG_DCB_ENABLE ? "enable" : "disable");
+                handle->kinfo.tc_info.dcb_ets_active ? "enable" : "disable");
        dev_info(dev, "MQPRIO %s\n",
-                hdev->flag & HCLGE_FLAG_MQPRIO_ENABLE ? "enable" : "disable");
+                handle->kinfo.tc_info.mqprio_active ? "enable" : "disable");
        dev_info(dev, "Default tx spare buffer size: %u\n",
                 hdev->tx_spare_buf_size);
 
index ec233ec57222aa8e76adcda2bce6e941b9e4129b..7bc2049b723daa387aba2a083dc526a2e68083ba 100644 (file)
@@ -919,8 +919,6 @@ struct hclge_dev {
 
 #define HCLGE_FLAG_MAIN                        BIT(0)
 #define HCLGE_FLAG_DCB_CAPABLE         BIT(1)
-#define HCLGE_FLAG_DCB_ENABLE          BIT(2)
-#define HCLGE_FLAG_MQPRIO_ENABLE       BIT(3)
        u32 flag;
 
        u32 pkt_buf_size; /* Total pf buf size for tx/rx */