Re: [PATCH 1/5] i2c: xiic: Fix broken locking on tx_msg

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

 



On 6/26/20 2:11 PM, Raviteja Narayanam wrote:

Hi,

[...]

>> @@ -699,14 +708,7 @@ static int xiic_xfer(struct i2c_adapter *adap, struct
>> i2c_msg *msgs, int num)
>>  	if (err < 0)
>>  		return err;
>>
>> -	err = xiic_busy(i2c);
>> -	if (err)
>> -		goto out;
>> -
>> -	i2c->tx_msg = msgs;
>> -	i2c->nmsgs = num;
> 
> On an SMP system with multiple i2c-transfer command scripts running, the above critical section is expected to cause serious trouble overwriting the previous msg pointers.
> But that's not happening as the i2c-core is having a lock at adapter level inside i2c-core-base.c (rt_mutex_lock_nested).
> So, the race condition between different threads is not possible. They are all serialized by the locking in i2c-core.
> 
> Although no issues are seen in the tests, the contention within the driver is still possible (isr vs xiic_xfer), if there is a spurious interrupt. And this patch is needed in that case.
The contention happens between the threaded interrupt handler
xiic_process() and this xiic_xfer() function. While you can not have
xiic_xfer() running on two CPU cores at the same time, you can have
xiic_xfer() running on one CPU core and xiic_process() on another CPU
core, and that will lead to problems.

[...]



[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux