On Wed, 21 Mar 2018, Mikulas Patocka wrote: > So, what would you recommend for allocating 640KB objects while minimizing > wasted space? > * alloc_pages - rounds up to the next power of two > * kmalloc - rounds up to the next power of two > * alloc_pages_exact - O(n*log n) complexity; and causes memory > fragmentation if used excesivelly > * vmalloc - horrible performance (modifies page tables and that causes > synchronization across all CPUs) > > anything else? Need to find it but there is a way to allocate N pages in sequence somewhere. Otherwise mempools are something that would work. > > > > What kind of problem could be caused here? > > > > > > Unlocked accesses are generally considered bad. For example, see this > > > piece of code in calculate_sizes: > > > s->allocflags = 0; > > > if (order) > > > s->allocflags |= __GFP_COMP; > > > > > > if (s->flags & SLAB_CACHE_DMA) > > > s->allocflags |= GFP_DMA; > > > > > > if (s->flags & SLAB_RECLAIM_ACCOUNT) > > > s->allocflags |= __GFP_RECLAIMABLE; > > > > > > If you are running this while the cache is in use (i.e. when the user > > > writes /sys/kernel/slab/<cache>/order), then other processes will see > > > invalid s->allocflags for a short time. > > > > Calculating sizes is done when the slab has only a single accessor. Thus > > no locking is neeed. > > The calculation is done whenever someone writes to > "/sys/kernel/slab/*/order" But the flags you are mentioning do not change and the size of the object does not change. What changes is the number of objects in the slab page. > And you can obviously write to that file why the slab cache is in use. Try > it. You cannot change flags that would impact the size of the objects. I only allowed changing characteristics that does not impact object size. > I am not talking about changing the size of objects in a slab cache. I am > talking about changing the allocation order of a slab cache while the > cache is in use. This can be done with the sysfs interface. But then that is something that is allowed but does not affect the object size used by the slab allocators.