Skip to content

Commit 61aa3c8

Browse files
tehcasteropsiff
authored andcommitted
mm/slub: refactor calculate_order() and calc_slab_order()
mainline inclusion from mainline-v6.7-rc1 category: other After the previous cleanups, we can now move some code from calc_slab_order() to calculate_order() so it's executed just once, and do some more cleanups. - move the min_order and MAX_OBJS_PER_PAGE evaluation to calculate_order(). - change calc_slab_order() parameter min_objects to min_order Also make MAX_OBJS_PER_PAGE check more robust by considering also min_objects in addition to slub_min_order. Otherwise this is not a functional change. Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Reviewed-by: Feng Tang <feng.tang@intel.com> Reviewed-and-tested-by: Jay Patel <jaypatel@linux.ibm.com> (cherry picked from commit 90f055d) Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
1 parent a36005a commit 61aa3c8

1 file changed

Lines changed: 12 additions & 11 deletions

File tree

mm/slub.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4278,17 +4278,12 @@ static unsigned int slub_min_objects;
42784278
* the smallest order which will fit the object.
42794279
*/
42804280
static inline unsigned int calc_slab_order(unsigned int size,
4281-
unsigned int min_objects, unsigned int max_order,
4281+
unsigned int min_order, unsigned int max_order,
42824282
unsigned int fract_leftover)
42834283
{
4284-
unsigned int min_order = slub_min_order;
42854284
unsigned int order;
42864285

4287-
if (order_objects(min_order, size) > MAX_OBJS_PER_PAGE)
4288-
return get_order(size * MAX_OBJS_PER_PAGE) - 1;
4289-
4290-
for (order = max(min_order, (unsigned int)get_order(min_objects * size));
4291-
order <= max_order; order++) {
4286+
for (order = min_order; order <= max_order; order++) {
42924287

42934288
unsigned int slab_size = (unsigned int)PAGE_SIZE << order;
42944289
unsigned int rem;
@@ -4307,7 +4302,7 @@ static inline int calculate_order(unsigned int size)
43074302
unsigned int order;
43084303
unsigned int min_objects;
43094304
unsigned int max_objects;
4310-
unsigned int nr_cpus;
4305+
unsigned int min_order;
43114306

43124307
min_objects = slub_min_objects;
43134308
if (!min_objects) {
@@ -4320,14 +4315,20 @@ static inline int calculate_order(unsigned int size)
43204315
* order on systems that appear larger than they are, and too
43214316
* low order on systems that appear smaller than they are.
43224317
*/
4323-
nr_cpus = num_present_cpus();
4318+
unsigned int nr_cpus = num_present_cpus();
43244319
if (nr_cpus <= 1)
43254320
nr_cpus = nr_cpu_ids;
43264321
min_objects = 4 * (fls(nr_cpus) + 1);
43274322
}
4328-
max_objects = order_objects(slub_max_order, size);
4323+
/* min_objects can't be 0 because get_order(0) is undefined */
4324+
max_objects = max(order_objects(slub_max_order, size), 1U);
43294325
min_objects = min(min_objects, max_objects);
43304326

4327+
min_order = max_t(unsigned int, slub_min_order,
4328+
get_order(min_objects * size));
4329+
if (order_objects(min_order, size) > MAX_OBJS_PER_PAGE)
4330+
return get_order(size * MAX_OBJS_PER_PAGE) - 1;
4331+
43314332
/*
43324333
* Attempt to find best configuration for a slab. This works by first
43334334
* attempting to generate a layout with the best possible configuration
@@ -4344,7 +4345,7 @@ static inline int calculate_order(unsigned int size)
43444345
* long as at least single object fits within slub_max_order.
43454346
*/
43464347
for (unsigned int fraction = 16; fraction > 1; fraction /= 2) {
4347-
order = calc_slab_order(size, min_objects, slub_max_order,
4348+
order = calc_slab_order(size, min_order, slub_max_order,
43484349
fraction);
43494350
if (order <= slub_max_order)
43504351
return order;

0 commit comments

Comments
 (0)