Re: [PATCH for-next 4/4] RDMA/hns: Remove jiffies operation in disable interrupt context

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, May 18, 2019 at 07:55:00PM +0800, Lijun Ou wrote:
> From: Lang Cheng <chenglang@xxxxxxxxxx>
>
> 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@xxxxxxxxxx>
> ---
>  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
>



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux