Re: [Question] Quick Quiz B.13 help

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

 



On 2017/02/19 14:22:06 -0800, Paul E. McKenney wrote:
> On Fri, Feb 17, 2017 at 07:47:05AM +0900, Akira Yokosawa wrote:
>> On 2017/02/16 11:13:08 -0800, Paul E. McKenney wrote:
>>> On Wed, Feb 15, 2017 at 12:36:52AM +0900, Akira Yokosawa wrote:
>>>> On 2017/02/14 18:53:52 +0800, Yubin Ruan wrote:
>>>>> On 2017/2/14 3:00, Paul E. McKenney wrote:
>>>>>> On Mon, Feb 13, 2017 at 09:41:46PM +0800, Yubin Ruan wrote:
>>>>>>> Quick quiz B.13:
>>>>>>>     Suppose that lines 3-5 for CPUs 1 and 2 in Table B.4 are in an
>>>>>>> interrupt handler, and that the CPU 2's line 9 is running at process
>>>>>>> level. What changes, if any, are required to enable the code to work
>>>>>>> correctly, in other words, to prevent the assertion from firing?
>>>>>>>
>>>>>>> I can not come up with any practical material for this quiz, because
>>>>>>> I don't really know the implication of "in an interrupt handler",
>>>>>>> and "running in process level".
>>>>>>>
>>>>>>> The answer hints that one would need to ensure that the load of "e"
>>>>>>> precedes that of "a" and hint the Linux kernel implementation
>>>>>>> "barrier()". But how is that exactly? I am going to invest some time
>>>>>>> into the Linux kernel implementation. But I would really appreciate
>>>>>>> some hints about this, as I don't have so much kernel development
>>>>>>> experience before.
>>>>>>
>>>>>> I suggest reading an operating-system textbook.  The ones I have are quite
>>>>>> old, but here they are anyway in bibtex format.  There are probably newer
>>>>>> editions of some of them.  The short answer on interrupts is that they
>>>>>> force process-level processing to pause while the "interrupt handler"
>>>>>                                           ~~~~~
>>>>>                                           until ?
>>>>>> completes.
>>>>>>
>>>>>>                             Thanx, Paul
>>>>>>
>>>>>
>>>>> Actually I have taken a operating system course and know about interrupt handler. Maybe I don't understand the concepts well. I don't really get your point here. If you have time, maybe you can provide me more information, otherwise I would just have to investigate more on this myself. Thanks.
>>>>
>>>> Hi Paul,
>>>>
>>>> Prompted by Yubin's question, I looked into the Quick Quiz.
>>>> And I have a theory what you wanted to say.
>>>>
>>>> First of all, the "assert()" has a line number of 9, but the execution
>>>> order of lines 3-5 and the assertion on CPU 2 does not matter in
>>>> Table B.4, doesn't it?
>>>>
>>>> Your point here looks like that lines 3-5 for CPU 2 can interrupt
>>>> the assert().
>>>
>>> Yes.
>>>
>>>> If this is the case, whether lines 3-5 for CPU 1 are in an interrupt
>>>> handler or not does not matter, I suppose.
>>>
>>> True, up to a point.  If CPU 1's lines 3-5 are in an interrupt handler,
>>> then the assert()'s condition only needs a compiler directive such
>>> as barrier() to keep things straight.  If these are separate CPUs,
>>> then real memory barriers are required.
>>>
>>>> And the first sentence of Answer of the Quick Quiz should read:
>>>>
>>>>     The assertion will need to be written so that the load of ``e''
>>>>     is assured to precede that of ``a''.
>>>
>>> This doesn't change the meaning, but I take it that it is easier to
>>> read.  But how about the following?
>>>
>>> 	The assertion must ensure that the load of ``e'' precedes that of
>>> 	``a''.
>>>
>>>> The second sentence mentions the barrier() primitive. It is effective
>>>> because interrupts should see the sequence of instructions in order
>>>> even if they are executed out-of-order. 
>>>>
>>>> Am I missing something?
>>>
>>> And I should also call out that in the context of the quick quiz,
>>> there is only one CPU.  How about the following?
>>
>> Hmm, I thought there were still three CPUs involved in the quick quiz...
>> If all the code runs on the same CPU, we don't need memory barriers,
>> do we?
>>
>> I thought what matter is (as said in the previous mail) lines 3-5 of
>> CPU 2 can interrupt the assertion. Codes in columns 1 and 2 can still
>> run on CPU 0 and 1 respectively.
>>
>>>
>>> 	Quick Quiz B.13:
>>> 	Suppose that lines 3-5 for CPUs 1 and 2 in Table B.4 are in an
>>> 	interrupt handler, and that the CPU 2’s line 9 runs at process
>>> 	level. In other words, the code in all three columns of the
>>> 	table runs on the same CPU, but the first two columns run in an
>>> 	interrupt handler, and the third column runs at process level,
>>> 	so that the code in third column can be interrupted by the code
>>> 	in the first two columns. What changes, if any, are required to
>>> 	enable the code to work correctly, in other words, to prevent
>>> 	the assertion from firing?
>>>
>>> 	Answer:
>>> 	The assertion must ensure that the load of “e” precedes that
>>> 	of “a”. In the Linux kernel, the barrier() primitive may be
>>> 	used to accomplish this in much the same way that the memory
>>> 	barrier was used in the assertions in the previous examples,
>>> 	for example, as follows:
>>>
>>> 		while (b == 0) ;
>>> 		smp_mb();
>>> 		d = 1;
>>> 		r1 = e;
>>> 		barrier();
>>> 		assert(r1 == 0 || a == 1);
>>>
>>> 	No changes are needed to the code in the first two columns,
>>> 	because interrupt handlers run atomically from the perspective
>>> 	of the interrupted code.
>>>
>>
>> Here is my version of the quiz and answer:
>>
>> 	Quick Quiz B.13:
>> 	Suppose that lines 3-5 for CPU 2 in Table B.4 are in an
>> 	interrupt handler, and that the CPU 2’s line 9 runs at process
>> 	level. In other words, lines 3-5 for CPU 2 can interrupt the
>> 	assertion of line 9. What changes, if any, are required to
>> 	enable the code to work correctly, in other words, to prevent
>> 	the assertion from firing?
> 
> Given the discussion earlier in this thread, I believe that we do need
> to explicitly state that all of the code is running on a single CPU.

Well, I'm afraid I still can't see your point.
Maybe I'm missing something important.
Let me ask a few questions regarding your version of the Quiz

>>> 	Suppose that lines 3-5 for CPUs 1 and 2 in Table B.4 are in an
>>> 	interrupt handler, and that the CPU 2’s line 9 runs at process
>>> 	level.

In this part, you are saying lines 3-5 for CPUs 1 and 2 are in an
interrupt handler.

>>>             In other words, the code in all three columns of the
>>> 	table runs on the same CPU, but the first two columns run in an
>>> 	interrupt handler, and the third column runs at process level,

In this part, you are saying code for CPUs 0 and 1 runs in an interrupt
handler, and lines 3-5 for CPU 2 as well as the assertion runs at process
level.

I'm confused...

And again, I want to know what I said previously is correct or not:

>> If all the code runs on the same CPU, we don't need memory barriers,
>> do we?

Am I missing something?

BTW, it seems you have not pushed your update.

                                    Thanks, Akira

> 
>> 	Answer:
>> 	The assertion must ensure that the load of “e” precedes that
>> 	of “a”. In the Linux kernel, the barrier() primitive may be
>> 	used to accomplish this in much the same way that the memory
>> 	barrier was used in the previous examples, for example,
>> 	the assertion can be modified as follows:
>>
>> 		r1 = e;
>> 		barrier();
>> 		assert(r1 == 0 || a == 1);
> 
> I did do something very much like this with your Reported-by:
> 
> 	Answer:
> 	The assertion must ensure that the load of “e” precedes that
> 	of “a”. In the Linux kernel, the barrier() primitive may
> 	be used to accomplish this in much the same way that the memory
> 	barrier was used in the assertions in the previous examples. For
> 	example, the assertion can be modified as follows:
> 
> 		r1 = e;
> 		barrier();
> 		assert(r1 == 0 || a == 1);
> 
> 	No changes are needed to the code in the first two columns,
> 	because interrupt handlers run atomically from the perspective
> 	of the interrupted code.
> 
> 							Thanx, Paul
> 
>> Thoughts?
>>
>>                                               Thanks, Akira
>>
>>> 							Thanx, Paul
>>>
>>>>
>>>>>
>>>>> regards,
>>>>> Yubin Ruan
>>>>>
>>>>>> ------------------------------------------------------------------------
>>>>>>
>>>>>> @book{CorbetRubiniKroahHartman
>>>>>> ,author="Jonathan Corbet and Alessandro Rubini and Greg Kroah-Hartman"
>>>>>> ,title="Linux Device Drivers"
>>>>>> ,publisher="O'Reilly Media, Inc."
>>>>>> ,year="2005"
>>>>>> ,edition="Third"
>>>>>> }
>>>>>>
>>>>>> @book{Silberschatz98a
>>>>>> ,author="Abraham Silberschatz and Peter Baer Galvin"
>>>>>> ,title="Operating System Concepts"
>>>>>> ,publisher="Addison-Wesley"
>>>>>> ,year="1998"
>>>>>> ,edition="Fifth"
>>>>>> }
>>>>>>
>>>>>> @book{Vahalia96
>>>>>> ,author="Uresh Vahalia"
>>>>>> ,title="{UNIX} Internals: The New Frontiers"
>>>>>> ,publisher="Prentice Hall"
>>>>>> ,year="1996"
>>>>>> }
>>>>>>
>>>>>
>>>>> -- 
>>>>> To unsubscribe from this list: send the line "unsubscribe perfbook" in
>>>>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>>
>>>>
>>>
>>>
>>
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe perfbook" 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]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux