Re: Locking while executing bottom-halves and process context code

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

 



On Sun, Feb 14, 2016 at 3:40 PM, Henrik Austad <henrik@xxxxxxxxx> wrote:
> On Sun, Feb 14, 2016 at 11:00:40AM +0530, Pratyush Patel wrote:
>> Hello,
>>
>> While reading a section in Linux Kernel Development, I came across the
>> following:
>>
>> "If process context code and a bottom half share data, you need to
>> disable bottom-half processing and obtain a lock before accessing the
>> data."
>>
>> Why is this the case? Can one not disable/lock the process context
>> code instead of the bottom-half and access data?
>
> You need to do it in both.

That makes a lot more sense.


> You need to grab the lock in BH in case other threads also calls the same
> syscall. You need to lock in from user process context to avoid being
> interrupted and having a BH walk in and update the data.
>
>  A Thread
>    |
>    do_something()
>       do_a_syscall()
>          // update a var in kernel, but on behalf of thread
>          read shared var A
>  * Interrupt *
>    irq_entry
>      // ack interrupt, do critical stuff
>      // trigger softirq do the rest
>    irq_exit
>    softirq_entry
>      Update shared var A
>    softirq_exit
>
>    (now back in thread A, inside kernel)
>           write old value of A back // updated A from softirq now lost!
>

Wonderful explanation, thank you.


>
>> Similarly, for the statement,
>>
>> "If interrupt context code and a bottom half share data, you need to
>> disable interrupts and obtain a lock before accessing the data."
>>
>> Any help in clarifying this would be much appreciated.
>
> Same as for userprocess vs. BH, an ISR can interrupt a BH and update data
> unless you have disabled interrupt.


-Pratyush

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux