Messages in this thread | | | Subject | Re: [PATCH v16 1/5] lib/xbitmap: Introduce xbitmap | From | Tetsuo Handa <> | Date | Mon, 9 Oct 2017 20:30:00 +0900 |
| |
On 2017/09/30 13:05, Wei Wang wrote: > /** > + * xb_preload - preload for xb_set_bit() > + * @gfp_mask: allocation mask to use for preloading > + * > + * Preallocate memory to use for the next call to xb_set_bit(). This function > + * returns with preemption disabled. It will be enabled by xb_preload_end(). > + */ > +void xb_preload(gfp_t gfp) > +{ > + if (__radix_tree_preload(gfp, XB_PRELOAD_SIZE) < 0) > + preempt_disable(); > + > + if (!this_cpu_read(ida_bitmap)) { > + struct ida_bitmap *bitmap = kmalloc(sizeof(*bitmap), gfp); > + > + if (!bitmap) > + return; > + bitmap = this_cpu_cmpxchg(ida_bitmap, NULL, bitmap); > + kfree(bitmap); > + } > +}
I'm not sure whether this function is safe.
__radix_tree_preload() returns 0 with preemption disabled upon success. xb_preload() disables preemption if __radix_tree_preload() fails. Then, kmalloc() is called with preemption disabled, isn't it? But xb_set_page() calls xb_preload(GFP_KERNEL) which might sleep...
| |