On Tue, Apr 05, 2022 at 09:52:23PM +0800, Hao Lee wrote: > Hi, Paul > > I'm currently reading perfbook, but I often get stuck in some concepts > which are not explained. Does this book need some prior knowledge? > Or all these concepts are explained later and I just need to keep > reading patiently? > > For example, on page 67 in v2021.12.22a: > > For example, a write memory barrier (Linux kernel smp_wmb()) would > order the store, but not the load. This situation might suggest use > of smp_store_release() over smp_wmb(). > > Unfortunately, although I have some knowledge about Linux kernel, I'm not > familiar with the concepts such as store_release, smp_wmb, etc. I don't > know if I should keep reading this book until all these concepts are > explained or stop reading the book and learn some prior knowledge. Good point. On the one hand, this book is rather advanced, but on the other hand, it needs to be as accessible as is reasonably possible. I do not believe that there is a good definition of these two in the current text. So could you please do the following when you come across an undefined term or API member like this? 1. Search within the PDF. If there is a good definition later, let us know so that we can either move the definition earlier, forward-reference the definition, or make the API reference at the end of the book point readers at the definition. If you don't see an obvious definition, continue. 2. Check the web. If you find what looks to be a good definition, tell us where it is. Perhaps we should create a similar definition in the book, or perhaps we should cite the definition you found. If you don't see an obvious definition, continue. 3. Search within the Linux kernel source code. (When I did this, the best definition I found was the much-maligned Documentation/memory-barriers.txt!) Again, maybe we should put a similar definition in the book or maybe we should cite the Linux-kernel source tree. When I did this for smp_store_release() and smp_wmb(), I didn't find much that was helpful. Here is how I might define them: smp_store_release(): This is a store-release operation. This operation guarantees that all memory references preceding the smp_store_release() will be visible to other threads and CPUs before the store carried out by the smp_store_release(). This means that smp_store_release(&a, v) is similar to the plain C-language assignment statement a = v, but also provides the aforementioned ordering guarantee while also preventing the counterproductive compiler optimizations described in Section 4.3.4 ("Accessing Shared Variables"). smp_wmb(): This is a write memory barrier. This barrier guarantees that memory stores preceding this barrier will be visible to other threads and CPUs before any memory stores following this barrier. The text would also need to reiterate that ordering the stores is of no use unless the other threads' and CPU's loads are also ordered. Part of this definition would likely appear in the Glossary entries for store release and write memory barrier. Would this help? Again, this book is reasonably advanced, but it is very helpful for us to understand which things are tripping people up. We cannot promise to fix all of them, because there is a very large number of such functions, and many of them are subject to change over time. However, we -can- promise that we most definitely will not fix those that we do not know about. ;-) If you are wondering why it is not obvious to me what definitions are needed where, please keep in mind that I have been doing parallel programming for more than 30 years, and that my learning process was highly non-traditional. I learned much of this from the hardware itself, some by reading code and exercising it, and a little bit by inventing it. So I need your help to work out what a traditional learning process should look like. Thanx, Paul