Message ID | 1558180500-93157-5-git-send-email-oulijun@huawei.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fixes for hns | expand |
On Sat, May 18, 2019 at 07:55:00PM +0800, Lijun Ou wrote: > From: Lang Cheng <chenglang@huawei.com> > > In some functions, the jiffies operation is unnecessary, and we > can control delay using the xdelay function only. Especially, > in hns_roce_v1_clear_hem, the function calls spin_lock_irqsave, > the context disables interrupt , so we can not use jiffies and > xsleep. What does it mean "xdelay and xsleep"? > > Signed-off-by: Lang Cheng <chenglang@huawei.com> > --- > drivers/infiniband/hw/hns/hns_roce_hem.c | 21 +++++++++++---------- > drivers/infiniband/hw/hns/hns_roce_hw_v1.c | 19 ++++++++++--------- > 2 files changed, 21 insertions(+), 19 deletions(-) > > diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c > index 8e29dbb..d0eacd8 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_hem.c > +++ b/drivers/infiniband/hw/hns/hns_roce_hem.c > @@ -376,18 +376,19 @@ static int hns_roce_set_hem(struct hns_roce_dev *hr_dev, > > bt_cmd = hr_dev->reg_base + ROCEE_BT_CMD_H_REG; > > - end = msecs_to_jiffies(HW_SYNC_TIMEOUT_MSECS) + jiffies; > - while (1) { > - if (readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) { > - if (!(time_before(jiffies, end))) { > - dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n"); > - spin_unlock_irqrestore(lock, flags); > - return -EBUSY; > - } > - } else { > + end = HW_SYNC_TIMEOUT_MSECS; > + while (end) { > + if (!readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) > break; > - } > + > mdelay(HW_SYNC_SLEEP_TIME_INTERVAL); > + end -= HW_SYNC_SLEEP_TIME_INTERVAL; > + } > + > + if (end <= 0) { end is unsigned and can't be negative. > + dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n"); > + spin_unlock_irqrestore(lock, flags); > + return -EBUSY; > } > > bt_cmd_l = (u32)bt_ba; > diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c > index 722134f..d82a832 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c > +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c > @@ -965,8 +965,7 @@ static int hns_roce_v1_recreate_lp_qp(struct hns_roce_dev *hr_dev) > struct hns_roce_free_mr *free_mr; > struct hns_roce_v1_priv *priv; > struct completion comp; > - unsigned long end = > - msecs_to_jiffies(HNS_ROCE_V1_RECREATE_LP_QP_TIMEOUT_MSECS) + jiffies; > + unsigned long end = HNS_ROCE_V1_RECREATE_LP_QP_TIMEOUT_MSECS; > > priv = (struct hns_roce_v1_priv *)hr_dev->priv; > free_mr = &priv->free_mr; > @@ -986,10 +985,11 @@ static int hns_roce_v1_recreate_lp_qp(struct hns_roce_dev *hr_dev) > > queue_work(free_mr->free_mr_wq, &(lp_qp_work->work)); > > - while (time_before_eq(jiffies, end)) { > + while (end) { > if (try_wait_for_completion(&comp)) > return 0; > msleep(HNS_ROCE_V1_RECREATE_LP_QP_WAIT_VALUE); > + end -= HNS_ROCE_V1_RECREATE_LP_QP_WAIT_VALUE; > } > > lp_qp_work->comp_flag = 0; > @@ -1103,8 +1103,7 @@ static int hns_roce_v1_dereg_mr(struct hns_roce_dev *hr_dev, > struct hns_roce_free_mr *free_mr; > struct hns_roce_v1_priv *priv; > struct completion comp; > - unsigned long end = > - msecs_to_jiffies(HNS_ROCE_V1_FREE_MR_TIMEOUT_MSECS) + jiffies; > + unsigned long end = HNS_ROCE_V1_FREE_MR_TIMEOUT_MSECS ; > unsigned long start = jiffies; > int npages; > int ret = 0; > @@ -1134,10 +1133,11 @@ static int hns_roce_v1_dereg_mr(struct hns_roce_dev *hr_dev, > > queue_work(free_mr->free_mr_wq, &(mr_work->work)); > > - while (time_before_eq(jiffies, end)) { > + while (end) { > if (try_wait_for_completion(&comp)) > goto free_mr; > msleep(HNS_ROCE_V1_FREE_MR_WAIT_VALUE); > + end -= HNS_ROCE_V1_FREE_MR_WAIT_VALUE; > } > > mr_work->comp_flag = 0; > @@ -2464,10 +2464,10 @@ static int hns_roce_v1_clear_hem(struct hns_roce_dev *hr_dev, > > bt_cmd = hr_dev->reg_base + ROCEE_BT_CMD_H_REG; > > - end = msecs_to_jiffies(HW_SYNC_TIMEOUT_MSECS) + jiffies; > + end = HW_SYNC_TIMEOUT_MSECS; > while (1) { > if (readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) { > - if (!(time_before(jiffies, end))) { > + if (end < 0) { > dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n"); > spin_unlock_irqrestore(&hr_dev->bt_cmd_lock, > flags); > @@ -2476,7 +2476,8 @@ static int hns_roce_v1_clear_hem(struct hns_roce_dev *hr_dev, > } else { > break; > } > - msleep(HW_SYNC_SLEEP_TIME_INTERVAL); > + mdelay(HW_SYNC_SLEEP_TIME_INTERVAL); > + end -= HW_SYNC_SLEEP_TIME_INTERVAL; > } > > bt_cmd_val[0] = (__le32)bt_ba; > -- > 1.9.1 >
diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c index 8e29dbb..d0eacd8 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hem.c +++ b/drivers/infiniband/hw/hns/hns_roce_hem.c @@ -376,18 +376,19 @@ static int hns_roce_set_hem(struct hns_roce_dev *hr_dev, bt_cmd = hr_dev->reg_base + ROCEE_BT_CMD_H_REG; - end = msecs_to_jiffies(HW_SYNC_TIMEOUT_MSECS) + jiffies; - while (1) { - if (readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) { - if (!(time_before(jiffies, end))) { - dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n"); - spin_unlock_irqrestore(lock, flags); - return -EBUSY; - } - } else { + end = HW_SYNC_TIMEOUT_MSECS; + while (end) { + if (!readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) break; - } + mdelay(HW_SYNC_SLEEP_TIME_INTERVAL); + end -= HW_SYNC_SLEEP_TIME_INTERVAL; + } + + if (end <= 0) { + dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n"); + spin_unlock_irqrestore(lock, flags); + return -EBUSY; } bt_cmd_l = (u32)bt_ba; diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c index 722134f..d82a832 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c @@ -965,8 +965,7 @@ static int hns_roce_v1_recreate_lp_qp(struct hns_roce_dev *hr_dev) struct hns_roce_free_mr *free_mr; struct hns_roce_v1_priv *priv; struct completion comp; - unsigned long end = - msecs_to_jiffies(HNS_ROCE_V1_RECREATE_LP_QP_TIMEOUT_MSECS) + jiffies; + unsigned long end = HNS_ROCE_V1_RECREATE_LP_QP_TIMEOUT_MSECS; priv = (struct hns_roce_v1_priv *)hr_dev->priv; free_mr = &priv->free_mr; @@ -986,10 +985,11 @@ static int hns_roce_v1_recreate_lp_qp(struct hns_roce_dev *hr_dev) queue_work(free_mr->free_mr_wq, &(lp_qp_work->work)); - while (time_before_eq(jiffies, end)) { + while (end) { if (try_wait_for_completion(&comp)) return 0; msleep(HNS_ROCE_V1_RECREATE_LP_QP_WAIT_VALUE); + end -= HNS_ROCE_V1_RECREATE_LP_QP_WAIT_VALUE; } lp_qp_work->comp_flag = 0; @@ -1103,8 +1103,7 @@ static int hns_roce_v1_dereg_mr(struct hns_roce_dev *hr_dev, struct hns_roce_free_mr *free_mr; struct hns_roce_v1_priv *priv; struct completion comp; - unsigned long end = - msecs_to_jiffies(HNS_ROCE_V1_FREE_MR_TIMEOUT_MSECS) + jiffies; + unsigned long end = HNS_ROCE_V1_FREE_MR_TIMEOUT_MSECS ; unsigned long start = jiffies; int npages; int ret = 0; @@ -1134,10 +1133,11 @@ static int hns_roce_v1_dereg_mr(struct hns_roce_dev *hr_dev, queue_work(free_mr->free_mr_wq, &(mr_work->work)); - while (time_before_eq(jiffies, end)) { + while (end) { if (try_wait_for_completion(&comp)) goto free_mr; msleep(HNS_ROCE_V1_FREE_MR_WAIT_VALUE); + end -= HNS_ROCE_V1_FREE_MR_WAIT_VALUE; } mr_work->comp_flag = 0; @@ -2464,10 +2464,10 @@ static int hns_roce_v1_clear_hem(struct hns_roce_dev *hr_dev, bt_cmd = hr_dev->reg_base + ROCEE_BT_CMD_H_REG; - end = msecs_to_jiffies(HW_SYNC_TIMEOUT_MSECS) + jiffies; + end = HW_SYNC_TIMEOUT_MSECS; while (1) { if (readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) { - if (!(time_before(jiffies, end))) { + if (end < 0) { dev_err(dev, "Write bt_cmd err,hw_sync is not zero.\n"); spin_unlock_irqrestore(&hr_dev->bt_cmd_lock, flags); @@ -2476,7 +2476,8 @@ static int hns_roce_v1_clear_hem(struct hns_roce_dev *hr_dev, } else { break; } - msleep(HW_SYNC_SLEEP_TIME_INTERVAL); + mdelay(HW_SYNC_SLEEP_TIME_INTERVAL); + end -= HW_SYNC_SLEEP_TIME_INTERVAL; } bt_cmd_val[0] = (__le32)bt_ba;