Commit da392921 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Doug Ledford

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: 669cefb6 ("RDMA/hns: Remove jiffies operation in disable interrupt context")
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 836a0fbb
...@@ -34,8 +34,8 @@ ...@@ -34,8 +34,8 @@
#ifndef _HNS_ROCE_HEM_H #ifndef _HNS_ROCE_HEM_H
#define _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_SLEEP_TIME_INTERVAL 20
#define HW_SYNC_TIMEOUT_MSECS (25 * HW_SYNC_SLEEP_TIME_INTERVAL)
#define BT_CMD_SYNC_SHIFT 31 #define BT_CMD_SYNC_SHIFT 31
enum { enum {
......
...@@ -2467,7 +2467,7 @@ static int hns_roce_v1_clear_hem(struct hns_roce_dev *hr_dev, ...@@ -2467,7 +2467,7 @@ static int hns_roce_v1_clear_hem(struct hns_roce_dev *hr_dev,
end = HW_SYNC_TIMEOUT_MSECS; end = HW_SYNC_TIMEOUT_MSECS;
while (1) { while (1) {
if (readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) { 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"); dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n");
spin_unlock_irqrestore(&hr_dev->bt_cmd_lock, spin_unlock_irqrestore(&hr_dev->bt_cmd_lock,
flags); flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment