]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/hns: Optimize cmd init and mode selection for hip08
authorYixian Liu <liuyixian@huawei.com>
Thu, 29 Aug 2019 08:41:41 +0000 (16:41 +0800)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 16 Sep 2019 13:52:20 +0000 (10:52 -0300)
There are two modes for mailbox command (cmd) queue, i.e., event mode and
poll mode. For each mode, we use corresponding semaphores to protect the
cmd queue resource competition, so called event_sem and poll_sem. During
cmd init, both semaphores are initialized and poll mode is selected.
Thus, there is no need to up poll_sema again in cmd_use_polling.

Furthermore, there is no need to down the sema of the other side while
switching mode. This patch aims to decouple the switch between event mode
and poll mode of cmd.

Link: https://lore.kernel.org/r/1567068102-56919-2-git-send-email-liweihang@hisilicon.com
Signed-off-by: Yixian Liu <liuyixian@huawei.com>
Signed-off-by: Weihang Li <liweihang@hisilicon.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hns/hns_roce_cmd.c
drivers/infiniband/hw/hns/hns_roce_main.c

index ade26faade8dc505d1bcfc3b14db399956c93413..455d533dd7c4aabecb53104b6ca79be795008b05 100644 (file)
@@ -251,23 +251,15 @@ int hns_roce_cmd_use_events(struct hns_roce_dev *hr_dev)
        hr_cmd->token_mask = CMD_TOKEN_MASK;
        hr_cmd->use_events = 1;
 
-       down(&hr_cmd->poll_sem);
-
        return 0;
 }
 
 void hns_roce_cmd_use_polling(struct hns_roce_dev *hr_dev)
 {
        struct hns_roce_cmdq *hr_cmd = &hr_dev->cmd;
-       int i;
-
-       hr_cmd->use_events = 0;
-
-       for (i = 0; i < hr_cmd->max_cmds; ++i)
-               down(&hr_cmd->event_sem);
 
        kfree(hr_cmd->context);
-       up(&hr_cmd->poll_sem);
+       hr_cmd->use_events = 0;
 }
 
 struct hns_roce_cmd_mailbox
index 1b757cc924c3d3fed29a13fee45d0d11cc5e206f..b5d196c119eec09b5c6b52c8f62d8b384c54d999 100644 (file)
@@ -902,6 +902,7 @@ int hns_roce_init(struct hns_roce_dev *hr_dev)
                goto error_failed_cmd_init;
        }
 
+       /* EQ depends on poll mode, event mode depends on EQ */
        ret = hr_dev->hw->init_eq(hr_dev);
        if (ret) {
                dev_err(dev, "eq init failed!\n");
@@ -911,8 +912,9 @@ int hns_roce_init(struct hns_roce_dev *hr_dev)
        if (hr_dev->cmd_mod) {
                ret = hns_roce_cmd_use_events(hr_dev);
                if (ret) {
-                       dev_err(dev, "Switch to event-driven cmd failed!\n");
-                       goto error_failed_use_event;
+                       dev_warn(dev,
+                                "Cmd event  mode failed, set back to poll!\n");
+                       hns_roce_cmd_use_polling(hr_dev);
                }
        }
 
@@ -955,8 +957,6 @@ error_failed_setup_hca:
 error_failed_init_hem:
        if (hr_dev->cmd_mod)
                hns_roce_cmd_use_polling(hr_dev);
-
-error_failed_use_event:
        hr_dev->hw->cleanup_eq(hr_dev);
 
 error_failed_eq_table: