All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tomas Henzl <thenzl@redhat.com>
To: Viswas G <Viswas.G@pmcs.com>,
	"linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>
Cc: Vasanthalakshmi Tharmarajan
	<Vasanthalakshmi.Tharmarajan@pmcs.com>,
	Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Subject: Re: [PATCH 3/4] pm8001: add a new spinlock to protect the CCB
Date: Fri, 27 Jun 2014 12:21:22 +0200	[thread overview]
Message-ID: <53AD45A2.1030600@redhat.com> (raw)
In-Reply-To: <DB8BCD22E410A84DA91083F3479A3DB31CD56D32@BBYEXM02.pmc-sierra.internal>

On 06/27/2014 08:09 AM, Viswas G wrote:
> HI Tomas,
>
> This lock is not needed as we are already protecting the tag allocation and freeing with the pm8001_ha->lock. We are always acquiring this lock before calling 
> pm8001_tag_alloc().
>
> We are allocating and freeing the tag in following paths, 
>
> 1) Request/Response path : This we are protecting using pm8001_ha->lock.
> 2)Driver initialization : We are not using the lock here . As there only one will be running, we don't need a lock here.
>  
> So there is no need of a specific lock for tag allocation.

I looked at and tested the pm8001_ctl_bios_version_show. From this function the 
pm8001_chip_get_nvmd_req is invoked and there is a new 'tag' allocated.
I have noticed your lock nowhere in the path, in addition I was able to trigger this -
[  813.749060] pm80xx mpi_sata_completion 1991:task null
[  813.758439] pm80xx mpi_sata_completion 1991:task null
[  813.809356] pm80xx mpi_sata_completion 1991:task null
[  813.819881] pm80xx mpi_sata_completion 1991:task null
[  813.829086] pm80xx mpi_sata_completion 1991:task null
[  844.376825] pm80xx pm8001_mpi_task_abort_resp 3776:task abort failed status 0x6 ,tag = 0x2, scp= 0x0
[  844.387057] pm80xx pm8001_mpi_task_abort_resp 3776:task abort failed status 0x6 ,tag = 0x2, scp= 0x0
[  844.397316] pm80xx pm8001_mpi_task_abort_resp 3776:task abort failed status 0x6 ,tag = 0x2, scp= 0x0
[  844.406550] pm80xx pm8001_abort_task 1246:rc= 5
[  844.411142] pm80xx pm8001_query_task 1169::rc= 5
and the system became 'unstable'.

--tm

>
> Regards,
> Viswas G
>
> -----Original Message-----
> From: Tomas Henzl [mailto:thenzl@redhat.com] 
> Sent: Thursday, June 26, 2014 8:48 PM
> To: linux-scsi@vger.kernel.org
> Cc: zzzAnand Kumar Santhanam(Nov-20-2013); Vasanthalakshmi Tharmarajan; Suresh Thiagarajan; Viswas G; Tomas Henzl
> Subject: [PATCH 3/4] pm8001: add a new spinlock to protect the CCB
>
> Patch adds a new spinlock to protect the ccb management.
> It may happen that concurrent threads become the same tag value from the 'alloc' function', the spinlock prevents this situation.
>
> Signed-off-by: Tomas Henzl <thenzl@redhat.com>
> ---
>  drivers/scsi/pm8001/pm8001_init.c | 1 +  drivers/scsi/pm8001/pm8001_sas.c  | 7 ++++++-  drivers/scsi/pm8001/pm8001_sas.h  | 1 +
>  3 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
> index c4f31b21..56b61e5 100644
> --- a/drivers/scsi/pm8001/pm8001_init.c
> +++ b/drivers/scsi/pm8001/pm8001_init.c
> @@ -246,6 +246,7 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,  {
>  	int i;
>  	spin_lock_init(&pm8001_ha->lock);
> +	spin_lock_init(&pm8001_ha->bitmap_lock);
>  	PM8001_INIT_DBG(pm8001_ha,
>  		pm8001_printk("pm8001_alloc: PHY:%x\n",
>  				pm8001_ha->chip->n_phy));
> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
> index be55859..34cea82 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.c
> +++ b/drivers/scsi/pm8001/pm8001_sas.c
> @@ -77,11 +77,16 @@ inline int pm8001_tag_alloc(struct pm8001_hba_info *pm8001_ha, u32 *tag_out)  {
>  	unsigned int tag;
>  	void *bitmap = pm8001_ha->tags;
> +	unsigned long flags;
>  
> +	spin_lock_irqsave(&pm8001_ha->bitmap_lock, flags);
>  	tag = find_first_zero_bit(bitmap, pm8001_ha->tags_num);
> -	if (tag >= pm8001_ha->tags_num)
> +	if (tag >= pm8001_ha->tags_num) {
> +		spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags);
>  		return -SAS_QUEUE_FULL;
> +	}
>  	set_bit(tag, bitmap);
> +	spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags);
>  	*tag_out = tag;
>  	return 0;
>  }
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
> index 14106ad..f6b2ac5 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -475,6 +475,7 @@ struct pm8001_hba_info {
>  	struct list_head	list;
>  	unsigned long		flags;
>  	spinlock_t		lock;/* host-wide lock */
> +	spinlock_t		bitmap_lock;
>  	struct pci_dev		*pdev;/* our device */
>  	struct device		*dev;
>  	struct pm8001_hba_memspace io_mem[6];
> --
> 1.8.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


  reply	other threads:[~2014-06-27 10:21 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-26 15:17 [PATCH 3/4] pm8001: add a new spinlock to protect the CCB Tomas Henzl
2014-06-27  6:09 ` Viswas G
2014-06-27 10:21   ` Tomas Henzl [this message]
2014-07-02  9:42     ` Suresh Thiagarajan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53AD45A2.1030600@redhat.com \
    --to=thenzl@redhat.com \
    --cc=Suresh.Thiagarajan@pmcs.com \
    --cc=Vasanthalakshmi.Tharmarajan@pmcs.com \
    --cc=Viswas.G@pmcs.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.