@@ -4110,17 +4110,12 @@ static unsigned int slub_min_objects;
4110
4110
* the smallest order which will fit the object.
4111
4111
*/
4112
4112
static inline unsigned int calc_slab_order (unsigned int size ,
4113
- unsigned int min_objects , unsigned int max_order ,
4113
+ unsigned int min_order , unsigned int max_order ,
4114
4114
unsigned int fract_leftover )
4115
4115
{
4116
- unsigned int min_order = slub_min_order ;
4117
4116
unsigned int order ;
4118
4117
4119
- if (order_objects (min_order , size ) > MAX_OBJS_PER_PAGE )
4120
- return get_order (size * MAX_OBJS_PER_PAGE ) - 1 ;
4121
-
4122
- for (order = max (min_order , (unsigned int )get_order (min_objects * size ));
4123
- order <= max_order ; order ++ ) {
4118
+ for (order = min_order ; order <= max_order ; order ++ ) {
4124
4119
4125
4120
unsigned int slab_size = (unsigned int )PAGE_SIZE << order ;
4126
4121
unsigned int rem ;
@@ -4139,16 +4134,8 @@ static inline int calculate_order(unsigned int size)
4139
4134
unsigned int order ;
4140
4135
unsigned int min_objects ;
4141
4136
unsigned int max_objects ;
4142
- unsigned int nr_cpus ;
4137
+ unsigned int min_order ;
4143
4138
4144
- /*
4145
- * Attempt to find best configuration for a slab. This
4146
- * works by first attempting to generate a layout with
4147
- * the best configuration and backing off gradually.
4148
- *
4149
- * First we increase the acceptable waste in a slab. Then
4150
- * we reduce the minimum objects required in a slab.
4151
- */
4152
4139
min_objects = slub_min_objects ;
4153
4140
if (!min_objects ) {
4154
4141
/*
@@ -4160,40 +4147,46 @@ static inline int calculate_order(unsigned int size)
4160
4147
* order on systems that appear larger than they are, and too
4161
4148
* low order on systems that appear smaller than they are.
4162
4149
*/
4163
- nr_cpus = num_present_cpus ();
4150
+ unsigned int nr_cpus = num_present_cpus ();
4164
4151
if (nr_cpus <= 1 )
4165
4152
nr_cpus = nr_cpu_ids ;
4166
4153
min_objects = 4 * (fls (nr_cpus ) + 1 );
4167
4154
}
4168
- max_objects = order_objects (slub_max_order , size );
4155
+ /* min_objects can't be 0 because get_order(0) is undefined */
4156
+ max_objects = max (order_objects (slub_max_order , size ), 1U );
4169
4157
min_objects = min (min_objects , max_objects );
4170
4158
4171
- while (min_objects > 1 ) {
4172
- unsigned int fraction ;
4173
-
4174
- fraction = 16 ;
4175
- while (fraction >= 4 ) {
4176
- order = calc_slab_order (size , min_objects ,
4177
- slub_max_order , fraction );
4178
- if (order <= slub_max_order )
4179
- return order ;
4180
- fraction /= 2 ;
4181
- }
4182
- min_objects -- ;
4183
- }
4159
+ min_order = max_t (unsigned int , slub_min_order ,
4160
+ get_order (min_objects * size ));
4161
+ if (order_objects (min_order , size ) > MAX_OBJS_PER_PAGE )
4162
+ return get_order (size * MAX_OBJS_PER_PAGE ) - 1 ;
4184
4163
4185
4164
/*
4186
- * We were unable to place multiple objects in a slab. Now
4187
- * lets see if we can place a single object there.
4165
+ * Attempt to find best configuration for a slab. This works by first
4166
+ * attempting to generate a layout with the best possible configuration
4167
+ * and backing off gradually.
4168
+ *
4169
+ * We start with accepting at most 1/16 waste and try to find the
4170
+ * smallest order from min_objects-derived/slub_min_order up to
4171
+ * slub_max_order that will satisfy the constraint. Note that increasing
4172
+ * the order can only result in same or less fractional waste, not more.
4173
+ *
4174
+ * If that fails, we increase the acceptable fraction of waste and try
4175
+ * again. The last iteration with fraction of 1/2 would effectively
4176
+ * accept any waste and give us the order determined by min_objects, as
4177
+ * long as at least single object fits within slub_max_order.
4188
4178
*/
4189
- order = calc_slab_order (size , 1 , slub_max_order , 1 );
4190
- if (order <= slub_max_order )
4191
- return order ;
4179
+ for (unsigned int fraction = 16 ; fraction > 1 ; fraction /= 2 ) {
4180
+ order = calc_slab_order (size , min_order , slub_max_order ,
4181
+ fraction );
4182
+ if (order <= slub_max_order )
4183
+ return order ;
4184
+ }
4192
4185
4193
4186
/*
4194
4187
* Doh this slab cannot be placed using slub_max_order.
4195
4188
*/
4196
- order = calc_slab_order (size , 1 , MAX_ORDER , 1 );
4189
+ order = get_order (size );
4197
4190
if (order <= MAX_ORDER )
4198
4191
return order ;
4199
4192
return - ENOSYS ;
@@ -4711,6 +4704,9 @@ static int __init setup_slub_min_order(char *str)
4711
4704
{
4712
4705
get_option (& str , (int * )& slub_min_order );
4713
4706
4707
+ if (slub_min_order > slub_max_order )
4708
+ slub_max_order = slub_min_order ;
4709
+
4714
4710
return 1 ;
4715
4711
}
4716
4712
@@ -4721,6 +4717,9 @@ static int __init setup_slub_max_order(char *str)
4721
4717
get_option (& str , (int * )& slub_max_order );
4722
4718
slub_max_order = min_t (unsigned int , slub_max_order , MAX_ORDER );
4723
4719
4720
+ if (slub_min_order > slub_max_order )
4721
+ slub_min_order = slub_max_order ;
4722
+
4724
4723
return 1 ;
4725
4724
}
4726
4725
0 commit comments