В Вт, 08/03/2022 в 15:40 +0000, Matthew Wilcox пишет: > On Tue, Mar 08, 2022 at 06:16:35PM +0300, Ananda Badmaev wrote: > > > Hm. So 368 bytes on 64-bit, but 372 bytes on 32-bit? Is that > > > intentional? Why 11? > > > > > Yes, 'slot_size' and 'slots_per_block' values are chosen so that in > > general the range from 0 to PAGE_SIZE is split more or less evenly > > and > > the size of the block is as close as possible to the power of 2. > > Also > > 'slot_size' values are aligned to the size of long. > > Is it intrinsic to the design that the blocks are aligned to > sizeof(long)? slot_size values must be aligned so that the slot addresses in blocks are also algined to avoid potential problems with unalinged access. I guess 4/8 byte alignment is enough for 32/64 bit systems respectively. > > > > > > You have some very strange indentation (throughout). > > > > > I was trying to limit the length of lines. > > But you didn't achieve that. The _start_ of the line containing > block_type and gfp was _more indented_ than the end of the previous > line. Do you have unusual tab settings? > Maybe it's because I have tab size 4 in my editor. > > > thinking > > > about it". What if you have two threads that execute this path > > > concurrently? Looks to me like you leak the memory allocated by > > > the > > > first thread. > > > > > Probably I should pass GFP_ATOMIC flag to alloc_block() and execute > > this entire section of code under single spinlock. > > I think that's a bad approach. Better would be: > > spin_lock(); > if (free_slot_block) > goto found; > spin_unlock(); > block = alloc_block(); > spin_lock(); > if (free_slot_block) { > free_block(block); > block = free_slot_block; > } else { > free_slot_block = block; > } > found: > ... > spin_unlock(); Yes, seems really better to do like this. Solution with GFP_ATOMIC probably will improve the worst time of ztree_alloc(), which was not big issue in the tests, but most likely general efficiency will be degraded.