@@ -202,22 +202,22 @@ struct kmem_cache *find_mergeable(unsigned int size, unsigned int align,
202
202
}
203
203
204
204
static struct kmem_cache * create_cache (const char * name ,
205
- unsigned int object_size , unsigned int freeptr_offset ,
206
- unsigned int align , slab_flags_t flags ,
207
- unsigned int useroffset , unsigned int usersize ,
208
- void (* ctor )(void * ))
205
+ unsigned int object_size ,
206
+ struct kmem_cache_args * args ,
207
+ slab_flags_t flags )
209
208
{
210
209
struct kmem_cache * s ;
211
210
int err ;
212
211
213
- if (WARN_ON (useroffset + usersize > object_size ))
214
- useroffset = usersize = 0 ;
212
+ if (WARN_ON (args -> useroffset + args -> usersize > object_size ))
213
+ args -> useroffset = args -> usersize = 0 ;
215
214
216
215
/* If a custom freelist pointer is requested make sure it's sane. */
217
216
err = - EINVAL ;
218
- if (freeptr_offset != UINT_MAX &&
219
- (freeptr_offset >= object_size || !(flags & SLAB_TYPESAFE_BY_RCU ) ||
220
- !IS_ALIGNED (freeptr_offset , sizeof (freeptr_t ))))
217
+ if (args -> use_freeptr_offset &&
218
+ (args -> freeptr_offset >= object_size ||
219
+ !(flags & SLAB_TYPESAFE_BY_RCU ) ||
220
+ !IS_ALIGNED (args -> freeptr_offset , sizeof (freeptr_t ))))
221
221
goto out ;
222
222
223
223
err = - ENOMEM ;
@@ -227,12 +227,15 @@ static struct kmem_cache *create_cache(const char *name,
227
227
228
228
s -> name = name ;
229
229
s -> size = s -> object_size = object_size ;
230
- s -> rcu_freeptr_offset = freeptr_offset ;
231
- s -> align = align ;
232
- s -> ctor = ctor ;
230
+ if (args -> use_freeptr_offset )
231
+ s -> rcu_freeptr_offset = args -> freeptr_offset ;
232
+ else
233
+ s -> rcu_freeptr_offset = UINT_MAX ;
234
+ s -> align = args -> align ;
235
+ s -> ctor = args -> ctor ;
233
236
#ifdef CONFIG_HARDENED_USERCOPY
234
- s -> useroffset = useroffset ;
235
- s -> usersize = usersize ;
237
+ s -> useroffset = args -> useroffset ;
238
+ s -> usersize = args -> usersize ;
236
239
#endif
237
240
err = do_kmem_cache_create (s , flags );
238
241
if (err )
@@ -265,7 +268,6 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
265
268
slab_flags_t flags )
266
269
{
267
270
struct kmem_cache * s = NULL ;
268
- unsigned int freeptr_offset = UINT_MAX ;
269
271
const char * cache_name ;
270
272
int err ;
271
273
@@ -323,11 +325,8 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
323
325
goto out_unlock ;
324
326
}
325
327
326
- if (args -> use_freeptr_offset )
327
- freeptr_offset = args -> freeptr_offset ;
328
- s = create_cache (cache_name , object_size , freeptr_offset ,
329
- calculate_alignment (flags , args -> align , object_size ),
330
- flags , args -> useroffset , args -> usersize , args -> ctor );
328
+ args -> align = calculate_alignment (flags , args -> align , object_size );
329
+ s = create_cache (cache_name , object_size , args , flags );
331
330
if (IS_ERR (s )) {
332
331
err = PTR_ERR (s );
333
332
kfree_const (cache_name );
0 commit comments