diff mbox

mpt3sas: Add an i/o barrier

Message ID 20180524151246.2429-1-thenzl@redhat.com (mailing list archive)
State Accepted
Headers show

Commit Message

Tomas Henzl May 24, 2018, 3:12 p.m. UTC
A barrier should be added to ensure proper ordering of memory mapped
writes.

Signed-off-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/mpt3sas/mpt3sas_base.c | 1 +
 1 file changed, 1 insertion(+)

Comments

James Bottomley May 24, 2018, 3:19 p.m. UTC | #1
On Thu, 2018-05-24 at 17:12 +0200, Tomas Henzl wrote:
> A barrier should be added to ensure proper ordering of memory mapped
> writes.
> 
> Signed-off-by: Tomas Henzl <thenzl@redhat.com>
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c
> b/drivers/scsi/mpt3sas/mpt3sas_base.c
> index bf04fa90f..569392d0d 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
> @@ -3348,6 +3348,7 @@ _base_mpi_ep_writeq(__u64 b, volatile void
> __iomem *addr,
>  	spin_lock_irqsave(writeq_lock, flags);
>  	writel((u32)(data_out), addr);
>  	writel((u32)(data_out >> 32), (addr + 4));
> +	mmiowb();
>  	spin_unlock_irqrestore(writeq_lock, flags);
>  }

I thought, assuming mpt3sas has this right, that this construction is
only used on 32 bit platforms that don't have a writeq instruction?  I
don't believe there's any overlap with the NUMA systems that need io
and memory domain synchronization, so either this problem is purely
theoretical or mpt3sas doesn't have the use of writeq correct and if
the latter case it should be fixed correctly.

James
Tomas Henzl May 24, 2018, 3:31 p.m. UTC | #2
On 05/24/2018 05:19 PM, James Bottomley wrote:
> On Thu, 2018-05-24 at 17:12 +0200, Tomas Henzl wrote:
>> A barrier should be added to ensure proper ordering of memory mapped
>> writes.
>>
>> Signed-off-by: Tomas Henzl <thenzl@redhat.com>
>> ---
>>  drivers/scsi/mpt3sas/mpt3sas_base.c | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c
>> b/drivers/scsi/mpt3sas/mpt3sas_base.c
>> index bf04fa90f..569392d0d 100644
>> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
>> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
>> @@ -3348,6 +3348,7 @@ _base_mpi_ep_writeq(__u64 b, volatile void
>> __iomem *addr,
>>  	spin_lock_irqsave(writeq_lock, flags);
>>  	writel((u32)(data_out), addr);
>>  	writel((u32)(data_out >> 32), (addr + 4));
>> +	mmiowb();
>>  	spin_unlock_irqrestore(writeq_lock, flags);
>>  }
> I thought, assuming mpt3sas has this right, that this construction is
> only used on 32 bit platforms that don't have a writeq instruction?  I
> don't believe there's any overlap with the NUMA systems that need io
> and memory domain synchronization, so either this problem is purely
> theoretical or mpt3sas doesn't have the use of writeq correct and if
> the latter case it should be fixed correctly.

The  _base_mpi_ep_writeq is used regardless to 32/64 bit arch
for example in _base_put_smid_mpi_ep_scsi_io, mpt3sas_base_put_smid_hi_priority
and so on.



>
> James
>
James Bottomley May 24, 2018, 3:33 p.m. UTC | #3
On Thu, 2018-05-24 at 17:31 +0200, Tomas Henzl wrote:
> On 05/24/2018 05:19 PM, James Bottomley wrote:
> > On Thu, 2018-05-24 at 17:12 +0200, Tomas Henzl wrote:
> > > A barrier should be added to ensure proper ordering of memory
> > > mapped
> > > writes.
> > > 
> > > Signed-off-by: Tomas Henzl <thenzl@redhat.com>
> > > ---
> > >  drivers/scsi/mpt3sas/mpt3sas_base.c | 1 +
> > >  1 file changed, 1 insertion(+)
> > > 
> > > diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c
> > > b/drivers/scsi/mpt3sas/mpt3sas_base.c
> > > index bf04fa90f..569392d0d 100644
> > > --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
> > > +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
> > > @@ -3348,6 +3348,7 @@ _base_mpi_ep_writeq(__u64 b, volatile void
> > > __iomem *addr,
> > >  	spin_lock_irqsave(writeq_lock, flags);
> > >  	writel((u32)(data_out), addr);
> > >  	writel((u32)(data_out >> 32), (addr + 4));
> > > +	mmiowb();
> > >  	spin_unlock_irqrestore(writeq_lock, flags);
> > >  }
> > 
> > I thought, assuming mpt3sas has this right, that this construction
> > is only used on 32 bit platforms that don't have a writeq
> > instruction?  I don't believe there's any overlap with the NUMA
> > systems that need io and memory domain synchronization, so either
> > this problem is purely theoretical or mpt3sas doesn't have the use
> > of writeq correct and if the latter case it should be fixed
> > correctly.
> 
> The  _base_mpi_ep_writeq is used regardless to 32/64 bit arch
> for example in _base_put_smid_mpi_ep_scsi_io,
> mpt3sas_base_put_smid_hi_priority
> and so on.

So it's the latter ... but my point is that that should be fixed rather
than adding barriers to what should be a corner case work around.

James
Tomas Henzl May 24, 2018, 3:48 p.m. UTC | #4
On 05/24/2018 05:33 PM, James Bottomley wrote:
> On Thu, 2018-05-24 at 17:31 +0200, Tomas Henzl wrote:
>> On 05/24/2018 05:19 PM, James Bottomley wrote:
>>> On Thu, 2018-05-24 at 17:12 +0200, Tomas Henzl wrote:
>>>> A barrier should be added to ensure proper ordering of memory
>>>> mapped
>>>> writes.
>>>>
>>>> Signed-off-by: Tomas Henzl <thenzl@redhat.com>
>>>> ---
>>>>  drivers/scsi/mpt3sas/mpt3sas_base.c | 1 +
>>>>  1 file changed, 1 insertion(+)
>>>>
>>>> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> b/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> index bf04fa90f..569392d0d 100644
>>>> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> @@ -3348,6 +3348,7 @@ _base_mpi_ep_writeq(__u64 b, volatile void
>>>> __iomem *addr,
>>>>  	spin_lock_irqsave(writeq_lock, flags);
>>>>  	writel((u32)(data_out), addr);
>>>>  	writel((u32)(data_out >> 32), (addr + 4));
>>>> +	mmiowb();
>>>>  	spin_unlock_irqrestore(writeq_lock, flags);
>>>>  }
>>> I thought, assuming mpt3sas has this right, that this construction
>>> is only used on 32 bit platforms that don't have a writeq
>>> instruction?  I don't believe there's any overlap with the NUMA
>>> systems that need io and memory domain synchronization, so either
>>> this problem is purely theoretical or mpt3sas doesn't have the use
>>> of writeq correct and if the latter case it should be fixed
>>> correctly.
>> The  _base_mpi_ep_writeq is used regardless to 32/64 bit arch
>> for example in _base_put_smid_mpi_ep_scsi_io,
>> mpt3sas_base_put_smid_hi_priority
>> and so on.
> So it's the latter ... but my point is that that should be fixed rather
> than adding barriers to what should be a corner case work around.

I think that the hw is for some reason not able to handle a 64 write,
the patch in e5747439366c1079257083f231f5dd9a84bf0fd7
"scsi: mpt3sas: Introduce function to clone mpi request"
states that it is intentional. 
So adding the write barrier still makes sense for me.

>
> James
>
Chaitra P B May 29, 2018, 6:03 a.m. UTC | #5
Hi,
Please consider this patch as

Acked-by: Chaitra P B <chaitra.basappa@broadcom.com>

Thanks,
 Chaitra

-----Original Message-----
From: Tomas Henzl [mailto:thenzl@redhat.com]
Sent: Thursday, May 24, 2018 9:19 PM
To: James Bottomley; linux-scsi@vger.kernel.org
Cc: chaitra.basappa@broadcom.com; sreekanth.reddy@broadcom.com;
Sathya.Prakash@broadcom.com
Subject: Re: [PATCH] mpt3sas: Add an i/o barrier

On 05/24/2018 05:33 PM, James Bottomley wrote:
> On Thu, 2018-05-24 at 17:31 +0200, Tomas Henzl wrote:
>> On 05/24/2018 05:19 PM, James Bottomley wrote:
>>> On Thu, 2018-05-24 at 17:12 +0200, Tomas Henzl wrote:
>>>> A barrier should be added to ensure proper ordering of memory
>>>> mapped writes.
>>>>
>>>> Signed-off-by: Tomas Henzl <thenzl@redhat.com>
>>>> ---
>>>>  drivers/scsi/mpt3sas/mpt3sas_base.c | 1 +
>>>>  1 file changed, 1 insertion(+)
>>>>
>>>> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> b/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> index bf04fa90f..569392d0d 100644
>>>> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
>>>> @@ -3348,6 +3348,7 @@ _base_mpi_ep_writeq(__u64 b, volatile void
>>>> __iomem *addr,
>>>>  	spin_lock_irqsave(writeq_lock, flags);
>>>>  	writel((u32)(data_out), addr);
>>>>  	writel((u32)(data_out >> 32), (addr + 4));
>>>> +	mmiowb();
>>>>  	spin_unlock_irqrestore(writeq_lock, flags);
>>>>  }
>>> I thought, assuming mpt3sas has this right, that this construction
>>> is only used on 32 bit platforms that don't have a writeq
>>> instruction?  I don't believe there's any overlap with the NUMA
>>> systems that need io and memory domain synchronization, so either
>>> this problem is purely theoretical or mpt3sas doesn't have the use
>>> of writeq correct and if the latter case it should be fixed
>>> correctly.
>> The  _base_mpi_ep_writeq is used regardless to 32/64 bit arch for
>> example in _base_put_smid_mpi_ep_scsi_io,
>> mpt3sas_base_put_smid_hi_priority and so on.
> So it's the latter ... but my point is that that should be fixed
> rather than adding barriers to what should be a corner case work around.

I think that the hw is for some reason not able to handle a 64 write, the
patch in e5747439366c1079257083f231f5dd9a84bf0fd7
"scsi: mpt3sas: Introduce function to clone mpi request"
states that it is intentional.
So adding the write barrier still makes sense for me.

>
> James
>
Martin K. Petersen June 6, 2018, 1:25 a.m. UTC | #6
Tomas,

> A barrier should be added to ensure proper ordering of memory mapped
> writes.

Applied to 4.18/scsi-fixes. Thanks!
diff mbox

Patch

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index bf04fa90f..569392d0d 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -3348,6 +3348,7 @@  _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
 	spin_lock_irqsave(writeq_lock, flags);
 	writel((u32)(data_out), addr);
 	writel((u32)(data_out >> 32), (addr + 4));
+	mmiowb();
 	spin_unlock_irqrestore(writeq_lock, flags);
 }