[RFC/PATCH v4 4/7] ARM: ARM11 MPCore: clean_dcache_area is not preempt safe

George G. Davis gdavis at mvista.com
Tue Oct 18 13:30:17 EDT 2011


Hello Tony/Ohad,

On Oct 18, 2011, at 1:08 PM, Tony Lindgren wrote:

> Hi,
> 
> * gdavis at mvista.com <gdavis at mvista.com> [111018 06:13]:
>> From: George G. Davis <gdavis at mvista.com>
>> 
>> If preemption and subsequent task migration occurs during calls to
>> clean_dcache_area on ARM11 MPCore machines, global memory state
>> can become inconsistent.  To prevent inconsistent memory state on
>> these machines, disable preemption in callers of these functions
>> around memory modifications and subsequent clean_dcache_area calls.
> 
> This one needs to be refreshed against what's queued in for-next as
> Ohad has moved most of the iommu code into drivers. I've added
> Ohad to Cc as well.

If you do not use ARM11 MPCore with those drivers, then we can drop this altogether.

Thanks!

--
Regards,
George
 
> 
> Regards,
> 
> Tony
> 
>> 
>> Cc: Tony Lindgren <tony at atomide.com>
>> Signed-off-by: George G. Davis <gdavis at mvista.com>
>> ---
>> arch/arm/plat-omap/iommu.c |   10 ++++++++++
>> 1 files changed, 10 insertions(+), 0 deletions(-)
>> 
>> diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
>> index 34fc31e..59836d1 100644
>> --- a/arch/arm/plat-omap/iommu.c
>> +++ b/arch/arm/plat-omap/iommu.c
>> @@ -1014,8 +1014,12 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev)
>> 		err = -ENOMEM;
>> 		goto err_pgd;
>> 	}
>> +	if (cache_ops_need_broadcast())
>> +		preempt_disable();
>> 	memset(p, 0, IOPGD_TABLE_SIZE);
>> 	clean_dcache_area(p, IOPGD_TABLE_SIZE);
>> +	if (cache_ops_need_broadcast())
>> +		preempt_enable();
>> 	obj->iopgd = p;
>> 
>> 	BUG_ON(!IS_ALIGNED((unsigned long)obj->iopgd, IOPGD_TABLE_SIZE));
>> @@ -1069,7 +1073,13 @@ static struct platform_driver omap_iommu_driver = {
>> 
>> static void iopte_cachep_ctor(void *iopte)
>> {
>> +	if (cache_ops_need_broadcast())
>> +		preempt_disable();
>> +	/* FIXME: This will not work on ARM11 MPCore.
>> +	 */
>> 	clean_dcache_area(iopte, IOPTE_TABLE_SIZE);
>> +	if (cache_ops_need_broadcast())
>> +		preempt_enable();
>> }
>> 
>> static int __init omap_iommu_init(void)
>> -- 
>> 1.7.4.4
>> 




More information about the linux-arm-kernel mailing list