Re: [RFC] [PATCHv5 0/4] reiser4: discard support: initial implementation, refactored.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Saturday 21 June 2014 at 13:20:18, Edward Shishkin wrote:	
> On 06/21/2014 12:35 AM, Ivan Shapovalov wrote:
> > [...]
> > Also I would like if this code could be given a review. :)
> 
> Great! Looks nice for me, thanks!
> There are 2 issues, though...
> 
> 1) kmalloc/kfree a huge number of 32-byte chunks (blocknr_list entries) is
> suboptimal. There is a special low-level memory allocator for such purposes.
> Take a look how we initialize so-called "slab cache" for jnodes 
> (_jnode_slab),
> atoms (_atom_slab), etc, and allocate memory for them (kmem_cache_alloc()).
> 
> 2) A lot of blocknr_list entries are allocated at flush time, when the 
> high-level
> allocator (txmod.c) makes "relocation decisions" (especially when txmod=wa).
> The problem is that the flush (with the following commit) usually is the 
> file system
> response to memory pressure notifications, when additional memory allocation
> is not desirable.
> 
> I think that with the fixed (1) we'll include the discard support (if 
> everything will
> be OK in the next 1-2 weeks).
> 
> As to (2): that is a common problem of all Linux subsystems which want 
> memory
> to free memory. It is unresolvable, however, we can improve the 
> situation. It
> would be nice to implement a per-atom pool of memory (as a list of 
> kmalloc-ed
> buffers with "cursors") with an optional possibility to pre-allocate 1-2 
> such buffers
> at atom initialization time. But this is for the future...
> 
> I don't see other urgent improvements. Yes, overall scalability of 
> rb-trees is better,
> as we found, however, merging rb-trees is more expensive, plus atom's fusion
> is not a background process, so it can lead to performance drop. There are
> rb-trees with fingers, however I haven't seen their implementation on C 
> language
> (it can be not so simple).
> 
> Thanks!
> Edward.
> 

Thanks for the review!

(1) surely seems trivial. Do we need something similar for blocknr_set as well?

For (2) I don't quite understand you. How such a pool should be organized?

Do you mean `blocknr_list_entry **pool` of size N * sizeof(void*) filled with
kmem_cache_alloc()'d pointers, or just `blocknr_list_entry *pool` of size
N * sizeof(blocknr_list_entry)?

-- 
Ivan Shapovalov / intelfx /

Attachment: signature.asc
Description: This is a digitally signed message part.


[Index of Archives]     [Linux File System Development]     [Linux BTRFS]     [Linux NFS]     [Linux Filesystems]     [Ext4 Filesystem]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Resources]

  Powered by Linux