On Sat, Nov 17, 2018 at 12:01:11AM +0900, Akira Yokosawa wrote: > (Cc: Paul's latest address) > Hi Junchang, > > On 2018/11/16 16:19:57 +0800, Junchang Wang wrote: > > Signed-off-by: Junchang Wang <junchangwang@xxxxxxxxx> > > --- > > Hi list, > > > > There are a few typos in Section Partitioning. Please take a look. > > > > Thanks, > > --Junchang > > > > -- > > SMPdesign/SMPdesign.tex | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/SMPdesign/SMPdesign.tex b/SMPdesign/SMPdesign.tex > > index 7b4f6eb..562c057 100644 > > --- a/SMPdesign/SMPdesign.tex > > +++ b/SMPdesign/SMPdesign.tex > > @@ -936,7 +936,7 @@ We could simply assign each CPU one gigabyte of memory, and allow > > each CPU to access its own private chunk of memory, without the > > need for locking and its complexities and overheads. > > Unfortunately, this simple scheme breaks down if an algorithm happens > > -to have CPU~0 allocate all of the memory and CPU~1 the free it, as > > +to have CPU~0 allocate all of the memory and CPU~1 free it, as > > I guess Paul's intention was: > > +to have CPU~0 allocate all of the memory and CPU~1 then free it, as > > ??? You are right, that was my intention, but there significant room for improvement. Please see below for an updated version of Junchang's patch. Thoughts? > > would happen in a simple producer-consumer workload. > > > > The other extreme, code locking, suffers from excessive lock contention > > @@ -1017,7 +1017,7 @@ smaller than the number of non-\co{NULL} pointers. > > The allocation function \co{memblock_alloc()} may be seen in > > Listing~\ref{lst:SMPdesign:Allocator-Cache Allocator Function}. > > Line~\lnref{pick} picks up the current thread's per-thread pool, > > -and line~8 check to see if it is empty. > > +and line~\lnref{chk:empty} checks to see if it is empty. > > Nice catch! Indeed, thank you both!!! > Thanks, Akira > > > > > If so, lines~\lnref{ack}-\lnref{rel} attempt to refill it > > from the global pool ------------------------------------------------------------------------ commit 81c18b03d1aa2d3edc1dc28867e1f84413eb31e3 Author: Junchang Wang <junchangwang@xxxxxxxxx> Date: Fri Nov 16 16:19:57 2018 +0800 SMPdesign: Fix typos Signed-off-by: Junchang Wang <junchangwang@xxxxxxxxx> Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxxxxx> [ paulmck: Rework to clarify original wording. ] diff --git a/SMPdesign/SMPdesign.tex b/SMPdesign/SMPdesign.tex index 7b4f6eb2ba71..fe8f445851e3 100644 --- a/SMPdesign/SMPdesign.tex +++ b/SMPdesign/SMPdesign.tex @@ -932,12 +932,11 @@ data ownership to this problem---simply carve up memory so that each CPU owns its share. For example, suppose that a system with two CPUs has two gigabytes of memory (such as the one that I am typing on right now). -We could simply assign each CPU one gigabyte of memory, and allow -each CPU to access its own private chunk of memory, without the -need for locking and its complexities and overheads. -Unfortunately, this simple scheme breaks down if an algorithm happens -to have CPU~0 allocate all of the memory and CPU~1 the free it, as -would happen in a simple producer-consumer workload. +We could simply assign each CPU one gigabyte of memory, and allow each +CPU to allocate from its own gigabyte, without the need for locking and +its complexities and overheads. +Unfortunately, this scheme fails when CPU~0 only allocates memory and +CPU~1 only frees it, as happens in simple producer-consumer workloads. The other extreme, code locking, suffers from excessive lock contention and overhead~\cite{McKenney93}. @@ -1017,7 +1016,7 @@ smaller than the number of non-\co{NULL} pointers. The allocation function \co{memblock_alloc()} may be seen in Listing~\ref{lst:SMPdesign:Allocator-Cache Allocator Function}. Line~\lnref{pick} picks up the current thread's per-thread pool, -and line~8 check to see if it is empty. +and line~\lnref{chk:empty} checks to see if it is empty. If so, lines~\lnref{ack}-\lnref{rel} attempt to refill it from the global pool