On Thu, Feb 29, 2024 at 1:59 PM David Laight <David.Laight@xxxxxxxxxx> wrote: > > From: Ian Rogers > > Sent: 27 February 2024 07:24 > > > > On Mon, Feb 26, 2024 at 11:07 PM Namhyung Kim <namhyung@xxxxxxxxxx> wrote: > > > > > > On Tue, Feb 13, 2024 at 10:37 PM Ian Rogers <irogers@xxxxxxxxxx> wrote: > > > > > > > > Move threads out of machine and move thread_rb_node into the C > > > > file. This hides the implementation of threads from the rest of the > > > > code allowing for it to be refactored. > > > > > > > > Locking discipline is tightened up in this change. > > > > > > Doesn't look like a simple code move. Can we split the locking > > > change from the move to make the reviewer's life a bit easier? :) > > > > Not sure I follow. Take threads_nr as an example. > > > > The old code is in machine.c, so: > > -static size_t machine__threads_nr(const struct machine *machine) > > -{ > > - size_t nr = 0; > > - > > - for (int i = 0; i < THREADS__TABLE_SIZE; i++) > > - nr += machine->threads[i].nr; > > - > > - return nr; > > -} > > > > The new code is in threads.c: > > +size_t threads__nr(struct threads *threads) > > +{ > > + size_t nr = 0; > > + > > + for (int i = 0; i < THREADS__TABLE_SIZE; i++) { > > + struct threads_table_entry *table = &threads->table[i]; > > + > > + down_read(&table->lock); > > + nr += table->nr; > > + up_read(&table->lock); > > + } > > + return nr; > > +} > > > > So it is a copy paste from one file to the other. The only difference > > is that the old code failed to take a lock when reading "nr" so the > > locking is added. I wanted to make sure all the functions in threads.c > > were properly correct wrt locking, semaphore creation and destruction, > > etc. We could have a broken threads.c and fix it in the next change, > > but given that's a bug it could make bisection more difficult. > > Ultimately I thought the locking changes were small enough to not > > warrant being on their own compared to the advantages of having a sane > > threads abstraction. > > The lock is pretty much entirely pointless. > All it really does is slow the code down. > The most you could want is: > nr += READ_ONCE(table->nr); > to avoid any hypothetical data tearing. Completely agreed, but as this is user space code I'm unclear on thread sanitizer support for READ_ONCE. The code is also only called in debug statements. The migration to a hashmap in the later patches means the complexity of taking the lock is more justified, although we're using libbpf's hashmap that has a size variable. Thanks, Ian > David > > - > Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK > Registration No: 1397386 (Wales)