Re: [PATCH 6/6] mpt3sas: Used "synchronize_irq()"API to synchronize timed-out IO & TMs

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

 



On 6.5.2016 10:59, Chaitra P B wrote:
> Replaced mpt3sas_base_flush_reply_queues()with
> mpt3sas_base_sync_reply_irqs(),as mpt3sas_base_flush_reply_queues()
> skips over reply queues that are currently busy (i.e. being handled
> by interrupt processing in another core). If a reply queue is busy,
> then call to synchronize_irq()in mpt3sas_base_sync_reply_irqs()make
> sures the other core has finished flushing the queue and completed
> any calls to the mid-layer scsi_done() routine.
>
> Signed-off-by: Chaitra P B <chaitra.basappa@xxxxxxxxxxxx>
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.c  | 15 +++++++--------
>  drivers/scsi/mpt3sas/mpt3sas_base.h  |  3 ++-
>  drivers/scsi/mpt3sas/mpt3sas_scsih.c |  4 +++-
>  3 files changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
> index 4e9142f..fd9002d 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
> @@ -1103,18 +1103,16 @@ _base_is_controller_msix_enabled(struct MPT3SAS_ADAPTER *ioc)
>  }
>  
>  /**
> - * mpt3sas_base_flush_reply_queues - flushing the MSIX reply queues
> + * mpt3sas_base_sync_reply_irqs - flush pending MSIX interrupts
>   * @ioc: per adapter object
> - * Context: ISR conext
> + * Context: non ISR conext
>   *
> - * Called when a Task Management request has completed. We want
> - * to flush the other reply queues so all the outstanding IO has been
> - * completed back to OS before we process the TM completetion.
> + * Called when a Task Management request has completed.
>   *
>   * Return nothing.
>   */
>  void
> -mpt3sas_base_flush_reply_queues(struct MPT3SAS_ADAPTER *ioc)
> +mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc)
>  {
>  	struct adapter_reply_queue *reply_q;
>  
> @@ -1125,12 +1123,13 @@ mpt3sas_base_flush_reply_queues(struct MPT3SAS_ADAPTER *ioc)
>  		return;
>  
>  	list_for_each_entry(reply_q, &ioc->reply_queue_list, list) {
> -		if (ioc->shost_recovery)
> +		if (ioc->shost_recovery || ioc->remove_host ||
> +				ioc->pci_error_recovery)

Hi Chaitra,
how is this change + (ioc->remove_host || ioc->pci_error_recovery)
related to the subject? 

>  			return;
>  		/* TMs are on msix_index == 0 */
>  		if (reply_q->msix_index == 0)
>  			continue;
> -		_base_interrupt(reply_q->vector, (void *)reply_q);
> +		synchronize_irq(reply_q->vector);
>  	}

One thing I don't understand - what if an interrupt comes after
the synchronize_irq has finished ? 

Thanks,
Tomas 

>  }
>  
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
> index e1befba..1a614d7 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.h
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
> @@ -1236,7 +1236,8 @@ void *mpt3sas_base_get_msg_frame(struct MPT3SAS_ADAPTER *ioc, u16 smid);
>  void *mpt3sas_base_get_sense_buffer(struct MPT3SAS_ADAPTER *ioc, u16 smid);
>  __le32 mpt3sas_base_get_sense_buffer_dma(struct MPT3SAS_ADAPTER *ioc,
>  	u16 smid);
> -void mpt3sas_base_flush_reply_queues(struct MPT3SAS_ADAPTER *ioc);
> +
> +void mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc);
>  
>  /* hi-priority queue */
>  u16 mpt3sas_base_get_smid_hpr(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx);
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> index abd8717..928214f 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> @@ -2126,7 +2126,6 @@ _scsih_tm_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
>  		return 1;
>  	if (ioc->tm_cmds.smid != smid)
>  		return 1;
> -	mpt3sas_base_flush_reply_queues(ioc);
>  	ioc->tm_cmds.status |= MPT3_CMD_COMPLETE;
>  	mpi_reply =  mpt3sas_base_get_reply_virt_addr(ioc, reply);
>  	if (mpi_reply) {
> @@ -2311,6 +2310,9 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,
>  		}
>  	}
>  
> +	/* sync IRQs in case those were busy during flush. */
> +	mpt3sas_base_sync_reply_irqs(ioc);
> +
>  	if (ioc->tm_cmds.status & MPT3_CMD_REPLY_VALID) {
>  		mpt3sas_trigger_master(ioc, MASTER_TRIGGER_TASK_MANAGMENT);
>  		mpi_reply = ioc->tm_cmds.reply;

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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