Skip to content
  • Kent Overstreet's avatar
    idr: Percpu ida · 798ab48e
    Kent Overstreet authored
    
    
    Percpu frontend for allocating ids. With percpu allocation (that works),
    it's impossible to guarantee it will always be possible to allocate all
    nr_tags - typically, some will be stuck on a remote percpu freelist
    where the current job can't get to them.
    
    We do guarantee that it will always be possible to allocate at least
    (nr_tags / 2) tags - this is done by keeping track of which and how many
    cpus have tags on their percpu freelists. On allocation failure if
    enough cpus have tags that there could potentially be (nr_tags / 2) tags
    stuck on remote percpu freelists, we then pick a remote cpu at random to
    steal from.
    
    Note that there's no cpu hotplug notifier - we don't care, because
    steal_tags() will eventually get the down cpu's tags. We _could_ satisfy
    more allocations if we had a notifier - but we'll still meet our
    guarantees and it's absolutely not a correctness issue, so I don't think
    it's worth the extra code.
    
    From akpm:
    
        "It looks OK to me (that's as close as I get to an ack :))
    
    v6 changes:
      - Add #include <linux/cpumask.h> to include/linux/percpu_ida.h to
        make alpha/arc builds happy (Fengguang)
      - Move second (cpu >= nr_cpu_ids) check inside of first check scope
        in steal_tags() (akpm + nab)
    
    v5 changes:
      - Change percpu_ida->cpus_have_tags to cpumask_t (kmo + akpm)
      - Add comment for percpu_ida_cpu->lock + ->nr_free (kmo + akpm)
      - Convert steal_tags() to use cpumask_weight() + cpumask_next() +
        cpumask_first() + cpumask_clear_cpu() (kmo + akpm)
      - Add comment for alloc_global_tags() (kmo + akpm)
      - Convert percpu_ida_alloc() to use cpumask_set_cpu() (kmo + akpm)
      - Convert percpu_ida_free() to use cpumask_set_cpu() (kmo + akpm)
      - Drop percpu_ida->cpus_have_tags allocation in percpu_ida_init()
        (kmo + akpm)
      - Drop percpu_ida->cpus_have_tags kfree in percpu_ida_destroy()
        (kmo + akpm)
      - Add comment for percpu_ida_alloc @ gfp (kmo + akpm)
      - Move to percpu_ida.c + percpu_ida.h (kmo + akpm + nab)
    
    v4 changes:
    
      - Fix tags.c reference in percpu_ida_init (akpm)
    
    Signed-off-by: default avatarKent Overstreet <kmo@daterainc.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: "Nicholas A. Bellinger" <nab@linux-iscsi.org>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    798ab48e