RDMa/hns: Don’t stuck in endless timeout loop [Linux 5.3]

This Linux kernel change "RDMa/hns: Don’t stuck in endless timeout loop" is included in the Linux 5.3 release. This change is authored by Leon Romanovsky <leonro [at] mellanox.com> on Sun Jun 16 15:05:58 2019 +0300. The commit for this change in Linux stable tree is da39292 (patch).

RDMa/hns: Don't stuck in endless timeout loop

The "end" variable is declared as unsigned and can't be negative, it
leads to the situation where timeout limit is not honored, so let's
convert logic to ensure that loop is bounded.

drivers/infiniband/hw/hns/hns_roce_hw_v1.c: In function _hns_roce_v1_clear_hem_:
drivers/infiniband/hw/hns/hns_roce_hw_v1.c:2471:12: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
 2471 |    if (end < 0) {
      |            ^

Fixes: 669cefb654cb ("RDMA/hns: Remove jiffies operation in disable interrupt context")
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>

There are 4 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/infiniband/hw/hns/hns_roce_hem.h   | 2 +-
 drivers/infiniband/hw/hns/hns_roce_hw_v1.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.h b/drivers/infiniband/hw/hns/hns_roce_hem.h
index e865fc8..f1ccb8f 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hem.h
+++ b/drivers/infiniband/hw/hns/hns_roce_hem.h
@@ -34,8 +34,8 @@
 #ifndef _HNS_ROCE_HEM_H
 #define _HNS_ROCE_HEM_H

-#define HW_SYNC_TIMEOUT_MSECS      500
 #define HW_SYNC_SLEEP_TIME_INTERVAL    20
+#define HW_SYNC_TIMEOUT_MSECS           (25 * HW_SYNC_SLEEP_TIME_INTERVAL)
 #define BT_CMD_SYNC_SHIFT      31

 enum {
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
index cb00419..2c0bc25 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
@@ -2467,7 +2467,7 @@ static int hns_roce_v1_clear_hem(struct hns_roce_dev *hr_dev,
    end = HW_SYNC_TIMEOUT_MSECS;
    while (1) {
        if (readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) {
-           if (end < 0) {
+           if (!end) {
                dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n");
                spin_unlock_irqrestore(&hr_dev->bt_cmd_lock,
                    flags);

Leave a Reply

Your email address will not be published. Required fields are marked *