|
@@ -106,8 +106,14 @@ static struct idr_layer *idr_layer_alloc(gfp_t gfp_mask, struct idr *layer_idr)
|
|
|
if (layer_idr)
|
|
|
return get_from_free_list(layer_idr);
|
|
|
|
|
|
- /* try to allocate directly from kmem_cache */
|
|
|
- new = kmem_cache_zalloc(idr_layer_cache, gfp_mask);
|
|
|
+ /*
|
|
|
+ * Try to allocate directly from kmem_cache. We want to try this
|
|
|
+ * before preload buffer; otherwise, non-preloading idr_alloc()
|
|
|
+ * users will end up taking advantage of preloading ones. As the
|
|
|
+ * following is allowed to fail for preloaded cases, suppress
|
|
|
+ * warning this time.
|
|
|
+ */
|
|
|
+ new = kmem_cache_zalloc(idr_layer_cache, gfp_mask | __GFP_NOWARN);
|
|
|
if (new)
|
|
|
return new;
|
|
|
|
|
@@ -115,18 +121,24 @@ static struct idr_layer *idr_layer_alloc(gfp_t gfp_mask, struct idr *layer_idr)
|
|
|
* Try to fetch one from the per-cpu preload buffer if in process
|
|
|
* context. See idr_preload() for details.
|
|
|
*/
|
|
|
- if (in_interrupt())
|
|
|
- return NULL;
|
|
|
-
|
|
|
- preempt_disable();
|
|
|
- new = __this_cpu_read(idr_preload_head);
|
|
|
- if (new) {
|
|
|
- __this_cpu_write(idr_preload_head, new->ary[0]);
|
|
|
- __this_cpu_dec(idr_preload_cnt);
|
|
|
- new->ary[0] = NULL;
|
|
|
+ if (!in_interrupt()) {
|
|
|
+ preempt_disable();
|
|
|
+ new = __this_cpu_read(idr_preload_head);
|
|
|
+ if (new) {
|
|
|
+ __this_cpu_write(idr_preload_head, new->ary[0]);
|
|
|
+ __this_cpu_dec(idr_preload_cnt);
|
|
|
+ new->ary[0] = NULL;
|
|
|
+ }
|
|
|
+ preempt_enable();
|
|
|
+ if (new)
|
|
|
+ return new;
|
|
|
}
|
|
|
- preempt_enable();
|
|
|
- return new;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Both failed. Try kmem_cache again w/o adding __GFP_NOWARN so
|
|
|
+ * that memory allocation failure warning is printed as intended.
|
|
|
+ */
|
|
|
+ return kmem_cache_zalloc(idr_layer_cache, gfp_mask);
|
|
|
}
|
|
|
|
|
|
static void idr_layer_rcu_free(struct rcu_head *head)
|