Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.28-rc6 116 lines 2.6 kB view raw
1#include <linux/kernel.h> 2#include <linux/bitops.h> 3#include <linux/cpumask.h> 4#include <linux/module.h> 5#include <linux/bootmem.h> 6 7int __first_cpu(const cpumask_t *srcp) 8{ 9 return min_t(int, NR_CPUS, find_first_bit(srcp->bits, NR_CPUS)); 10} 11EXPORT_SYMBOL(__first_cpu); 12 13int __next_cpu(int n, const cpumask_t *srcp) 14{ 15 return min_t(int, NR_CPUS, find_next_bit(srcp->bits, NR_CPUS, n+1)); 16} 17EXPORT_SYMBOL(__next_cpu); 18 19#if NR_CPUS > 64 20int __next_cpu_nr(int n, const cpumask_t *srcp) 21{ 22 return min_t(int, nr_cpu_ids, 23 find_next_bit(srcp->bits, nr_cpu_ids, n+1)); 24} 25EXPORT_SYMBOL(__next_cpu_nr); 26#endif 27 28int __any_online_cpu(const cpumask_t *mask) 29{ 30 int cpu; 31 32 for_each_cpu_mask(cpu, *mask) { 33 if (cpu_online(cpu)) 34 break; 35 } 36 return cpu; 37} 38EXPORT_SYMBOL(__any_online_cpu); 39 40/** 41 * cpumask_next_and - get the next cpu in *src1p & *src2p 42 * @n: the cpu prior to the place to search (ie. return will be > @n) 43 * @src1p: the first cpumask pointer 44 * @src2p: the second cpumask pointer 45 * 46 * Returns >= nr_cpu_ids if no further cpus set in both. 47 */ 48int cpumask_next_and(int n, const struct cpumask *src1p, 49 const struct cpumask *src2p) 50{ 51 while ((n = cpumask_next(n, src1p)) < nr_cpu_ids) 52 if (cpumask_test_cpu(n, src2p)) 53 break; 54 return n; 55} 56EXPORT_SYMBOL(cpumask_next_and); 57 58/** 59 * cpumask_any_but - return a "random" in a cpumask, but not this one. 60 * @mask: the cpumask to search 61 * @cpu: the cpu to ignore. 62 * 63 * Often used to find any cpu but smp_processor_id() in a mask. 64 * Returns >= nr_cpu_ids if no cpus set. 65 */ 66int cpumask_any_but(const struct cpumask *mask, unsigned int cpu) 67{ 68 unsigned int i; 69 70 cpumask_check(cpu); 71 for_each_cpu(i, mask) 72 if (i != cpu) 73 break; 74 return i; 75} 76 77/* These are not inline because of header tangles. */ 78#ifdef CONFIG_CPUMASK_OFFSTACK 79bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) 80{ 81 if (likely(slab_is_available())) 82 *mask = kmalloc(cpumask_size(), flags); 83 else { 84#ifdef CONFIG_DEBUG_PER_CPU_MAPS 85 printk(KERN_ERR 86 "=> alloc_cpumask_var: kmalloc not available!\n"); 87 dump_stack(); 88#endif 89 *mask = NULL; 90 } 91#ifdef CONFIG_DEBUG_PER_CPU_MAPS 92 if (!*mask) { 93 printk(KERN_ERR "=> alloc_cpumask_var: failed!\n"); 94 dump_stack(); 95 } 96#endif 97 return *mask != NULL; 98} 99EXPORT_SYMBOL(alloc_cpumask_var); 100 101void __init alloc_bootmem_cpumask_var(cpumask_var_t *mask) 102{ 103 *mask = alloc_bootmem(cpumask_size()); 104} 105 106void free_cpumask_var(cpumask_var_t mask) 107{ 108 kfree(mask); 109} 110EXPORT_SYMBOL(free_cpumask_var); 111 112void __init free_bootmem_cpumask_var(cpumask_var_t mask) 113{ 114 free_bootmem((unsigned long)mask, cpumask_size()); 115} 116#endif