On Wed, Jan 16, 2019 at 12:32:52AM +0900, Akira Yokosawa wrote: > On 2019/01/14 17:33:37 -0800, Paul E. McKenney wrote: > > On Sun, Jan 13, 2019 at 06:10:24PM -0800, Paul E. McKenney wrote: > >> On Mon, Jan 14, 2019 at 08:28:27AM +0900, Akira Yokosawa wrote: > >>> >From 7b69a9b37ba9a73a50aad5cbb097235ddfe75870 Mon Sep 17 00:00:00 2001 > >>> From: Akira Yokosawa <akiyks@xxxxxxxxx> > >>> Date: Mon, 14 Jan 2019 07:25:14 +0900 > >>> Subject: [PATCH 0/6] Simplify hash_resize.c > >>> > >>> Hi Paul, > >>> > >>> This patch set updates hash_resize.c, which you suggested for me to > >>> take over, and the related text. > >>> > >>> I added a couple of Quick Quizzes as well, and in one of them, > >>> I included your version of hash_resize.c. > >>> > >>> Patch #1 updates hash_resize.c in the way I suggested. Note that > >>> in this update, "#ifndef FCV_SNIPPET" blocks are used to hide > >>> code for debugging (hash value checks) in code snippets. > >>> This code can actually be compiled with "-DFCV_SNIPPET" to see > >>> the performance without hash value checks. > >>> > >>> Patch #2 adds a couple of Quick Quizzes. Your version of hash_resize.c > >>> is added as hash_resize_s.c. > >>> > >>> Patch #3 removes unnecessary folding in a code snippet. > >>> > >>> Patch #4 adjusts a few sentence to the simpler approach. > >>> > >>> Patch #5 adds another Quick Quiz. > >>> > >>> Patch #6 adds an "#error" directive for the lack of rcu_barrier(). > >>> > >>> All of the updates in text would need your native eyes to be polished. > >> > >> Nice! Queued and pushed, thank you! I will review and send any > >> needed update by end of tomorrow, Pacific Time. > > > > Here is a summary of changes: > > > > o Move the ht_lock_state structure definition to follow the ht > > structure, matching the order of discussion in the text. > > Everything seems to build and run OK with this change. > > Also illustrates the advantages of line labels! ;-) > > > > o I considered inlining ht_search_bucket() into its only caller > > in hashtab_lookup(), but decided against it. More flexibility > > for change with it as is. > > > > o I added ht_search_bucket() to the in-text list of things > > permitting lookups and modifications to run concurrently with > > a resize operation. > > > > o I tweaked the description of hashtab_lock_mod(), hashtab_unlock_mod(), > > hashtab_add(), and hashtab_del(). > > > > o I tweaked the QQ asking about searches missing adds during resizes. > > > > o English is strange, so "Less Changes" must become "Fewer Changes". > > Sigh, I thought I knew this rule... Thanks for the fix. > > > > > o I put the long labels on a single line out of paranoia. > > > > I pushed these out on a working branch named paulmck.2019.01.14a. Please > > let me know whether I messed anything up, and once it looks good to you, > > I will pull these two commits into the master branch. > > There is an irrelevant clause added in an answer to a QQ. > See below for my suggestion. It doesn't sound fluent enough, though. Good catch! How does the following amended patch look? Thanx, Paul ------------------------------------------------------------------------ commit 731c855ab11b9601a40324c6ef6b5ced6d7833e9 Author: Akira Yokosawa <akiyks@xxxxxxxxx> Date: Tue Jan 15 23:52:27 2019 +0900 datastruct/hash: Fix irrelevant clause in answer to quick quiz hashtab_lookup() is not affected by the reordering of ->hbp[] and ->hls_idx[]. Instead, mention the increase of cost at the earlier explanation of hashtab_lookup(). Signed-off-by: Akira Yokosawa <akiyks@xxxxxxxxx> [ paulmck: Wordsmithing. ] Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxxxxx> diff --git a/datastruct/datastruct.tex b/datastruct/datastruct.tex index d1fde2c7535e..985021e927a8 100644 --- a/datastruct/datastruct.tex +++ b/datastruct/datastruct.tex @@ -1189,13 +1189,15 @@ a concurrent resize operation. either the old bucket if it is not resized yet, or to the new bucket if it has been resized, and \co{hashtab_del()} removes the specified element from any buckets into which it has been inserted. - \co{hashtab_lookup()} searches the new bucket if the search - of the old bucket fails. + The \co{hashtab_lookup()} function searches the new bucket + if the search of the old bucket fails, which has the disadvantage + of adding overhead to the lookup fastpath. The alternative \co{hashtab_lock_mod()} returns the locking state of the new bucket in \co{->hbp[0]} and \co{->hls_idx[0]} - if resize operation is in progress. - This reordering simplifies \co{hashtab_add()}, but at the expense - of an extra check in \co{hashtab_lookup()}. + if resize operation is in progress, instead of the perhaps + more natural choice of \co{->hbp[1]} and \co{->hls_idx[1]}. + However, this less-natural choice has the advantage of simplifying + \co{hashtab_add()}. Further analysis of the code is left as an exercise for the reader. } \QuickQuizEnd