Re: [PATCH for-next 1/9] RDMA/hns: Refactor cmd init and mode selection for hip08

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

 



On Wed, Aug 21, 2019 at 09:14:28PM +0800, Lijun Ou wrote:
> From: Yixian Liu <liuyixian@xxxxxxxxxx>
>
> This patch refactor the initialization of cmd, and also for the cmd
> mode selection on event and poll mode.
>
> Signed-off-by: Yixian Liu <liuyixian@xxxxxxxxxx>
> Signed-off-by: Lang Chen <chenglang@xxxxxxxxxx>
> ---
>  drivers/infiniband/hw/hns/hns_roce_cmd.c  | 14 ++++----------
>  drivers/infiniband/hw/hns/hns_roce_main.c | 18 ++++++++----------
>  2 files changed, 12 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/infiniband/hw/hns/hns_roce_cmd.c b/drivers/infiniband/hw/hns/hns_roce_cmd.c
> index ade26fa..547002f 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_cmd.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_cmd.c
> @@ -251,23 +251,17 @@ 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);
> +	if (hr_cmd->use_events) {

Ensure that hr_cmd->context == NULL in places where it shouldn't be
kfreed and remove this "if (hr_cmd->use_events)".

Thanks
.


> +		kfree(hr_cmd->context);
> +		hr_cmd->use_events = 0;
> +	}
>  }
>
>  struct hns_roce_cmd_mailbox
> diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c
> index 1b757cc..f3b2f67 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_main.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_main.c
> @@ -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);
>  		}
>  	}
>
> @@ -928,12 +930,10 @@ int hns_roce_init(struct hns_roce_dev *hr_dev)
>  		goto error_failed_setup_hca;
>  	}
>
> -	if (hr_dev->hw->hw_init) {
> -		ret = hr_dev->hw->hw_init(hr_dev);
> -		if (ret) {
> -			dev_err(dev, "hw_init failed!\n");
> -			goto error_failed_engine_init;
> -		}
> +	ret = hr_dev->hw->hw_init(hr_dev);
> +	if (ret) {
> +		dev_err(dev, "hw_init failed!\n");
> +		goto error_failed_engine_init;
>  	}
>
>  	ret = hns_roce_register_device(hr_dev);
> @@ -955,8 +955,6 @@ int hns_roce_init(struct hns_roce_dev *hr_dev)
>  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:
> --
> 2.8.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