smp.c 11.7 KB
Newer Older
1 2 3 4 5 6
/*
 * Generic helpers for smp ipi calls
 *
 * (C) Jens Axboe <jens.axboe@oracle.com> 2008
 */
#include <linux/rcupdate.h>
7
#include <linux/rculist.h>
I
Ingo Molnar 已提交
8 9 10
#include <linux/module.h>
#include <linux/percpu.h>
#include <linux/init.h>
11
#include <linux/smp.h>
P
Peter Zijlstra 已提交
12
#include <linux/cpu.h>
13 14

static DEFINE_PER_CPU(struct call_single_queue, call_single_queue);
P
Peter Zijlstra 已提交
15 16 17 18

static struct {
	struct list_head	queue;
	spinlock_t		lock;
I
Ingo Molnar 已提交
19 20 21 22 23
} call_function __cacheline_aligned_in_smp =
	{
		.queue		= LIST_HEAD_INIT(call_function.queue),
		.lock		= __SPIN_LOCK_UNLOCKED(call_function.lock),
	};
24 25

enum {
26
	CSD_FLAG_LOCK		= 0x01,
27 28 29
};

struct call_function_data {
I
Ingo Molnar 已提交
30 31 32 33
	struct call_single_data	csd;
	spinlock_t		lock;
	unsigned int		refs;
	cpumask_var_t		cpumask;
34 35 36
};

struct call_single_queue {
I
Ingo Molnar 已提交
37 38
	struct list_head	list;
	spinlock_t		lock;
39 40
};

P
Peter Zijlstra 已提交
41
static DEFINE_PER_CPU(struct call_function_data, cfd_data) = {
I
Ingo Molnar 已提交
42
	.lock			= __SPIN_LOCK_UNLOCKED(cfd_data.lock),
P
Peter Zijlstra 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
};

static int
hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)
{
	long cpu = (long)hcpu;
	struct call_function_data *cfd = &per_cpu(cfd_data, cpu);

	switch (action) {
	case CPU_UP_PREPARE:
	case CPU_UP_PREPARE_FROZEN:
		if (!alloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL,
				cpu_to_node(cpu)))
			return NOTIFY_BAD;
		break;

#ifdef CONFIG_CPU_HOTPLUG
	case CPU_UP_CANCELED:
	case CPU_UP_CANCELED_FROZEN:

	case CPU_DEAD:
	case CPU_DEAD_FROZEN:
		free_cpumask_var(cfd->cpumask);
		break;
#endif
	};

	return NOTIFY_OK;
}

static struct notifier_block __cpuinitdata hotplug_cfd_notifier = {
I
Ingo Molnar 已提交
74
	.notifier_call		= hotplug_cfd,
P
Peter Zijlstra 已提交
75 76
};

77
static int __cpuinit init_call_single_data(void)
78
{
P
Peter Zijlstra 已提交
79
	void *cpu = (void *)(long)smp_processor_id();
80 81 82 83 84 85 86 87
	int i;

	for_each_possible_cpu(i) {
		struct call_single_queue *q = &per_cpu(call_single_queue, i);

		spin_lock_init(&q->lock);
		INIT_LIST_HEAD(&q->list);
	}
P
Peter Zijlstra 已提交
88 89 90 91

	hotplug_cfd(&hotplug_cfd_notifier, CPU_UP_PREPARE, cpu);
	register_cpu_notifier(&hotplug_cfd_notifier);

92
	return 0;
93
}
94
early_initcall(init_call_single_data);
95

P
Peter Zijlstra 已提交
96 97 98
/*
 * csd_lock/csd_unlock used to serialize access to per-cpu csd resources
 *
I
Ingo Molnar 已提交
99 100 101
 * For non-synchronous ipi calls the csd can still be in use by the
 * previous function call. For multi-cpu calls its even more interesting
 * as we'll have to ensure no other cpu is observing our csd.
P
Peter Zijlstra 已提交
102
 */
103
static void csd_lock_wait(struct call_single_data *data)
P
Peter Zijlstra 已提交
104 105 106
{
	while (data->flags & CSD_FLAG_LOCK)
		cpu_relax();
107 108 109 110 111
}

static void csd_lock(struct call_single_data *data)
{
	csd_lock_wait(data);
P
Peter Zijlstra 已提交
112 113 114
	data->flags = CSD_FLAG_LOCK;

	/*
I
Ingo Molnar 已提交
115 116 117
	 * prevent CPU from reordering the above assignment
	 * to ->flags with any subsequent assignments to other
	 * fields of the specified call_single_data structure:
P
Peter Zijlstra 已提交
118 119 120 121 122 123 124
	 */
	smp_mb();
}

static void csd_unlock(struct call_single_data *data)
{
	WARN_ON(!(data->flags & CSD_FLAG_LOCK));
I
Ingo Molnar 已提交
125

P
Peter Zijlstra 已提交
126
	/*
I
Ingo Molnar 已提交
127
	 * ensure we're all done before releasing data:
P
Peter Zijlstra 已提交
128 129
	 */
	smp_mb();
I
Ingo Molnar 已提交
130

P
Peter Zijlstra 已提交
131
	data->flags &= ~CSD_FLAG_LOCK;
132 133 134
}

/*
I
Ingo Molnar 已提交
135 136 137
 * Insert a previously allocated call_single_data element
 * for execution on the given CPU. data must already have
 * ->func, ->info, and ->flags set.
138
 */
139 140
static
void generic_exec_single(int cpu, struct call_single_data *data, int wait)
141 142 143
{
	struct call_single_queue *dst = &per_cpu(call_single_queue, cpu);
	unsigned long flags;
144
	int ipi;
145 146 147 148 149 150

	spin_lock_irqsave(&dst->lock, flags);
	ipi = list_empty(&dst->list);
	list_add_tail(&data->list, &dst->list);
	spin_unlock_irqrestore(&dst->lock, flags);

151
	/*
152 153 154 155 156 157 158
	 * The list addition should be visible before sending the IPI
	 * handler locks the list to pull the entry off it because of
	 * normal cache coherency rules implied by spinlocks.
	 *
	 * If IPIs can go out of order to the cache coherency protocol
	 * in an architecture, sufficient synchronisation should be added
	 * to arch code to make it appear to obey cache coherency WRT
I
Ingo Molnar 已提交
159 160
	 * locking and barrier primitives. Generic code isn't really
	 * equipped to do the right thing...
161
	 */
162 163 164 165
	if (ipi)
		arch_send_call_function_single_ipi(cpu);

	if (wait)
166
		csd_lock_wait(data);
167 168 169 170 171 172 173 174 175 176 177
}

/*
 * Invoked by arch to handle an IPI for call function. Must be called with
 * interrupts disabled.
 */
void generic_smp_call_function_interrupt(void)
{
	struct call_function_data *data;
	int cpu = get_cpu();

178 179 180 181 182 183 184 185
	/*
	 * Ensure entry is visible on call_function_queue after we have
	 * entered the IPI. See comment in smp_call_function_many.
	 * If we don't have this, then we may miss an entry on the list
	 * and never get another IPI to process it.
	 */
	smp_mb();

186
	/*
I
Ingo Molnar 已提交
187 188
	 * It's ok to use list_for_each_rcu() here even though we may
	 * delete 'pos', since list_del_rcu() doesn't clear ->next
189
	 */
P
Peter Zijlstra 已提交
190
	list_for_each_entry_rcu(data, &call_function.queue, csd.list) {
191 192
		int refs;

P
Peter Zijlstra 已提交
193 194 195
		spin_lock(&data->lock);
		if (!cpumask_test_cpu(cpu, data->cpumask)) {
			spin_unlock(&data->lock);
196
			continue;
P
Peter Zijlstra 已提交
197 198 199
		}
		cpumask_clear_cpu(cpu, data->cpumask);
		spin_unlock(&data->lock);
200 201 202 203 204

		data->csd.func(data->csd.info);

		spin_lock(&data->lock);
		WARN_ON(data->refs == 0);
P
Peter Zijlstra 已提交
205 206 207 208 209 210
		refs = --data->refs;
		if (!refs) {
			spin_lock(&call_function.lock);
			list_del_rcu(&data->csd.list);
			spin_unlock(&call_function.lock);
		}
211 212 213 214 215
		spin_unlock(&data->lock);

		if (refs)
			continue;

P
Peter Zijlstra 已提交
216
		csd_unlock(&data->csd);
217 218 219 220 221 222
	}

	put_cpu();
}

/*
I
Ingo Molnar 已提交
223 224
 * Invoked by arch to handle an IPI for call function single. Must be
 * called from the arch with interrupts disabled.
225 226 227 228
 */
void generic_smp_call_function_single_interrupt(void)
{
	struct call_single_queue *q = &__get_cpu_var(call_single_queue);
229
	unsigned int data_flags;
I
Ingo Molnar 已提交
230
	LIST_HEAD(list);
231

232 233 234
	spin_lock(&q->lock);
	list_replace_init(&q->list, &list);
	spin_unlock(&q->lock);
235

236 237
	while (!list_empty(&list)) {
		struct call_single_data *data;
238

I
Ingo Molnar 已提交
239
		data = list_entry(list.next, struct call_single_data, list);
240
		list_del(&data->list);
241 242

		/*
I
Ingo Molnar 已提交
243 244 245
		 * 'data' can be invalid after this call if flags == 0
		 * (when called through generic_exec_single()),
		 * so save them away before making the call:
246
		 */
247 248 249 250
		data_flags = data->flags;

		data->func(data->info);

P
Peter Zijlstra 已提交
251
		/*
I
Ingo Molnar 已提交
252
		 * Unlocked CSDs are valid through generic_exec_single():
P
Peter Zijlstra 已提交
253 254 255
		 */
		if (data_flags & CSD_FLAG_LOCK)
			csd_unlock(data);
256 257 258
	}
}

259 260
static DEFINE_PER_CPU(struct call_single_data, csd_data);

261 262 263 264 265 266 267 268 269 270 271
/*
 * smp_call_function_single - Run a function on a specific CPU
 * @func: The function to run. This must be fast and non-blocking.
 * @info: An arbitrary pointer to pass to the function.
 * @wait: If true, wait until function has completed on other CPUs.
 *
 * Returns 0 on success, else a negative status code. Note that @wait
 * will be implicitly turned on in case of allocation failures, since
 * we fall back to on-stack allocation.
 */
int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
272
			     int wait)
273
{
P
Peter Zijlstra 已提交
274 275 276
	struct call_single_data d = {
		.flags = 0,
	};
277
	unsigned long flags;
I
Ingo Molnar 已提交
278
	int this_cpu;
279
	int err = 0;
280

I
Ingo Molnar 已提交
281 282 283 284 285 286
	/*
	 * prevent preemption and reschedule on another processor,
	 * as well as CPU removal
	 */
	this_cpu = get_cpu();

287 288 289
	/* Can deadlock when called with interrupts disabled */
	WARN_ON(irqs_disabled());

I
Ingo Molnar 已提交
290
	if (cpu == this_cpu) {
291 292 293
		local_irq_save(flags);
		func(info);
		local_irq_restore(flags);
I
Ingo Molnar 已提交
294 295 296
	} else {
		if ((unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) {
			struct call_single_data *data = &d;
297

I
Ingo Molnar 已提交
298 299
			if (!wait)
				data = &__get_cpu_var(csd_data);
300

I
Ingo Molnar 已提交
301
			csd_lock(data);
302

I
Ingo Molnar 已提交
303 304 305 306 307 308
			data->func = func;
			data->info = info;
			generic_exec_single(cpu, data, wait);
		} else {
			err = -ENXIO;	/* CPU not online */
		}
309 310 311
	}

	put_cpu();
I
Ingo Molnar 已提交
312

313
	return err;
314 315 316 317 318 319 320 321
}
EXPORT_SYMBOL(smp_call_function_single);

/**
 * __smp_call_function_single(): Run a function on another CPU
 * @cpu: The CPU to run on.
 * @data: Pre-allocated and setup data structure
 *
I
Ingo Molnar 已提交
322 323 324
 * Like smp_call_function_single(), but allow caller to pass in a
 * pre-allocated data structure. Useful for embedding @data inside
 * other structures, for instance.
325
 */
326 327
void __smp_call_function_single(int cpu, struct call_single_data *data,
				int wait)
328
{
329 330
	csd_lock(data);

331
	/* Can deadlock when called with interrupts disabled */
332
	WARN_ON(wait && irqs_disabled());
333

334
	generic_exec_single(cpu, data, wait);
335 336
}

I
Ingo Molnar 已提交
337 338
/* Deprecated: shim for archs using old arch_send_call_function_ipi API. */

339
#ifndef arch_send_call_function_ipi_mask
I
Ingo Molnar 已提交
340 341
# define arch_send_call_function_ipi_mask(maskp) \
	 arch_send_call_function_ipi(*(maskp))
342 343
#endif

344
/**
R
Rusty Russell 已提交
345 346
 * smp_call_function_many(): Run a function on a set of other CPUs.
 * @mask: The set of cpus to run on (only runs on online subset).
347 348
 * @func: The function to run. This must be fast and non-blocking.
 * @info: An arbitrary pointer to pass to the function.
I
Ingo Molnar 已提交
349 350
 * @wait: If true, wait (atomically) until function has completed
 *        on other CPUs.
351 352 353 354 355 356 357 358 359
 *
 * If @wait is true, then returns once @func has returned. Note that @wait
 * will be implicitly turned on in case of allocation failures, since
 * we fall back to on-stack allocation.
 *
 * You must not call this function with disabled interrupts or from a
 * hardware interrupt handler or from a bottom half handler. Preemption
 * must be disabled when calling this function.
 */
R
Rusty Russell 已提交
360
void smp_call_function_many(const struct cpumask *mask,
I
Ingo Molnar 已提交
361
			    void (*func)(void *), void *info, bool wait)
362
{
R
Rusty Russell 已提交
363
	struct call_function_data *data;
364
	unsigned long flags;
I
Ingo Molnar 已提交
365
	int cpu, next_cpu, this_cpu = smp_processor_id();
366 367 368 369

	/* Can deadlock when called with interrupts disabled */
	WARN_ON(irqs_disabled());

I
Ingo Molnar 已提交
370
	/* So, what's a CPU they want? Ignoring this one. */
R
Rusty Russell 已提交
371
	cpu = cpumask_first_and(mask, cpu_online_mask);
I
Ingo Molnar 已提交
372
	if (cpu == this_cpu)
R
Rusty Russell 已提交
373
		cpu = cpumask_next_and(cpu, mask, cpu_online_mask);
I
Ingo Molnar 已提交
374

R
Rusty Russell 已提交
375 376 377 378 379 380
	/* No online cpus?  We're done. */
	if (cpu >= nr_cpu_ids)
		return;

	/* Do we have another CPU which isn't us? */
	next_cpu = cpumask_next_and(cpu, mask, cpu_online_mask);
I
Ingo Molnar 已提交
381
	if (next_cpu == this_cpu)
R
Rusty Russell 已提交
382 383 384 385 386 387
		next_cpu = cpumask_next_and(next_cpu, mask, cpu_online_mask);

	/* Fastpath: do that cpu by itself. */
	if (next_cpu >= nr_cpu_ids) {
		smp_call_function_single(cpu, func, info, wait);
		return;
388 389
	}

P
Peter Zijlstra 已提交
390 391
	data = &__get_cpu_var(cfd_data);
	csd_lock(&data->csd);
392

P
Peter Zijlstra 已提交
393
	spin_lock_irqsave(&data->lock, flags);
394 395
	data->csd.func = func;
	data->csd.info = info;
P
Peter Zijlstra 已提交
396
	cpumask_and(data->cpumask, mask, cpu_online_mask);
I
Ingo Molnar 已提交
397
	cpumask_clear_cpu(this_cpu, data->cpumask);
P
Peter Zijlstra 已提交
398
	data->refs = cpumask_weight(data->cpumask);
399

P
Peter Zijlstra 已提交
400 401 402
	spin_lock(&call_function.lock);
	/*
	 * Place entry at the _HEAD_ of the list, so that any cpu still
I
Ingo Molnar 已提交
403 404
	 * observing the entry in generic_smp_call_function_interrupt()
	 * will not miss any other list entries:
P
Peter Zijlstra 已提交
405 406 407
	 */
	list_add_rcu(&data->csd.list, &call_function.queue);
	spin_unlock(&call_function.lock);
I
Ingo Molnar 已提交
408

P
Peter Zijlstra 已提交
409
	spin_unlock_irqrestore(&data->lock, flags);
410

411 412
	/*
	 * Make the list addition visible before sending the ipi.
I
Ingo Molnar 已提交
413 414
	 * (IPIs must obey or appear to obey normal Linux cache
	 * coherency rules -- see comment in generic_exec_single).
415 416 417
	 */
	smp_mb();

418
	/* Send a message to all CPUs in the map */
P
Peter Zijlstra 已提交
419
	arch_send_call_function_ipi_mask(data->cpumask);
420

I
Ingo Molnar 已提交
421
	/* Optionally wait for the CPUs to complete */
R
Rusty Russell 已提交
422
	if (wait)
423
		csd_lock_wait(&data->csd);
424
}
R
Rusty Russell 已提交
425
EXPORT_SYMBOL(smp_call_function_many);
426 427 428 429 430

/**
 * smp_call_function(): Run a function on all other CPUs.
 * @func: The function to run. This must be fast and non-blocking.
 * @info: An arbitrary pointer to pass to the function.
I
Ingo Molnar 已提交
431 432
 * @wait: If true, wait (atomically) until function has completed
 *        on other CPUs.
433
 *
R
Rusty Russell 已提交
434
 * Returns 0.
435 436 437 438 439 440 441 442
 *
 * If @wait is true, then returns once @func has returned; otherwise
 * it returns just before the target cpu calls @func. In case of allocation
 * failure, @wait will be implicitly turned on.
 *
 * You must not call this function with disabled interrupts or from a
 * hardware interrupt handler or from a bottom half handler.
 */
443
int smp_call_function(void (*func)(void *), void *info, int wait)
444 445
{
	preempt_disable();
R
Rusty Russell 已提交
446
	smp_call_function_many(cpu_online_mask, func, info, wait);
447
	preempt_enable();
I
Ingo Molnar 已提交
448

R
Rusty Russell 已提交
449
	return 0;
450 451 452 453 454
}
EXPORT_SYMBOL(smp_call_function);

void ipi_call_lock(void)
{
P
Peter Zijlstra 已提交
455
	spin_lock(&call_function.lock);
456 457 458 459
}

void ipi_call_unlock(void)
{
P
Peter Zijlstra 已提交
460
	spin_unlock(&call_function.lock);
461 462 463 464
}

void ipi_call_lock_irq(void)
{
P
Peter Zijlstra 已提交
465
	spin_lock_irq(&call_function.lock);
466 467 468 469
}

void ipi_call_unlock_irq(void)
{
P
Peter Zijlstra 已提交
470
	spin_unlock_irq(&call_function.lock);
471
}