Re: [PATCH 03/12] pm80xx : Free the tag when mpi_set_phy_profile_resp is received.

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

 



On Tue, Dec 24, 2019 at 5:41 AM Deepak Ukey <deepak.ukey@xxxxxxxxxxxxx> wrote:
>
> From: yuuzheng <yuuzheng@xxxxxxxxxx>
>
> In pm80xx driver, the command mpi_set_phy_profile_req is sent by host
> during boot to configure the phy profile such as analog setting page,
> rate control page. However, the tag is not freed when its response is
> received. As a result, 16 tags are missing for each HBA after boot.
> When NCQ is enabled with queue depth 16, it needs at least, 15 * 16 =
> 240 tags for each HBA to achieve the best performance. In current
> pm80xx driver with setting CCB_MAX = 256, the total number of tags in
> each HBA is 255 for data IO. Hence, without returning those tags to the
> pool after boot, some device will finally be forced to non-ncq mode by
> ATA layer due to excessive errors (i.e. LLDD cannot allocate tag for
> queued task).
>
> Signed-off-by: yuuzheng <yuuzheng@xxxxxxxxxx>
> Signed-off-by: Deepak Ukey <deepak.ukey@xxxxxxxxxxxxx>
> Signed-off-by: Viswas G <Viswas.G@xxxxxxxxxxxxx>
> Signed-off-by: Vishakha Channapattan <vishakhavc@xxxxxxxxxx>
> Signed-off-by: Bhavesh Jashnani <bjashnani@xxxxxxxxxx>
> Signed-off-by: Radha Ramachandran <radha@xxxxxxxxxx>
> Signed-off-by: Akshat Jain <akshatzen@xxxxxxxxxx>
The patch looks fine.
Acked-by: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx>
> ---
>  drivers/scsi/pm8001/pm80xx_hwi.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index d805fd036ddf..37b82d7aa3d7 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -3715,28 +3715,32 @@ static int mpi_flash_op_ext_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
>  static int mpi_set_phy_profile_resp(struct pm8001_hba_info *pm8001_ha,
>                         void *piomb)
>  {
> +       u32 tag;
>         u8 page_code;
> +       int rc = 0;
>         struct set_phy_profile_resp *pPayload =
>                 (struct set_phy_profile_resp *)(piomb + 4);
>         u32 ppc_phyid = le32_to_cpu(pPayload->ppc_phyid);
>         u32 status = le32_to_cpu(pPayload->status);
>
> +       tag = le32_to_cpu(pPayload->tag);
>         page_code = (u8)((ppc_phyid & 0xFF00) >> 8);
>         if (status) {
>                 /* status is FAILED */
>                 PM8001_FAIL_DBG(pm8001_ha,
>                         pm8001_printk("PhyProfile command failed  with status "
>                         "0x%08X \n", status));
> -               return -1;
> +               rc = -1;
>         } else {
>                 if (page_code != SAS_PHY_ANALOG_SETTINGS_PAGE) {
>                         PM8001_FAIL_DBG(pm8001_ha,
>                                 pm8001_printk("Invalid page code 0x%X\n",
>                                         page_code));
> -                       return -1;
> +                       rc = -1;
>                 }
>         }
> -       return 0;
> +       pm8001_tag_free(pm8001_ha, tag);
> +       return rc;
>  }
>
>  /**
> --
> 2.16.3
>



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux