qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v16 1/5] lib/xbitmap: Introduce xbitmap


From: Tetsuo Handa
Subject: Re: [Qemu-devel] [PATCH v16 1/5] lib/xbitmap: Introduce xbitmap
Date: Mon, 9 Oct 2017 20:30:00 +0900
User-agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0

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...



reply via email to

[Prev in Thread] Current Thread [Next in Thread]