linux/kernel/smp.c
<<
>>
Prefs
   1/*
   2 * Generic helpers for smp ipi calls
   3 *
   4 * (C) Jens Axboe <jens.axboe@oracle.com> 2008
   5 */
   6#include <linux/rcupdate.h>
   7#include <linux/rculist.h>
   8#include <linux/kernel.h>
   9#include <linux/module.h>
  10#include <linux/percpu.h>
  11#include <linux/init.h>
  12#include <linux/smp.h>
  13#include <linux/cpu.h>
  14
  15static DEFINE_PER_CPU(struct call_single_queue, call_single_queue);
  16
  17static struct {
  18        struct list_head        queue;
  19        spinlock_t              lock;
  20} call_function __cacheline_aligned_in_smp =
  21        {
  22                .queue          = LIST_HEAD_INIT(call_function.queue),
  23                .lock           = __SPIN_LOCK_UNLOCKED(call_function.lock),
  24        };
  25
  26enum {
  27        CSD_FLAG_LOCK           = 0x01,
  28};
  29
  30struct call_function_data {
  31        struct call_single_data csd;
  32        atomic_t                refs;
  33        cpumask_var_t           cpumask;
  34};
  35
  36struct call_single_queue {
  37        struct list_head        list;
  38        spinlock_t              lock;
  39};
  40
  41static DEFINE_PER_CPU(struct call_function_data, cfd_data);
  42
  43static int
  44hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)
  45{
  46        long cpu = (long)hcpu;
  47        struct call_function_data *cfd = &per_cpu(cfd_data, cpu);
  48
  49        switch (action) {
  50        case CPU_UP_PREPARE:
  51        case CPU_UP_PREPARE_FROZEN:
  52                if (!zalloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL,
  53                                cpu_to_node(cpu)))
  54                        return NOTIFY_BAD;
  55                break;
  56
  57#ifdef CONFIG_HOTPLUG_CPU
  58        case CPU_UP_CANCELED:
  59        case CPU_UP_CANCELED_FROZEN:
  60
  61        case CPU_DEAD:
  62        case CPU_DEAD_FROZEN:
  63                free_cpumask_var(cfd->cpumask);
  64                break;
  65#endif
  66        };
  67
  68        return NOTIFY_OK;
  69}
  70
  71static struct notifier_block __cpuinitdata hotplug_cfd_notifier = {
  72        .notifier_call          = hotplug_cfd,
  73};
  74
  75static int __cpuinit init_call_single_data(void)
  76{
  77        void *cpu = (void *)(long)smp_processor_id();
  78        int i;
  79
  80        for_each_possible_cpu(i) {
  81                struct call_single_queue *q = &per_cpu(call_single_queue, i);
  82
  83                spin_lock_init(&q->lock);
  84                INIT_LIST_HEAD(&q->list);
  85        }
  86
  87        hotplug_cfd(&hotplug_cfd_notifier, CPU_UP_PREPARE, cpu);
  88        register_cpu_notifier(&hotplug_cfd_notifier);
  89
  90        return 0;
  91}
  92early_initcall(init_call_single_data);
  93
  94/*
  95 * csd_lock/csd_unlock used to serialize access to per-cpu csd resources
  96 *
  97 * For non-synchronous ipi calls the csd can still be in use by the
  98 * previous function call. For multi-cpu calls its even more interesting
  99 * as we'll have to ensure no other cpu is observing our csd.
 100 */
 101static void csd_lock_wait(struct call_single_data *data)
 102{
 103        while (data->flags & CSD_FLAG_LOCK)
 104                cpu_relax();
 105}
 106
 107static void csd_lock(struct call_single_data *data)
 108{
 109        csd_lock_wait(data);
 110        data->flags = CSD_FLAG_LOCK;
 111
 112        /*
 113         * prevent CPU from reordering the above assignment
 114         * to ->flags with any subsequent assignments to other
 115         * fields of the specified call_single_data structure:
 116         */
 117        smp_mb();
 118}
 119
 120static void csd_unlock(struct call_single_data *data)
 121{
 122        WARN_ON(!(data->flags & CSD_FLAG_LOCK));
 123
 124        /*
 125         * ensure we're all done before releasing data:
 126         */
 127        smp_mb();
 128
 129        data->flags &= ~CSD_FLAG_LOCK;
 130}
 131
 132/*
 133 * Insert a previously allocated call_single_data element
 134 * for execution on the given CPU. data must already have
 135 * ->func, ->info, and ->flags set.
 136 */
 137static
 138void generic_exec_single(int cpu, struct call_single_data *data, int wait)
 139{
 140        struct call_single_queue *dst = &per_cpu(call_single_queue, cpu);
 141        unsigned long flags;
 142        int ipi;
 143
 144        spin_lock_irqsave(&dst->lock, flags);
 145        ipi = list_empty(&dst->list);
 146        list_add_tail(&data->list, &dst->list);
 147        spin_unlock_irqrestore(&dst->lock, flags);
 148
 149        /*
 150         * The list addition should be visible before sending the IPI
 151         * handler locks the list to pull the entry off it because of
 152         * normal cache coherency rules implied by spinlocks.
 153         *
 154         * If IPIs can go out of order to the cache coherency protocol
 155         * in an architecture, sufficient synchronisation should be added
 156         * to arch code to make it appear to obey cache coherency WRT
 157         * locking and barrier primitives. Generic code isn't really
 158         * equipped to do the right thing...
 159         */
 160        if (ipi)
 161                arch_send_call_function_single_ipi(cpu);
 162
 163        if (wait)
 164                csd_lock_wait(data);
 165}
 166
 167/*
 168 * Invoked by arch to handle an IPI for call function. Must be called with
 169 * interrupts disabled.
 170 */
 171void generic_smp_call_function_interrupt(void)
 172{
 173        struct call_function_data *data;
 174        int cpu = get_cpu();
 175
 176        /*
 177         * Shouldn't receive this interrupt on a cpu that is not yet online.
 178         */
 179        WARN_ON_ONCE(!cpu_online(cpu));
 180
 181        /*
 182         * Ensure entry is visible on call_function_queue after we have
 183         * entered the IPI. See comment in smp_call_function_many.
 184         * If we don't have this, then we may miss an entry on the list
 185         * and never get another IPI to process it.
 186         */
 187        smp_mb();
 188
 189        /*
 190         * It's ok to use list_for_each_rcu() here even though we may
 191         * delete 'pos', since list_del_rcu() doesn't clear ->next
 192         */
 193        list_for_each_entry_rcu(data, &call_function.queue, csd.list) {
 194                int refs;
 195
 196                if (!cpumask_test_and_clear_cpu(cpu, data->cpumask))
 197                        continue;
 198
 199                data->csd.func(data->csd.info);
 200
 201                refs = atomic_dec_return(&data->refs);
 202                WARN_ON(refs < 0);
 203                if (!refs) {
 204                        spin_lock(&call_function.lock);
 205                        list_del_rcu(&data->csd.list);
 206                        spin_unlock(&call_function.lock);
 207                }
 208
 209                if (refs)
 210                        continue;
 211
 212                csd_unlock(&data->csd);
 213        }
 214
 215        put_cpu();
 216}
 217
 218/*
 219 * Invoked by arch to handle an IPI for call function single. Must be
 220 * called from the arch with interrupts disabled.
 221 */
 222void generic_smp_call_function_single_interrupt(void)
 223{
 224        struct call_single_queue *q = &__get_cpu_var(call_single_queue);
 225        unsigned int data_flags;
 226        LIST_HEAD(list);
 227
 228        /*
 229         * Shouldn't receive this interrupt on a cpu that is not yet online.
 230         */
 231        WARN_ON_ONCE(!cpu_online(smp_processor_id()));
 232
 233        spin_lock(&q->lock);
 234        list_replace_init(&q->list, &list);
 235        spin_unlock(&q->lock);
 236
 237        while (!list_empty(&list)) {
 238                struct call_single_data *data;
 239
 240                data = list_entry(list.next, struct call_single_data, list);
 241                list_del(&data->list);
 242
 243                /*
 244                 * 'data' can be invalid after this call if flags == 0
 245                 * (when called through generic_exec_single()),
 246                 * so save them away before making the call:
 247                 */
 248                data_flags = data->flags;
 249
 250                data->func(data->info);
 251
 252                /*
 253                 * Unlocked CSDs are valid through generic_exec_single():
 254                 */
 255                if (data_flags & CSD_FLAG_LOCK)
 256                        csd_unlock(data);
 257        }
 258}
 259
 260static DEFINE_PER_CPU(struct call_single_data, csd_data);
 261
 262/*
 263 * smp_call_function_single - Run a function on a specific CPU
 264 * @func: The function to run. This must be fast and non-blocking.
 265 * @info: An arbitrary pointer to pass to the function.
 266 * @wait: If true, wait until function has completed on other CPUs.
 267 *
 268 * Returns 0 on success, else a negative status code. Note that @wait
 269 * will be implicitly turned on in case of allocation failures, since
 270 * we fall back to on-stack allocation.
 271 */
 272int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
 273                             int wait)
 274{
 275        struct call_single_data d = {
 276                .flags = 0,
 277        };
 278        unsigned long flags;
 279        int this_cpu;
 280        int err = 0;
 281
 282        /*
 283         * prevent preemption and reschedule on another processor,
 284         * as well as CPU removal
 285         */
 286        this_cpu = get_cpu();
 287
 288        /*
 289         * Can deadlock when called with interrupts disabled.
 290         * We allow cpu's that are not yet online though, as no one else can
 291         * send smp call function interrupt to this cpu and as such deadlocks
 292         * can't happen.
 293         */
 294        WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
 295                     && !oops_in_progress);
 296
 297        if (cpu == this_cpu) {
 298                local_irq_save(flags);
 299                func(info);
 300                local_irq_restore(flags);
 301        } else {
 302                if ((unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) {
 303                        struct call_single_data *data = &d;
 304
 305                        if (!wait)
 306                                data = &__get_cpu_var(csd_data);
 307
 308                        csd_lock(data);
 309
 310                        data->func = func;
 311                        data->info = info;
 312                        generic_exec_single(cpu, data, wait);
 313                } else {
 314                        err = -ENXIO;   /* CPU not online */
 315                }
 316        }
 317
 318        put_cpu();
 319
 320        return err;
 321}
 322EXPORT_SYMBOL(smp_call_function_single);
 323
 324/**
 325 * __smp_call_function_single(): Run a function on another CPU
 326 * @cpu: The CPU to run on.
 327 * @data: Pre-allocated and setup data structure
 328 *
 329 * Like smp_call_function_single(), but allow caller to pass in a
 330 * pre-allocated data structure. Useful for embedding @data inside
 331 * other structures, for instance.
 332 */
 333void __smp_call_function_single(int cpu, struct call_single_data *data,
 334                                int wait)
 335{
 336        csd_lock(data);
 337
 338        /*
 339         * Can deadlock when called with interrupts disabled.
 340         * We allow cpu's that are not yet online though, as no one else can
 341         * send smp call function interrupt to this cpu and as such deadlocks
 342         * can't happen.
 343         */
 344        WARN_ON_ONCE(cpu_online(smp_processor_id()) && wait && irqs_disabled()
 345                     && !oops_in_progress);
 346
 347        generic_exec_single(cpu, data, wait);
 348}
 349
 350/**
 351 * smp_call_function_many(): Run a function on a set of other CPUs.
 352 * @mask: The set of cpus to run on (only runs on online subset).
 353 * @func: The function to run. This must be fast and non-blocking.
 354 * @info: An arbitrary pointer to pass to the function.
 355 * @wait: If true, wait (atomically) until function has completed
 356 *        on other CPUs.
 357 *
 358 * If @wait is true, then returns once @func has returned. Note that @wait
 359 * will be implicitly turned on in case of allocation failures, since
 360 * we fall back to on-stack allocation.
 361 *
 362 * You must not call this function with disabled interrupts or from a
 363 * hardware interrupt handler or from a bottom half handler. Preemption
 364 * must be disabled when calling this function.
 365 */
 366void smp_call_function_many(const struct cpumask *mask,
 367                            void (*func)(void *), void *info, bool wait)
 368{
 369        struct call_function_data *data;
 370        unsigned long flags;
 371        int cpu, next_cpu, this_cpu = smp_processor_id();
 372
 373        /*
 374         * Can deadlock when called with interrupts disabled.
 375         * We allow cpu's that are not yet online though, as no one else can
 376         * send smp call function interrupt to this cpu and as such deadlocks
 377         * can't happen.
 378         */
 379        WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
 380                     && !oops_in_progress);
 381
 382        /* So, what's a CPU they want? Ignoring this one. */
 383        cpu = cpumask_first_and(mask, cpu_online_mask);
 384        if (cpu == this_cpu)
 385                cpu = cpumask_next_and(cpu, mask, cpu_online_mask);
 386
 387        /* No online cpus?  We're done. */
 388        if (cpu >= nr_cpu_ids)
 389                return;
 390
 391        /* Do we have another CPU which isn't us? */
 392        next_cpu = cpumask_next_and(cpu, mask, cpu_online_mask);
 393        if (next_cpu == this_cpu)
 394                next_cpu = cpumask_next_and(next_cpu, mask, cpu_online_mask);
 395
 396        /* Fastpath: do that cpu by itself. */
 397        if (next_cpu >= nr_cpu_ids) {
 398                smp_call_function_single(cpu, func, info, wait);
 399                return;
 400        }
 401
 402        data = &__get_cpu_var(cfd_data);
 403        csd_lock(&data->csd);
 404
 405        data->csd.func = func;
 406        data->csd.info = info;
 407        cpumask_and(data->cpumask, mask, cpu_online_mask);
 408        cpumask_clear_cpu(this_cpu, data->cpumask);
 409        atomic_set(&data->refs, cpumask_weight(data->cpumask));
 410
 411        spin_lock_irqsave(&call_function.lock, flags);
 412        /*
 413         * Place entry at the _HEAD_ of the list, so that any cpu still
 414         * observing the entry in generic_smp_call_function_interrupt()
 415         * will not miss any other list entries:
 416         */
 417        list_add_rcu(&data->csd.list, &call_function.queue);
 418        spin_unlock_irqrestore(&call_function.lock, flags);
 419
 420        /*
 421         * Make the list addition visible before sending the ipi.
 422         * (IPIs must obey or appear to obey normal Linux cache
 423         * coherency rules -- see comment in generic_exec_single).
 424         */
 425        smp_mb();
 426
 427        /* Send a message to all CPUs in the map */
 428        arch_send_call_function_ipi_mask(data->cpumask);
 429
 430        /* Optionally wait for the CPUs to complete */
 431        if (wait)
 432                csd_lock_wait(&data->csd);
 433}
 434EXPORT_SYMBOL(smp_call_function_many);
 435
 436/**
 437 * smp_call_function(): Run a function on all other CPUs.
 438 * @func: The function to run. This must be fast and non-blocking.
 439 * @info: An arbitrary pointer to pass to the function.
 440 * @wait: If true, wait (atomically) until function has completed
 441 *        on other CPUs.
 442 *
 443 * Returns 0.
 444 *
 445 * If @wait is true, then returns once @func has returned; otherwise
 446 * it returns just before the target cpu calls @func. In case of allocation
 447 * failure, @wait will be implicitly turned on.
 448 *
 449 * You must not call this function with disabled interrupts or from a
 450 * hardware interrupt handler or from a bottom half handler.
 451 */
 452int smp_call_function(void (*func)(void *), void *info, int wait)
 453{
 454        preempt_disable();
 455        smp_call_function_many(cpu_online_mask, func, info, wait);
 456        preempt_enable();
 457
 458        return 0;
 459}
 460EXPORT_SYMBOL(smp_call_function);
 461
 462void ipi_call_lock(void)
 463{
 464        spin_lock(&call_function.lock);
 465}
 466
 467void ipi_call_unlock(void)
 468{
 469        spin_unlock(&call_function.lock);
 470}
 471
 472void ipi_call_lock_irq(void)
 473{
 474        spin_lock_irq(&call_function.lock);
 475}
 476
 477void ipi_call_unlock_irq(void)
 478{
 479        spin_unlock_irq(&call_function.lock);
 480}
 481