diff options
Diffstat (limited to 'kernel')
36 files changed, 2135 insertions, 825 deletions
| diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks new file mode 100644 index 000000000000..88c92fb44618 --- /dev/null +++ b/kernel/Kconfig.locks | |||
| @@ -0,0 +1,202 @@ | |||
| 1 | # | ||
| 2 | # The ARCH_INLINE foo is necessary because select ignores "depends on" | ||
| 3 | # | ||
| 4 | config ARCH_INLINE_SPIN_TRYLOCK | ||
| 5 | bool | ||
| 6 | |||
| 7 | config ARCH_INLINE_SPIN_TRYLOCK_BH | ||
| 8 | bool | ||
| 9 | |||
| 10 | config ARCH_INLINE_SPIN_LOCK | ||
| 11 | bool | ||
| 12 | |||
| 13 | config ARCH_INLINE_SPIN_LOCK_BH | ||
| 14 | bool | ||
| 15 | |||
| 16 | config ARCH_INLINE_SPIN_LOCK_IRQ | ||
| 17 | bool | ||
| 18 | |||
| 19 | config ARCH_INLINE_SPIN_LOCK_IRQSAVE | ||
| 20 | bool | ||
| 21 | |||
| 22 | config ARCH_INLINE_SPIN_UNLOCK | ||
| 23 | bool | ||
| 24 | |||
| 25 | config ARCH_INLINE_SPIN_UNLOCK_BH | ||
| 26 | bool | ||
| 27 | |||
| 28 | config ARCH_INLINE_SPIN_UNLOCK_IRQ | ||
| 29 | bool | ||
| 30 | |||
| 31 | config ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE | ||
| 32 | bool | ||
| 33 | |||
| 34 | |||
| 35 | config ARCH_INLINE_READ_TRYLOCK | ||
| 36 | bool | ||
| 37 | |||
| 38 | config ARCH_INLINE_READ_LOCK | ||
| 39 | bool | ||
| 40 | |||
| 41 | config ARCH_INLINE_READ_LOCK_BH | ||
| 42 | bool | ||
| 43 | |||
| 44 | config ARCH_INLINE_READ_LOCK_IRQ | ||
| 45 | bool | ||
| 46 | |||
| 47 | config ARCH_INLINE_READ_LOCK_IRQSAVE | ||
| 48 | bool | ||
| 49 | |||
| 50 | config ARCH_INLINE_READ_UNLOCK | ||
| 51 | bool | ||
| 52 | |||
| 53 | config ARCH_INLINE_READ_UNLOCK_BH | ||
| 54 | bool | ||
| 55 | |||
| 56 | config ARCH_INLINE_READ_UNLOCK_IRQ | ||
| 57 | bool | ||
| 58 | |||
| 59 | config ARCH_INLINE_READ_UNLOCK_IRQRESTORE | ||
| 60 | bool | ||
| 61 | |||
| 62 | |||
| 63 | config ARCH_INLINE_WRITE_TRYLOCK | ||
| 64 | bool | ||
| 65 | |||
| 66 | config ARCH_INLINE_WRITE_LOCK | ||
| 67 | bool | ||
| 68 | |||
| 69 | config ARCH_INLINE_WRITE_LOCK_BH | ||
| 70 | bool | ||
| 71 | |||
| 72 | config ARCH_INLINE_WRITE_LOCK_IRQ | ||
| 73 | bool | ||
| 74 | |||
| 75 | config ARCH_INLINE_WRITE_LOCK_IRQSAVE | ||
| 76 | bool | ||
| 77 | |||
| 78 | config ARCH_INLINE_WRITE_UNLOCK | ||
| 79 | bool | ||
| 80 | |||
| 81 | config ARCH_INLINE_WRITE_UNLOCK_BH | ||
| 82 | bool | ||
| 83 | |||
| 84 | config ARCH_INLINE_WRITE_UNLOCK_IRQ | ||
| 85 | bool | ||
| 86 | |||
| 87 | config ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE | ||
| 88 | bool | ||
| 89 | |||
| 90 | # | ||
| 91 | # lock_* functions are inlined when: | ||
| 92 | # - DEBUG_SPINLOCK=n and GENERIC_LOCKBREAK=n and ARCH_INLINE_*LOCK=y | ||
| 93 | # | ||
| 94 | # trylock_* functions are inlined when: | ||
| 95 | # - DEBUG_SPINLOCK=n and ARCH_INLINE_*LOCK=y | ||
| 96 | # | ||
| 97 | # unlock and unlock_irq functions are inlined when: | ||
| 98 | # - DEBUG_SPINLOCK=n and ARCH_INLINE_*LOCK=y | ||
| 99 | # or | ||
| 100 | # - DEBUG_SPINLOCK=n and PREEMPT=n | ||
| 101 | # | ||
| 102 | # unlock_bh and unlock_irqrestore functions are inlined when: | ||
| 103 | # - DEBUG_SPINLOCK=n and ARCH_INLINE_*LOCK=y | ||
| 104 | # | ||
| 105 | |||
| 106 | config INLINE_SPIN_TRYLOCK | ||
| 107 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_SPIN_TRYLOCK | ||
| 108 | |||
| 109 | config INLINE_SPIN_TRYLOCK_BH | ||
| 110 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_SPIN_TRYLOCK_BH | ||
| 111 | |||
| 112 | config INLINE_SPIN_LOCK | ||
| 113 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && ARCH_INLINE_SPIN_LOCK | ||
| 114 | |||
| 115 | config INLINE_SPIN_LOCK_BH | ||
| 116 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 117 | ARCH_INLINE_SPIN_LOCK_BH | ||
| 118 | |||
| 119 | config INLINE_SPIN_LOCK_IRQ | ||
| 120 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 121 | ARCH_INLINE_SPIN_LOCK_IRQ | ||
| 122 | |||
| 123 | config INLINE_SPIN_LOCK_IRQSAVE | ||
| 124 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 125 | ARCH_INLINE_SPIN_LOCK_IRQSAVE | ||
| 126 | |||
| 127 | config INLINE_SPIN_UNLOCK | ||
| 128 | def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_SPIN_UNLOCK) | ||
| 129 | |||
| 130 | config INLINE_SPIN_UNLOCK_BH | ||
| 131 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_SPIN_UNLOCK_BH | ||
| 132 | |||
| 133 | config INLINE_SPIN_UNLOCK_IRQ | ||
| 134 | def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_SPIN_UNLOCK_BH) | ||
| 135 | |||
| 136 | config INLINE_SPIN_UNLOCK_IRQRESTORE | ||
| 137 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE | ||
| 138 | |||
| 139 | |||
| 140 | config INLINE_READ_TRYLOCK | ||
| 141 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_READ_TRYLOCK | ||
| 142 | |||
| 143 | config INLINE_READ_LOCK | ||
| 144 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && ARCH_INLINE_READ_LOCK | ||
| 145 | |||
| 146 | config INLINE_READ_LOCK_BH | ||
| 147 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 148 | ARCH_INLINE_READ_LOCK_BH | ||
| 149 | |||
| 150 | config INLINE_READ_LOCK_IRQ | ||
| 151 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 152 | ARCH_INLINE_READ_LOCK_IRQ | ||
| 153 | |||
| 154 | config INLINE_READ_LOCK_IRQSAVE | ||
| 155 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 156 | ARCH_INLINE_READ_LOCK_IRQSAVE | ||
| 157 | |||
| 158 | config INLINE_READ_UNLOCK | ||
| 159 | def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_READ_UNLOCK) | ||
| 160 | |||
| 161 | config INLINE_READ_UNLOCK_BH | ||
| 162 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_READ_UNLOCK_BH | ||
| 163 | |||
| 164 | config INLINE_READ_UNLOCK_IRQ | ||
| 165 | def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_READ_UNLOCK_BH) | ||
| 166 | |||
| 167 | config INLINE_READ_UNLOCK_IRQRESTORE | ||
| 168 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_READ_UNLOCK_IRQRESTORE | ||
| 169 | |||
| 170 | |||
| 171 | config INLINE_WRITE_TRYLOCK | ||
| 172 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_WRITE_TRYLOCK | ||
| 173 | |||
| 174 | config INLINE_WRITE_LOCK | ||
| 175 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && ARCH_INLINE_WRITE_LOCK | ||
| 176 | |||
| 177 | config INLINE_WRITE_LOCK_BH | ||
| 178 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 179 | ARCH_INLINE_WRITE_LOCK_BH | ||
| 180 | |||
| 181 | config INLINE_WRITE_LOCK_IRQ | ||
| 182 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 183 | ARCH_INLINE_WRITE_LOCK_IRQ | ||
| 184 | |||
| 185 | config INLINE_WRITE_LOCK_IRQSAVE | ||
| 186 | def_bool !DEBUG_SPINLOCK && !GENERIC_LOCKBREAK && \ | ||
| 187 | ARCH_INLINE_WRITE_LOCK_IRQSAVE | ||
| 188 | |||
| 189 | config INLINE_WRITE_UNLOCK | ||
| 190 | def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_WRITE_UNLOCK) | ||
| 191 | |||
| 192 | config INLINE_WRITE_UNLOCK_BH | ||
| 193 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_WRITE_UNLOCK_BH | ||
| 194 | |||
| 195 | config INLINE_WRITE_UNLOCK_IRQ | ||
| 196 | def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_WRITE_UNLOCK_BH) | ||
| 197 | |||
| 198 | config INLINE_WRITE_UNLOCK_IRQRESTORE | ||
| 199 | def_bool !DEBUG_SPINLOCK && ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE | ||
| 200 | |||
| 201 | config MUTEX_SPIN_ON_OWNER | ||
| 202 | def_bool SMP && !DEBUG_MUTEXES && !HAVE_DEFAULT_NO_SPIN_MUTEXES | ||
| diff --git a/kernel/Makefile b/kernel/Makefile index d7c13d249b2d..dcf6789bf547 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
| @@ -82,6 +82,7 @@ obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o | |||
| 82 | obj-$(CONFIG_TREE_RCU) += rcutree.o | 82 | obj-$(CONFIG_TREE_RCU) += rcutree.o | 
| 83 | obj-$(CONFIG_TREE_PREEMPT_RCU) += rcutree.o | 83 | obj-$(CONFIG_TREE_PREEMPT_RCU) += rcutree.o | 
| 84 | obj-$(CONFIG_TREE_RCU_TRACE) += rcutree_trace.o | 84 | obj-$(CONFIG_TREE_RCU_TRACE) += rcutree_trace.o | 
| 85 | obj-$(CONFIG_TINY_RCU) += rcutiny.o | ||
| 85 | obj-$(CONFIG_RELAY) += relay.o | 86 | obj-$(CONFIG_RELAY) += relay.o | 
| 86 | obj-$(CONFIG_SYSCTL) += utsname_sysctl.o | 87 | obj-$(CONFIG_SYSCTL) += utsname_sysctl.o | 
| 87 | obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o | 88 | obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o | 
| diff --git a/kernel/capability.c b/kernel/capability.c index 4e17041963f5..7f876e60521f 100644 --- a/kernel/capability.c +++ b/kernel/capability.c | |||
| @@ -29,7 +29,6 @@ EXPORT_SYMBOL(__cap_empty_set); | |||
| 29 | EXPORT_SYMBOL(__cap_full_set); | 29 | EXPORT_SYMBOL(__cap_full_set); | 
| 30 | EXPORT_SYMBOL(__cap_init_eff_set); | 30 | EXPORT_SYMBOL(__cap_init_eff_set); | 
| 31 | 31 | ||
| 32 | #ifdef CONFIG_SECURITY_FILE_CAPABILITIES | ||
| 33 | int file_caps_enabled = 1; | 32 | int file_caps_enabled = 1; | 
| 34 | 33 | ||
| 35 | static int __init file_caps_disable(char *str) | 34 | static int __init file_caps_disable(char *str) | 
| @@ -38,7 +37,6 @@ static int __init file_caps_disable(char *str) | |||
| 38 | return 1; | 37 | return 1; | 
| 39 | } | 38 | } | 
| 40 | __setup("no_file_caps", file_caps_disable); | 39 | __setup("no_file_caps", file_caps_disable); | 
| 41 | #endif | ||
| 42 | 40 | ||
| 43 | /* | 41 | /* | 
| 44 | * More recent versions of libcap are available from: | 42 | * More recent versions of libcap are available from: | 
| @@ -169,8 +167,8 @@ SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr) | |||
| 169 | kernel_cap_t pE, pI, pP; | 167 | kernel_cap_t pE, pI, pP; | 
| 170 | 168 | ||
| 171 | ret = cap_validate_magic(header, &tocopy); | 169 | ret = cap_validate_magic(header, &tocopy); | 
| 172 | if (ret != 0) | 170 | if ((dataptr == NULL) || (ret != 0)) | 
| 173 | return ret; | 171 | return ((dataptr == NULL) && (ret == -EINVAL)) ? 0 : ret; | 
| 174 | 172 | ||
| 175 | if (get_user(pid, &header->pid)) | 173 | if (get_user(pid, &header->pid)) | 
| 176 | return -EFAULT; | 174 | return -EFAULT; | 
| @@ -238,7 +236,7 @@ SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr) | |||
| 238 | SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data) | 236 | SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data) | 
| 239 | { | 237 | { | 
| 240 | struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S]; | 238 | struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S]; | 
| 241 | unsigned i, tocopy; | 239 | unsigned i, tocopy, copybytes; | 
| 242 | kernel_cap_t inheritable, permitted, effective; | 240 | kernel_cap_t inheritable, permitted, effective; | 
| 243 | struct cred *new; | 241 | struct cred *new; | 
| 244 | int ret; | 242 | int ret; | 
| @@ -255,8 +253,11 @@ SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data) | |||
| 255 | if (pid != 0 && pid != task_pid_vnr(current)) | 253 | if (pid != 0 && pid != task_pid_vnr(current)) | 
| 256 | return -EPERM; | 254 | return -EPERM; | 
| 257 | 255 | ||
| 258 | if (copy_from_user(&kdata, data, | 256 | copybytes = tocopy * sizeof(struct __user_cap_data_struct); | 
| 259 | tocopy * sizeof(struct __user_cap_data_struct))) | 257 | if (copybytes > sizeof(kdata)) | 
| 258 | return -EFAULT; | ||
| 259 | |||
| 260 | if (copy_from_user(&kdata, data, copybytes)) | ||
| 260 | return -EFAULT; | 261 | return -EFAULT; | 
| 261 | 262 | ||
| 262 | for (i = 0; i < tocopy; i++) { | 263 | for (i = 0; i < tocopy; i++) { | 
| diff --git a/kernel/hung_task.c b/kernel/hung_task.c index d4e841747400..0c642d51aac2 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c | |||
| @@ -144,7 +144,7 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) | |||
| 144 | 144 | ||
| 145 | rcu_read_lock(); | 145 | rcu_read_lock(); | 
| 146 | do_each_thread(g, t) { | 146 | do_each_thread(g, t) { | 
| 147 | if (!--max_count) | 147 | if (!max_count--) | 
| 148 | goto unlock; | 148 | goto unlock; | 
| 149 | if (!--batch_count) { | 149 | if (!--batch_count) { | 
| 150 | batch_count = HUNG_TASK_BATCHING; | 150 | batch_count = HUNG_TASK_BATCHING; | 
| diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index c1660194d115..ba566c261adc 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -166,11 +166,11 @@ int set_irq_data(unsigned int irq, void *data) | |||
| 166 | EXPORT_SYMBOL(set_irq_data); | 166 | EXPORT_SYMBOL(set_irq_data); | 
| 167 | 167 | ||
| 168 | /** | 168 | /** | 
| 169 | * set_irq_data - set irq type data for an irq | 169 | * set_irq_msi - set MSI descriptor data for an irq | 
| 170 | * @irq: Interrupt number | 170 | * @irq: Interrupt number | 
| 171 | * @entry: Pointer to MSI descriptor data | 171 | * @entry: Pointer to MSI descriptor data | 
| 172 | * | 172 | * | 
| 173 | * Set the hardware irq controller data for an irq | 173 | * Set the MSI descriptor entry for an irq | 
| 174 | */ | 174 | */ | 
| 175 | int set_irq_msi(unsigned int irq, struct msi_desc *entry) | 175 | int set_irq_msi(unsigned int irq, struct msi_desc *entry) | 
| 176 | { | 176 | { | 
| @@ -590,7 +590,7 @@ out_unlock: | |||
| 590 | } | 590 | } | 
| 591 | 591 | ||
| 592 | /** | 592 | /** | 
| 593 | * handle_percpu_IRQ - Per CPU local irq handler | 593 | * handle_percpu_irq - Per CPU local irq handler | 
| 594 | * @irq: the interrupt number | 594 | * @irq: the interrupt number | 
| 595 | * @desc: the interrupt description structure for this irq | 595 | * @desc: the interrupt description structure for this irq | 
| 596 | * | 596 | * | 
| diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 692363dd591f..0832145fea97 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
| @@ -136,7 +136,7 @@ out: | |||
| 136 | 136 | ||
| 137 | static int default_affinity_open(struct inode *inode, struct file *file) | 137 | static int default_affinity_open(struct inode *inode, struct file *file) | 
| 138 | { | 138 | { | 
| 139 | return single_open(file, default_affinity_show, NULL); | 139 | return single_open(file, default_affinity_show, PDE(inode)->data); | 
| 140 | } | 140 | } | 
| 141 | 141 | ||
| 142 | static const struct file_operations default_affinity_proc_fops = { | 142 | static const struct file_operations default_affinity_proc_fops = { | 
| @@ -148,18 +148,28 @@ static const struct file_operations default_affinity_proc_fops = { | |||
| 148 | }; | 148 | }; | 
| 149 | #endif | 149 | #endif | 
| 150 | 150 | ||
| 151 | static int irq_spurious_read(char *page, char **start, off_t off, | 151 | static int irq_spurious_proc_show(struct seq_file *m, void *v) | 
| 152 | int count, int *eof, void *data) | ||
| 153 | { | 152 | { | 
| 154 | struct irq_desc *desc = irq_to_desc((long) data); | 153 | struct irq_desc *desc = irq_to_desc((long) m->private); | 
| 155 | return sprintf(page, "count %u\n" | 154 | |
| 156 | "unhandled %u\n" | 155 | seq_printf(m, "count %u\n" "unhandled %u\n" "last_unhandled %u ms\n", | 
| 157 | "last_unhandled %u ms\n", | 156 | desc->irq_count, desc->irqs_unhandled, | 
| 158 | desc->irq_count, | 157 | jiffies_to_msecs(desc->last_unhandled)); | 
| 159 | desc->irqs_unhandled, | 158 | return 0; | 
| 160 | jiffies_to_msecs(desc->last_unhandled)); | 159 | } | 
| 160 | |||
| 161 | static int irq_spurious_proc_open(struct inode *inode, struct file *file) | ||
| 162 | { | ||
| 163 | return single_open(file, irq_spurious_proc_show, NULL); | ||
| 161 | } | 164 | } | 
| 162 | 165 | ||
| 166 | static const struct file_operations irq_spurious_proc_fops = { | ||
| 167 | .open = irq_spurious_proc_open, | ||
| 168 | .read = seq_read, | ||
| 169 | .llseek = seq_lseek, | ||
| 170 | .release = single_release, | ||
| 171 | }; | ||
| 172 | |||
| 163 | #define MAX_NAMELEN 128 | 173 | #define MAX_NAMELEN 128 | 
| 164 | 174 | ||
| 165 | static int name_unique(unsigned int irq, struct irqaction *new_action) | 175 | static int name_unique(unsigned int irq, struct irqaction *new_action) | 
| @@ -204,7 +214,6 @@ void register_handler_proc(unsigned int irq, struct irqaction *action) | |||
| 204 | void register_irq_proc(unsigned int irq, struct irq_desc *desc) | 214 | void register_irq_proc(unsigned int irq, struct irq_desc *desc) | 
| 205 | { | 215 | { | 
| 206 | char name [MAX_NAMELEN]; | 216 | char name [MAX_NAMELEN]; | 
| 207 | struct proc_dir_entry *entry; | ||
| 208 | 217 | ||
| 209 | if (!root_irq_dir || (desc->chip == &no_irq_chip) || desc->dir) | 218 | if (!root_irq_dir || (desc->chip == &no_irq_chip) || desc->dir) | 
| 210 | return; | 219 | return; | 
| @@ -214,6 +223,8 @@ void register_irq_proc(unsigned int irq, struct irq_desc *desc) | |||
| 214 | 223 | ||
| 215 | /* create /proc/irq/1234 */ | 224 | /* create /proc/irq/1234 */ | 
| 216 | desc->dir = proc_mkdir(name, root_irq_dir); | 225 | desc->dir = proc_mkdir(name, root_irq_dir); | 
| 226 | if (!desc->dir) | ||
| 227 | return; | ||
| 217 | 228 | ||
| 218 | #ifdef CONFIG_SMP | 229 | #ifdef CONFIG_SMP | 
| 219 | /* create /proc/irq/<irq>/smp_affinity */ | 230 | /* create /proc/irq/<irq>/smp_affinity */ | 
| @@ -221,11 +232,8 @@ void register_irq_proc(unsigned int irq, struct irq_desc *desc) | |||
| 221 | &irq_affinity_proc_fops, (void *)(long)irq); | 232 | &irq_affinity_proc_fops, (void *)(long)irq); | 
| 222 | #endif | 233 | #endif | 
| 223 | 234 | ||
| 224 | entry = create_proc_entry("spurious", 0444, desc->dir); | 235 | proc_create_data("spurious", 0444, desc->dir, | 
| 225 | if (entry) { | 236 | &irq_spurious_proc_fops, (void *)(long)irq); | 
| 226 | entry->data = (void *)(long)irq; | ||
| 227 | entry->read_proc = irq_spurious_read; | ||
| 228 | } | ||
| 229 | } | 237 | } | 
| 230 | 238 | ||
| 231 | #undef MAX_NAMELEN | 239 | #undef MAX_NAMELEN | 
| diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index bd7273e6282e..22b0a6eedf24 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c | |||
| @@ -104,7 +104,7 @@ static int misrouted_irq(int irq) | |||
| 104 | return ok; | 104 | return ok; | 
| 105 | } | 105 | } | 
| 106 | 106 | ||
| 107 | static void poll_all_shared_irqs(void) | 107 | static void poll_spurious_irqs(unsigned long dummy) | 
| 108 | { | 108 | { | 
| 109 | struct irq_desc *desc; | 109 | struct irq_desc *desc; | 
| 110 | int i; | 110 | int i; | 
| @@ -125,23 +125,11 @@ static void poll_all_shared_irqs(void) | |||
| 125 | try_one_irq(i, desc); | 125 | try_one_irq(i, desc); | 
| 126 | local_irq_enable(); | 126 | local_irq_enable(); | 
| 127 | } | 127 | } | 
| 128 | } | ||
| 129 | |||
| 130 | static void poll_spurious_irqs(unsigned long dummy) | ||
| 131 | { | ||
| 132 | poll_all_shared_irqs(); | ||
| 133 | 128 | ||
| 134 | mod_timer(&poll_spurious_irq_timer, | 129 | mod_timer(&poll_spurious_irq_timer, | 
| 135 | jiffies + POLL_SPURIOUS_IRQ_INTERVAL); | 130 | jiffies + POLL_SPURIOUS_IRQ_INTERVAL); | 
| 136 | } | 131 | } | 
| 137 | 132 | ||
| 138 | #ifdef CONFIG_DEBUG_SHIRQ | ||
| 139 | void debug_poll_all_shared_irqs(void) | ||
| 140 | { | ||
| 141 | poll_all_shared_irqs(); | ||
| 142 | } | ||
| 143 | #endif | ||
| 144 | |||
| 145 | /* | 133 | /* | 
| 146 | * If 99,900 of the previous 100,000 interrupts have not been handled | 134 | * If 99,900 of the previous 100,000 interrupts have not been handled | 
| 147 | * then assume that the IRQ is stuck in some manner. Drop a diagnostic | 135 | * then assume that the IRQ is stuck in some manner. Drop a diagnostic | 
| diff --git a/kernel/kmod.c b/kernel/kmod.c index 9fcb53a11f87..25b103190364 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
| @@ -80,16 +80,16 @@ int __request_module(bool wait, const char *fmt, ...) | |||
| 80 | #define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */ | 80 | #define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */ | 
| 81 | static int kmod_loop_msg; | 81 | static int kmod_loop_msg; | 
| 82 | 82 | ||
| 83 | ret = security_kernel_module_request(); | ||
| 84 | if (ret) | ||
| 85 | return ret; | ||
| 86 | |||
| 87 | va_start(args, fmt); | 83 | va_start(args, fmt); | 
| 88 | ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args); | 84 | ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args); | 
| 89 | va_end(args); | 85 | va_end(args); | 
| 90 | if (ret >= MODULE_NAME_LEN) | 86 | if (ret >= MODULE_NAME_LEN) | 
| 91 | return -ENAMETOOLONG; | 87 | return -ENAMETOOLONG; | 
| 92 | 88 | ||
| 89 | ret = security_kernel_module_request(module_name); | ||
| 90 | if (ret) | ||
| 91 | return ret; | ||
| 92 | |||
| 93 | /* If modprobe needs a service that is in a module, we get a recursive | 93 | /* If modprobe needs a service that is in a module, we get a recursive | 
| 94 | * loop. Limit the number of running kmod threads to max_threads/2 or | 94 | * loop. Limit the number of running kmod threads to max_threads/2 or | 
| 95 | * MAX_KMOD_CONCURRENT, whichever is the smaller. A cleaner method | 95 | * MAX_KMOD_CONCURRENT, whichever is the smaller. A cleaner method | 
| diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 5240d75f4c60..1494e85b35f2 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -1014,9 +1014,9 @@ int __kprobes register_kretprobe(struct kretprobe *rp) | |||
| 1014 | /* Pre-allocate memory for max kretprobe instances */ | 1014 | /* Pre-allocate memory for max kretprobe instances */ | 
| 1015 | if (rp->maxactive <= 0) { | 1015 | if (rp->maxactive <= 0) { | 
| 1016 | #ifdef CONFIG_PREEMPT | 1016 | #ifdef CONFIG_PREEMPT | 
| 1017 | rp->maxactive = max(10, 2 * NR_CPUS); | 1017 | rp->maxactive = max(10, 2 * num_possible_cpus()); | 
| 1018 | #else | 1018 | #else | 
| 1019 | rp->maxactive = NR_CPUS; | 1019 | rp->maxactive = num_possible_cpus(); | 
| 1020 | #endif | 1020 | #endif | 
| 1021 | } | 1021 | } | 
| 1022 | spin_lock_init(&rp->lock); | 1022 | spin_lock_init(&rp->lock); | 
| diff --git a/kernel/module.c b/kernel/module.c index 8b7d8805819d..5842a71cf052 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -1187,7 +1187,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect, | |||
| 1187 | 1187 | ||
| 1188 | /* Count loaded sections and allocate structures */ | 1188 | /* Count loaded sections and allocate structures */ | 
| 1189 | for (i = 0; i < nsect; i++) | 1189 | for (i = 0; i < nsect; i++) | 
| 1190 | if (sechdrs[i].sh_flags & SHF_ALLOC) | 1190 | if (sechdrs[i].sh_flags & SHF_ALLOC | 
| 1191 | && sechdrs[i].sh_size) | ||
| 1191 | nloaded++; | 1192 | nloaded++; | 
| 1192 | size[0] = ALIGN(sizeof(*sect_attrs) | 1193 | size[0] = ALIGN(sizeof(*sect_attrs) | 
| 1193 | + nloaded * sizeof(sect_attrs->attrs[0]), | 1194 | + nloaded * sizeof(sect_attrs->attrs[0]), | 
| @@ -1207,6 +1208,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect, | |||
| 1207 | for (i = 0; i < nsect; i++) { | 1208 | for (i = 0; i < nsect; i++) { | 
| 1208 | if (! (sechdrs[i].sh_flags & SHF_ALLOC)) | 1209 | if (! (sechdrs[i].sh_flags & SHF_ALLOC)) | 
| 1209 | continue; | 1210 | continue; | 
| 1211 | if (!sechdrs[i].sh_size) | ||
| 1212 | continue; | ||
| 1210 | sattr->address = sechdrs[i].sh_addr; | 1213 | sattr->address = sechdrs[i].sh_addr; | 
| 1211 | sattr->name = kstrdup(secstrings + sechdrs[i].sh_name, | 1214 | sattr->name = kstrdup(secstrings + sechdrs[i].sh_name, | 
| 1212 | GFP_KERNEL); | 1215 | GFP_KERNEL); | 
| diff --git a/kernel/mutex.c b/kernel/mutex.c index 947b3ad551f8..632f04c57d82 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c | |||
| @@ -148,8 +148,8 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | |||
| 148 | 148 | ||
| 149 | preempt_disable(); | 149 | preempt_disable(); | 
| 150 | mutex_acquire(&lock->dep_map, subclass, 0, ip); | 150 | mutex_acquire(&lock->dep_map, subclass, 0, ip); | 
| 151 | #if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES) && \ | 151 | |
| 152 | !defined(CONFIG_HAVE_DEFAULT_NO_SPIN_MUTEXES) | 152 | #ifdef CONFIG_MUTEX_SPIN_ON_OWNER | 
| 153 | /* | 153 | /* | 
| 154 | * Optimistic spinning. | 154 | * Optimistic spinning. | 
| 155 | * | 155 | * | 
| diff --git a/kernel/printk.c b/kernel/printk.c index f38b07f78a4e..b5ac4d99c667 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/bootmem.h> | 33 | #include <linux/bootmem.h> | 
| 34 | #include <linux/syscalls.h> | 34 | #include <linux/syscalls.h> | 
| 35 | #include <linux/kexec.h> | 35 | #include <linux/kexec.h> | 
| 36 | #include <linux/ratelimit.h> | ||
| 36 | 37 | ||
| 37 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> | 
| 38 | 39 | ||
| @@ -1376,11 +1377,11 @@ late_initcall(disable_boot_consoles); | |||
| 1376 | */ | 1377 | */ | 
| 1377 | DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10); | 1378 | DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10); | 
| 1378 | 1379 | ||
| 1379 | int printk_ratelimit(void) | 1380 | int __printk_ratelimit(const char *func) | 
| 1380 | { | 1381 | { | 
| 1381 | return __ratelimit(&printk_ratelimit_state); | 1382 | return ___ratelimit(&printk_ratelimit_state, func); | 
| 1382 | } | 1383 | } | 
| 1383 | EXPORT_SYMBOL(printk_ratelimit); | 1384 | EXPORT_SYMBOL(__printk_ratelimit); | 
| 1384 | 1385 | ||
| 1385 | /** | 1386 | /** | 
| 1386 | * printk_timed_ratelimit - caller-controlled printk ratelimiting | 1387 | * printk_timed_ratelimit - caller-controlled printk ratelimiting | 
| diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index 400183346ad2..9b7fd4723878 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
| @@ -44,7 +44,6 @@ | |||
| 44 | #include <linux/cpu.h> | 44 | #include <linux/cpu.h> | 
| 45 | #include <linux/mutex.h> | 45 | #include <linux/mutex.h> | 
| 46 | #include <linux/module.h> | 46 | #include <linux/module.h> | 
| 47 | #include <linux/kernel_stat.h> | ||
| 48 | 47 | ||
| 49 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 48 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 
| 50 | static struct lock_class_key rcu_lock_key; | 49 | static struct lock_class_key rcu_lock_key; | 
| @@ -53,8 +52,6 @@ struct lockdep_map rcu_lock_map = | |||
| 53 | EXPORT_SYMBOL_GPL(rcu_lock_map); | 52 | EXPORT_SYMBOL_GPL(rcu_lock_map); | 
| 54 | #endif | 53 | #endif | 
| 55 | 54 | ||
| 56 | int rcu_scheduler_active __read_mostly; | ||
| 57 | |||
| 58 | /* | 55 | /* | 
| 59 | * Awaken the corresponding synchronize_rcu() instance now that a | 56 | * Awaken the corresponding synchronize_rcu() instance now that a | 
| 60 | * grace period has elapsed. | 57 | * grace period has elapsed. | 
| @@ -66,122 +63,3 @@ void wakeme_after_rcu(struct rcu_head *head) | |||
| 66 | rcu = container_of(head, struct rcu_synchronize, head); | 63 | rcu = container_of(head, struct rcu_synchronize, head); | 
| 67 | complete(&rcu->completion); | 64 | complete(&rcu->completion); | 
| 68 | } | 65 | } | 
| 69 | |||
| 70 | #ifdef CONFIG_TREE_PREEMPT_RCU | ||
| 71 | |||
| 72 | /** | ||
| 73 | * synchronize_rcu - wait until a grace period has elapsed. | ||
| 74 | * | ||
| 75 | * Control will return to the caller some time after a full grace | ||
| 76 | * period has elapsed, in other words after all currently executing RCU | ||
| 77 | * read-side critical sections have completed. RCU read-side critical | ||
| 78 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), | ||
| 79 | * and may be nested. | ||
| 80 | */ | ||
| 81 | void synchronize_rcu(void) | ||
| 82 | { | ||
| 83 | struct rcu_synchronize rcu; | ||
| 84 | |||
| 85 | if (!rcu_scheduler_active) | ||
| 86 | return; | ||
| 87 | |||
| 88 | init_completion(&rcu.completion); | ||
| 89 | /* Will wake me after RCU finished. */ | ||
| 90 | call_rcu(&rcu.head, wakeme_after_rcu); | ||
| 91 | /* Wait for it. */ | ||
| 92 | wait_for_completion(&rcu.completion); | ||
| 93 | } | ||
| 94 | EXPORT_SYMBOL_GPL(synchronize_rcu); | ||
| 95 | |||
| 96 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | ||
| 97 | |||
| 98 | /** | ||
| 99 | * synchronize_sched - wait until an rcu-sched grace period has elapsed. | ||
| 100 | * | ||
| 101 | * Control will return to the caller some time after a full rcu-sched | ||
| 102 | * grace period has elapsed, in other words after all currently executing | ||
| 103 | * rcu-sched read-side critical sections have completed. These read-side | ||
| 104 | * critical sections are delimited by rcu_read_lock_sched() and | ||
| 105 | * rcu_read_unlock_sched(), and may be nested. Note that preempt_disable(), | ||
| 106 | * local_irq_disable(), and so on may be used in place of | ||
| 107 | * rcu_read_lock_sched(). | ||
| 108 | * | ||
| 109 | * This means that all preempt_disable code sequences, including NMI and | ||
| 110 | * hardware-interrupt handlers, in progress on entry will have completed | ||
| 111 | * before this primitive returns. However, this does not guarantee that | ||
| 112 | * softirq handlers will have completed, since in some kernels, these | ||
| 113 | * handlers can run in process context, and can block. | ||
| 114 | * | ||
| 115 | * This primitive provides the guarantees made by the (now removed) | ||
| 116 | * synchronize_kernel() API. In contrast, synchronize_rcu() only | ||
| 117 | * guarantees that rcu_read_lock() sections will have completed. | ||
| 118 | * In "classic RCU", these two guarantees happen to be one and | ||
| 119 | * the same, but can differ in realtime RCU implementations. | ||
| 120 | */ | ||
| 121 | void synchronize_sched(void) | ||
| 122 | { | ||
| 123 | struct rcu_synchronize rcu; | ||
| 124 | |||
| 125 | if (rcu_blocking_is_gp()) | ||
| 126 | return; | ||
| 127 | |||
| 128 | init_completion(&rcu.completion); | ||
| 129 | /* Will wake me after RCU finished. */ | ||
| 130 | call_rcu_sched(&rcu.head, wakeme_after_rcu); | ||
| 131 | /* Wait for it. */ | ||
| 132 | wait_for_completion(&rcu.completion); | ||
| 133 | } | ||
| 134 | EXPORT_SYMBOL_GPL(synchronize_sched); | ||
| 135 | |||
| 136 | /** | ||
| 137 | * synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed. | ||
| 138 | * | ||
| 139 | * Control will return to the caller some time after a full rcu_bh grace | ||
| 140 | * period has elapsed, in other words after all currently executing rcu_bh | ||
| 141 | * read-side critical sections have completed. RCU read-side critical | ||
| 142 | * sections are delimited by rcu_read_lock_bh() and rcu_read_unlock_bh(), | ||
| 143 | * and may be nested. | ||
| 144 | */ | ||
| 145 | void synchronize_rcu_bh(void) | ||
| 146 | { | ||
| 147 | struct rcu_synchronize rcu; | ||
| 148 | |||
| 149 | if (rcu_blocking_is_gp()) | ||
| 150 | return; | ||
| 151 | |||
| 152 | init_completion(&rcu.completion); | ||
| 153 | /* Will wake me after RCU finished. */ | ||
| 154 | call_rcu_bh(&rcu.head, wakeme_after_rcu); | ||
| 155 | /* Wait for it. */ | ||
| 156 | wait_for_completion(&rcu.completion); | ||
| 157 | } | ||
| 158 | EXPORT_SYMBOL_GPL(synchronize_rcu_bh); | ||
| 159 | |||
| 160 | static int __cpuinit rcu_barrier_cpu_hotplug(struct notifier_block *self, | ||
| 161 | unsigned long action, void *hcpu) | ||
| 162 | { | ||
| 163 | return rcu_cpu_notify(self, action, hcpu); | ||
| 164 | } | ||
| 165 | |||
| 166 | void __init rcu_init(void) | ||
| 167 | { | ||
| 168 | int i; | ||
| 169 | |||
| 170 | __rcu_init(); | ||
| 171 | cpu_notifier(rcu_barrier_cpu_hotplug, 0); | ||
| 172 | |||
| 173 | /* | ||
| 174 | * We don't need protection against CPU-hotplug here because | ||
| 175 | * this is called early in boot, before either interrupts | ||
| 176 | * or the scheduler are operational. | ||
| 177 | */ | ||
| 178 | for_each_online_cpu(i) | ||
| 179 | rcu_barrier_cpu_hotplug(NULL, CPU_UP_PREPARE, (void *)(long)i); | ||
| 180 | } | ||
| 181 | |||
| 182 | void rcu_scheduler_starting(void) | ||
| 183 | { | ||
| 184 | WARN_ON(num_online_cpus() != 1); | ||
| 185 | WARN_ON(nr_context_switches() > 0); | ||
| 186 | rcu_scheduler_active = 1; | ||
| 187 | } | ||
| diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c new file mode 100644 index 000000000000..9f6d9ff2572c --- /dev/null +++ b/kernel/rcutiny.c | |||
| @@ -0,0 +1,282 @@ | |||
| 1 | /* | ||
| 2 | * Read-Copy Update mechanism for mutual exclusion, the Bloatwatch edition. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 17 | * | ||
| 18 | * Copyright IBM Corporation, 2008 | ||
| 19 | * | ||
| 20 | * Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> | ||
| 21 | * | ||
| 22 | * For detailed explanation of Read-Copy Update mechanism see - | ||
| 23 | * Documentation/RCU | ||
| 24 | */ | ||
| 25 | #include <linux/moduleparam.h> | ||
| 26 | #include <linux/completion.h> | ||
| 27 | #include <linux/interrupt.h> | ||
| 28 | #include <linux/notifier.h> | ||
| 29 | #include <linux/rcupdate.h> | ||
| 30 | #include <linux/kernel.h> | ||
| 31 | #include <linux/module.h> | ||
| 32 | #include <linux/mutex.h> | ||
| 33 | #include <linux/sched.h> | ||
| 34 | #include <linux/types.h> | ||
| 35 | #include <linux/init.h> | ||
| 36 | #include <linux/time.h> | ||
| 37 | #include <linux/cpu.h> | ||
| 38 | |||
| 39 | /* Global control variables for rcupdate callback mechanism. */ | ||
| 40 | struct rcu_ctrlblk { | ||
| 41 | struct rcu_head *rcucblist; /* List of pending callbacks (CBs). */ | ||
| 42 | struct rcu_head **donetail; /* ->next pointer of last "done" CB. */ | ||
| 43 | struct rcu_head **curtail; /* ->next pointer of last CB. */ | ||
| 44 | }; | ||
| 45 | |||
| 46 | /* Definition for rcupdate control block. */ | ||
| 47 | static struct rcu_ctrlblk rcu_ctrlblk = { | ||
| 48 | .donetail = &rcu_ctrlblk.rcucblist, | ||
| 49 | .curtail = &rcu_ctrlblk.rcucblist, | ||
| 50 | }; | ||
| 51 | |||
| 52 | static struct rcu_ctrlblk rcu_bh_ctrlblk = { | ||
| 53 | .donetail = &rcu_bh_ctrlblk.rcucblist, | ||
| 54 | .curtail = &rcu_bh_ctrlblk.rcucblist, | ||
| 55 | }; | ||
| 56 | |||
| 57 | #ifdef CONFIG_NO_HZ | ||
| 58 | |||
| 59 | static long rcu_dynticks_nesting = 1; | ||
| 60 | |||
| 61 | /* | ||
| 62 | * Enter dynticks-idle mode, which is an extended quiescent state | ||
| 63 | * if we have fully entered that mode (i.e., if the new value of | ||
| 64 | * dynticks_nesting is zero). | ||
| 65 | */ | ||
| 66 | void rcu_enter_nohz(void) | ||
| 67 | { | ||
| 68 | if (--rcu_dynticks_nesting == 0) | ||
| 69 | rcu_sched_qs(0); /* implies rcu_bh_qsctr_inc(0) */ | ||
| 70 | } | ||
| 71 | |||
| 72 | /* | ||
| 73 | * Exit dynticks-idle mode, so that we are no longer in an extended | ||
| 74 | * quiescent state. | ||
| 75 | */ | ||
| 76 | void rcu_exit_nohz(void) | ||
| 77 | { | ||
| 78 | rcu_dynticks_nesting++; | ||
| 79 | } | ||
| 80 | |||
| 81 | #endif /* #ifdef CONFIG_NO_HZ */ | ||
| 82 | |||
| 83 | /* | ||
| 84 | * Helper function for rcu_qsctr_inc() and rcu_bh_qsctr_inc(). | ||
| 85 | * Also disable irqs to avoid confusion due to interrupt handlers | ||
| 86 | * invoking call_rcu(). | ||
| 87 | */ | ||
| 88 | static int rcu_qsctr_help(struct rcu_ctrlblk *rcp) | ||
| 89 | { | ||
| 90 | unsigned long flags; | ||
| 91 | |||
| 92 | local_irq_save(flags); | ||
| 93 | if (rcp->rcucblist != NULL && | ||
| 94 | rcp->donetail != rcp->curtail) { | ||
| 95 | rcp->donetail = rcp->curtail; | ||
| 96 | local_irq_restore(flags); | ||
| 97 | return 1; | ||
| 98 | } | ||
| 99 | local_irq_restore(flags); | ||
| 100 | |||
| 101 | return 0; | ||
| 102 | } | ||
| 103 | |||
| 104 | /* | ||
| 105 | * Record an rcu quiescent state. And an rcu_bh quiescent state while we | ||
| 106 | * are at it, given that any rcu quiescent state is also an rcu_bh | ||
| 107 | * quiescent state. Use "+" instead of "||" to defeat short circuiting. | ||
| 108 | */ | ||
| 109 | void rcu_sched_qs(int cpu) | ||
| 110 | { | ||
| 111 | if (rcu_qsctr_help(&rcu_ctrlblk) + rcu_qsctr_help(&rcu_bh_ctrlblk)) | ||
| 112 | raise_softirq(RCU_SOFTIRQ); | ||
| 113 | } | ||
| 114 | |||
| 115 | /* | ||
| 116 | * Record an rcu_bh quiescent state. | ||
| 117 | */ | ||
| 118 | void rcu_bh_qs(int cpu) | ||
| 119 | { | ||
| 120 | if (rcu_qsctr_help(&rcu_bh_ctrlblk)) | ||
| 121 | raise_softirq(RCU_SOFTIRQ); | ||
| 122 | } | ||
| 123 | |||
| 124 | /* | ||
| 125 | * Check to see if the scheduling-clock interrupt came from an extended | ||
| 126 | * quiescent state, and, if so, tell RCU about it. | ||
| 127 | */ | ||
| 128 | void rcu_check_callbacks(int cpu, int user) | ||
| 129 | { | ||
| 130 | if (user || | ||
| 131 | (idle_cpu(cpu) && | ||
| 132 | !in_softirq() && | ||
| 133 | hardirq_count() <= (1 << HARDIRQ_SHIFT))) | ||
| 134 | rcu_sched_qs(cpu); | ||
| 135 | else if (!in_softirq()) | ||
| 136 | rcu_bh_qs(cpu); | ||
| 137 | } | ||
| 138 | |||
| 139 | /* | ||
| 140 | * Helper function for rcu_process_callbacks() that operates on the | ||
| 141 | * specified rcu_ctrlkblk structure. | ||
| 142 | */ | ||
| 143 | static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp) | ||
| 144 | { | ||
| 145 | struct rcu_head *next, *list; | ||
| 146 | unsigned long flags; | ||
| 147 | |||
| 148 | /* If no RCU callbacks ready to invoke, just return. */ | ||
| 149 | if (&rcp->rcucblist == rcp->donetail) | ||
| 150 | return; | ||
| 151 | |||
| 152 | /* Move the ready-to-invoke callbacks to a local list. */ | ||
| 153 | local_irq_save(flags); | ||
| 154 | list = rcp->rcucblist; | ||
| 155 | rcp->rcucblist = *rcp->donetail; | ||
| 156 | *rcp->donetail = NULL; | ||
| 157 | if (rcp->curtail == rcp->donetail) | ||
| 158 | rcp->curtail = &rcp->rcucblist; | ||
| 159 | rcp->donetail = &rcp->rcucblist; | ||
| 160 | local_irq_restore(flags); | ||
| 161 | |||
| 162 | /* Invoke the callbacks on the local list. */ | ||
| 163 | while (list) { | ||
| 164 | next = list->next; | ||
| 165 | prefetch(next); | ||
| 166 | list->func(list); | ||
| 167 | list = next; | ||
| 168 | } | ||
| 169 | } | ||
| 170 | |||
| 171 | /* | ||
| 172 | * Invoke any callbacks whose grace period has completed. | ||
| 173 | */ | ||
| 174 | static void rcu_process_callbacks(struct softirq_action *unused) | ||
| 175 | { | ||
| 176 | __rcu_process_callbacks(&rcu_ctrlblk); | ||
| 177 | __rcu_process_callbacks(&rcu_bh_ctrlblk); | ||
| 178 | } | ||
| 179 | |||
| 180 | /* | ||
| 181 | * Wait for a grace period to elapse. But it is illegal to invoke | ||
| 182 | * synchronize_sched() from within an RCU read-side critical section. | ||
| 183 | * Therefore, any legal call to synchronize_sched() is a quiescent | ||
| 184 | * state, and so on a UP system, synchronize_sched() need do nothing. | ||
| 185 | * Ditto for synchronize_rcu_bh(). (But Lai Jiangshan points out the | ||
| 186 | * benefits of doing might_sleep() to reduce latency.) | ||
| 187 | * | ||
| 188 | * Cool, huh? (Due to Josh Triplett.) | ||
| 189 | * | ||
| 190 | * But we want to make this a static inline later. | ||
| 191 | */ | ||
| 192 | void synchronize_sched(void) | ||
| 193 | { | ||
| 194 | cond_resched(); | ||
| 195 | } | ||
| 196 | EXPORT_SYMBOL_GPL(synchronize_sched); | ||
| 197 | |||
| 198 | void synchronize_rcu_bh(void) | ||
| 199 | { | ||
| 200 | synchronize_sched(); | ||
| 201 | } | ||
| 202 | EXPORT_SYMBOL_GPL(synchronize_rcu_bh); | ||
| 203 | |||
| 204 | /* | ||
| 205 | * Helper function for call_rcu() and call_rcu_bh(). | ||
| 206 | */ | ||
| 207 | static void __call_rcu(struct rcu_head *head, | ||
| 208 | void (*func)(struct rcu_head *rcu), | ||
| 209 | struct rcu_ctrlblk *rcp) | ||
| 210 | { | ||
| 211 | unsigned long flags; | ||
| 212 | |||
| 213 | head->func = func; | ||
| 214 | head->next = NULL; | ||
| 215 | |||
| 216 | local_irq_save(flags); | ||
| 217 | *rcp->curtail = head; | ||
| 218 | rcp->curtail = &head->next; | ||
| 219 | local_irq_restore(flags); | ||
| 220 | } | ||
| 221 | |||
| 222 | /* | ||
| 223 | * Post an RCU callback to be invoked after the end of an RCU grace | ||
| 224 | * period. But since we have but one CPU, that would be after any | ||
| 225 | * quiescent state. | ||
| 226 | */ | ||
| 227 | void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | ||
| 228 | { | ||
| 229 | __call_rcu(head, func, &rcu_ctrlblk); | ||
| 230 | } | ||
| 231 | EXPORT_SYMBOL_GPL(call_rcu); | ||
| 232 | |||
| 233 | /* | ||
| 234 | * Post an RCU bottom-half callback to be invoked after any subsequent | ||
| 235 | * quiescent state. | ||
| 236 | */ | ||
| 237 | void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | ||
| 238 | { | ||
| 239 | __call_rcu(head, func, &rcu_bh_ctrlblk); | ||
| 240 | } | ||
| 241 | EXPORT_SYMBOL_GPL(call_rcu_bh); | ||
| 242 | |||
| 243 | void rcu_barrier(void) | ||
| 244 | { | ||
| 245 | struct rcu_synchronize rcu; | ||
| 246 | |||
| 247 | init_completion(&rcu.completion); | ||
| 248 | /* Will wake me after RCU finished. */ | ||
| 249 | call_rcu(&rcu.head, wakeme_after_rcu); | ||
| 250 | /* Wait for it. */ | ||
| 251 | wait_for_completion(&rcu.completion); | ||
| 252 | } | ||
| 253 | EXPORT_SYMBOL_GPL(rcu_barrier); | ||
| 254 | |||
| 255 | void rcu_barrier_bh(void) | ||
| 256 | { | ||
| 257 | struct rcu_synchronize rcu; | ||
| 258 | |||
| 259 | init_completion(&rcu.completion); | ||
| 260 | /* Will wake me after RCU finished. */ | ||
| 261 | call_rcu_bh(&rcu.head, wakeme_after_rcu); | ||
| 262 | /* Wait for it. */ | ||
| 263 | wait_for_completion(&rcu.completion); | ||
| 264 | } | ||
| 265 | EXPORT_SYMBOL_GPL(rcu_barrier_bh); | ||
| 266 | |||
| 267 | void rcu_barrier_sched(void) | ||
| 268 | { | ||
| 269 | struct rcu_synchronize rcu; | ||
| 270 | |||
| 271 | init_completion(&rcu.completion); | ||
| 272 | /* Will wake me after RCU finished. */ | ||
| 273 | call_rcu_sched(&rcu.head, wakeme_after_rcu); | ||
| 274 | /* Wait for it. */ | ||
| 275 | wait_for_completion(&rcu.completion); | ||
| 276 | } | ||
| 277 | EXPORT_SYMBOL_GPL(rcu_barrier_sched); | ||
| 278 | |||
| 279 | void __init rcu_init(void) | ||
| 280 | { | ||
| 281 | open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); | ||
| 282 | } | ||
| diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 697c0a0229d4..a621a67ef4e3 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c | |||
| @@ -327,6 +327,11 @@ rcu_torture_cb(struct rcu_head *p) | |||
| 327 | cur_ops->deferred_free(rp); | 327 | cur_ops->deferred_free(rp); | 
| 328 | } | 328 | } | 
| 329 | 329 | ||
| 330 | static int rcu_no_completed(void) | ||
| 331 | { | ||
| 332 | return 0; | ||
| 333 | } | ||
| 334 | |||
| 330 | static void rcu_torture_deferred_free(struct rcu_torture *p) | 335 | static void rcu_torture_deferred_free(struct rcu_torture *p) | 
| 331 | { | 336 | { | 
| 332 | call_rcu(&p->rtort_rcu, rcu_torture_cb); | 337 | call_rcu(&p->rtort_rcu, rcu_torture_cb); | 
| @@ -388,6 +393,21 @@ static struct rcu_torture_ops rcu_sync_ops = { | |||
| 388 | .name = "rcu_sync" | 393 | .name = "rcu_sync" | 
| 389 | }; | 394 | }; | 
| 390 | 395 | ||
| 396 | static struct rcu_torture_ops rcu_expedited_ops = { | ||
| 397 | .init = rcu_sync_torture_init, | ||
| 398 | .cleanup = NULL, | ||
| 399 | .readlock = rcu_torture_read_lock, | ||
| 400 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | ||
| 401 | .readunlock = rcu_torture_read_unlock, | ||
| 402 | .completed = rcu_no_completed, | ||
| 403 | .deferred_free = rcu_sync_torture_deferred_free, | ||
| 404 | .sync = synchronize_rcu_expedited, | ||
| 405 | .cb_barrier = NULL, | ||
| 406 | .stats = NULL, | ||
| 407 | .irq_capable = 1, | ||
| 408 | .name = "rcu_expedited" | ||
| 409 | }; | ||
| 410 | |||
| 391 | /* | 411 | /* | 
| 392 | * Definitions for rcu_bh torture testing. | 412 | * Definitions for rcu_bh torture testing. | 
| 393 | */ | 413 | */ | 
| @@ -547,6 +567,25 @@ static struct rcu_torture_ops srcu_ops = { | |||
| 547 | .name = "srcu" | 567 | .name = "srcu" | 
| 548 | }; | 568 | }; | 
| 549 | 569 | ||
| 570 | static void srcu_torture_synchronize_expedited(void) | ||
| 571 | { | ||
| 572 | synchronize_srcu_expedited(&srcu_ctl); | ||
| 573 | } | ||
| 574 | |||
| 575 | static struct rcu_torture_ops srcu_expedited_ops = { | ||
| 576 | .init = srcu_torture_init, | ||
| 577 | .cleanup = srcu_torture_cleanup, | ||
| 578 | .readlock = srcu_torture_read_lock, | ||
| 579 | .read_delay = srcu_read_delay, | ||
| 580 | .readunlock = srcu_torture_read_unlock, | ||
| 581 | .completed = srcu_torture_completed, | ||
| 582 | .deferred_free = rcu_sync_torture_deferred_free, | ||
| 583 | .sync = srcu_torture_synchronize_expedited, | ||
| 584 | .cb_barrier = NULL, | ||
| 585 | .stats = srcu_torture_stats, | ||
| 586 | .name = "srcu_expedited" | ||
| 587 | }; | ||
| 588 | |||
| 550 | /* | 589 | /* | 
| 551 | * Definitions for sched torture testing. | 590 | * Definitions for sched torture testing. | 
| 552 | */ | 591 | */ | 
| @@ -562,11 +601,6 @@ static void sched_torture_read_unlock(int idx) | |||
| 562 | preempt_enable(); | 601 | preempt_enable(); | 
| 563 | } | 602 | } | 
| 564 | 603 | ||
| 565 | static int sched_torture_completed(void) | ||
| 566 | { | ||
| 567 | return 0; | ||
| 568 | } | ||
| 569 | |||
| 570 | static void rcu_sched_torture_deferred_free(struct rcu_torture *p) | 604 | static void rcu_sched_torture_deferred_free(struct rcu_torture *p) | 
| 571 | { | 605 | { | 
| 572 | call_rcu_sched(&p->rtort_rcu, rcu_torture_cb); | 606 | call_rcu_sched(&p->rtort_rcu, rcu_torture_cb); | 
| @@ -583,7 +617,7 @@ static struct rcu_torture_ops sched_ops = { | |||
| 583 | .readlock = sched_torture_read_lock, | 617 | .readlock = sched_torture_read_lock, | 
| 584 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 618 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 
| 585 | .readunlock = sched_torture_read_unlock, | 619 | .readunlock = sched_torture_read_unlock, | 
| 586 | .completed = sched_torture_completed, | 620 | .completed = rcu_no_completed, | 
| 587 | .deferred_free = rcu_sched_torture_deferred_free, | 621 | .deferred_free = rcu_sched_torture_deferred_free, | 
| 588 | .sync = sched_torture_synchronize, | 622 | .sync = sched_torture_synchronize, | 
| 589 | .cb_barrier = rcu_barrier_sched, | 623 | .cb_barrier = rcu_barrier_sched, | 
| @@ -592,13 +626,13 @@ static struct rcu_torture_ops sched_ops = { | |||
| 592 | .name = "sched" | 626 | .name = "sched" | 
| 593 | }; | 627 | }; | 
| 594 | 628 | ||
| 595 | static struct rcu_torture_ops sched_ops_sync = { | 629 | static struct rcu_torture_ops sched_sync_ops = { | 
| 596 | .init = rcu_sync_torture_init, | 630 | .init = rcu_sync_torture_init, | 
| 597 | .cleanup = NULL, | 631 | .cleanup = NULL, | 
| 598 | .readlock = sched_torture_read_lock, | 632 | .readlock = sched_torture_read_lock, | 
| 599 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 633 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 
| 600 | .readunlock = sched_torture_read_unlock, | 634 | .readunlock = sched_torture_read_unlock, | 
| 601 | .completed = sched_torture_completed, | 635 | .completed = rcu_no_completed, | 
| 602 | .deferred_free = rcu_sync_torture_deferred_free, | 636 | .deferred_free = rcu_sync_torture_deferred_free, | 
| 603 | .sync = sched_torture_synchronize, | 637 | .sync = sched_torture_synchronize, | 
| 604 | .cb_barrier = NULL, | 638 | .cb_barrier = NULL, | 
| @@ -612,7 +646,7 @@ static struct rcu_torture_ops sched_expedited_ops = { | |||
| 612 | .readlock = sched_torture_read_lock, | 646 | .readlock = sched_torture_read_lock, | 
| 613 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 647 | .read_delay = rcu_read_delay, /* just reuse rcu's version. */ | 
| 614 | .readunlock = sched_torture_read_unlock, | 648 | .readunlock = sched_torture_read_unlock, | 
| 615 | .completed = sched_torture_completed, | 649 | .completed = rcu_no_completed, | 
| 616 | .deferred_free = rcu_sync_torture_deferred_free, | 650 | .deferred_free = rcu_sync_torture_deferred_free, | 
| 617 | .sync = synchronize_sched_expedited, | 651 | .sync = synchronize_sched_expedited, | 
| 618 | .cb_barrier = NULL, | 652 | .cb_barrier = NULL, | 
| @@ -1097,9 +1131,10 @@ rcu_torture_init(void) | |||
| 1097 | int cpu; | 1131 | int cpu; | 
| 1098 | int firsterr = 0; | 1132 | int firsterr = 0; | 
| 1099 | static struct rcu_torture_ops *torture_ops[] = | 1133 | static struct rcu_torture_ops *torture_ops[] = | 
| 1100 | { &rcu_ops, &rcu_sync_ops, &rcu_bh_ops, &rcu_bh_sync_ops, | 1134 | { &rcu_ops, &rcu_sync_ops, &rcu_expedited_ops, | 
| 1101 | &sched_expedited_ops, | 1135 | &rcu_bh_ops, &rcu_bh_sync_ops, | 
| 1102 | &srcu_ops, &sched_ops, &sched_ops_sync, }; | 1136 | &srcu_ops, &srcu_expedited_ops, | 
| 1137 | &sched_ops, &sched_sync_ops, &sched_expedited_ops, }; | ||
| 1103 | 1138 | ||
| 1104 | mutex_lock(&fullstop_mutex); | 1139 | mutex_lock(&fullstop_mutex); | 
| 1105 | 1140 | ||
| @@ -1110,8 +1145,12 @@ rcu_torture_init(void) | |||
| 1110 | break; | 1145 | break; | 
| 1111 | } | 1146 | } | 
| 1112 | if (i == ARRAY_SIZE(torture_ops)) { | 1147 | if (i == ARRAY_SIZE(torture_ops)) { | 
| 1113 | printk(KERN_ALERT "rcutorture: invalid torture type: \"%s\"\n", | 1148 | printk(KERN_ALERT "rcu-torture: invalid torture type: \"%s\"\n", | 
| 1114 | torture_type); | 1149 | torture_type); | 
| 1150 | printk(KERN_ALERT "rcu-torture types:"); | ||
| 1151 | for (i = 0; i < ARRAY_SIZE(torture_ops); i++) | ||
| 1152 | printk(KERN_ALERT " %s", torture_ops[i]->name); | ||
| 1153 | printk(KERN_ALERT "\n"); | ||
| 1115 | mutex_unlock(&fullstop_mutex); | 1154 | mutex_unlock(&fullstop_mutex); | 
| 1116 | return -EINVAL; | 1155 | return -EINVAL; | 
| 1117 | } | 1156 | } | 
| diff --git a/kernel/rcutree.c b/kernel/rcutree.c index f3077c0ab181..53ae9598f798 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
| @@ -46,18 +46,22 @@ | |||
| 46 | #include <linux/cpu.h> | 46 | #include <linux/cpu.h> | 
| 47 | #include <linux/mutex.h> | 47 | #include <linux/mutex.h> | 
| 48 | #include <linux/time.h> | 48 | #include <linux/time.h> | 
| 49 | #include <linux/kernel_stat.h> | ||
| 49 | 50 | ||
| 50 | #include "rcutree.h" | 51 | #include "rcutree.h" | 
| 51 | 52 | ||
| 52 | /* Data structures. */ | 53 | /* Data structures. */ | 
| 53 | 54 | ||
| 55 | static struct lock_class_key rcu_node_class[NUM_RCU_LVLS]; | ||
| 56 | |||
| 54 | #define RCU_STATE_INITIALIZER(name) { \ | 57 | #define RCU_STATE_INITIALIZER(name) { \ | 
| 55 | .level = { &name.node[0] }, \ | 58 | .level = { &name.node[0] }, \ | 
| 56 | .levelcnt = { \ | 59 | .levelcnt = { \ | 
| 57 | NUM_RCU_LVL_0, /* root of hierarchy. */ \ | 60 | NUM_RCU_LVL_0, /* root of hierarchy. */ \ | 
| 58 | NUM_RCU_LVL_1, \ | 61 | NUM_RCU_LVL_1, \ | 
| 59 | NUM_RCU_LVL_2, \ | 62 | NUM_RCU_LVL_2, \ | 
| 60 | NUM_RCU_LVL_3, /* == MAX_RCU_LVLS */ \ | 63 | NUM_RCU_LVL_3, \ | 
| 64 | NUM_RCU_LVL_4, /* == MAX_RCU_LVLS */ \ | ||
| 61 | }, \ | 65 | }, \ | 
| 62 | .signaled = RCU_GP_IDLE, \ | 66 | .signaled = RCU_GP_IDLE, \ | 
| 63 | .gpnum = -300, \ | 67 | .gpnum = -300, \ | 
| @@ -77,6 +81,8 @@ DEFINE_PER_CPU(struct rcu_data, rcu_sched_data); | |||
| 77 | struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh_state); | 81 | struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh_state); | 
| 78 | DEFINE_PER_CPU(struct rcu_data, rcu_bh_data); | 82 | DEFINE_PER_CPU(struct rcu_data, rcu_bh_data); | 
| 79 | 83 | ||
| 84 | static int rcu_scheduler_active __read_mostly; | ||
| 85 | |||
| 80 | 86 | ||
| 81 | /* | 87 | /* | 
| 82 | * Return true if an RCU grace period is in progress. The ACCESS_ONCE()s | 88 | * Return true if an RCU grace period is in progress. The ACCESS_ONCE()s | 
| @@ -98,7 +104,7 @@ void rcu_sched_qs(int cpu) | |||
| 98 | struct rcu_data *rdp; | 104 | struct rcu_data *rdp; | 
| 99 | 105 | ||
| 100 | rdp = &per_cpu(rcu_sched_data, cpu); | 106 | rdp = &per_cpu(rcu_sched_data, cpu); | 
| 101 | rdp->passed_quiesc_completed = rdp->completed; | 107 | rdp->passed_quiesc_completed = rdp->gpnum - 1; | 
| 102 | barrier(); | 108 | barrier(); | 
| 103 | rdp->passed_quiesc = 1; | 109 | rdp->passed_quiesc = 1; | 
| 104 | rcu_preempt_note_context_switch(cpu); | 110 | rcu_preempt_note_context_switch(cpu); | 
| @@ -109,7 +115,7 @@ void rcu_bh_qs(int cpu) | |||
| 109 | struct rcu_data *rdp; | 115 | struct rcu_data *rdp; | 
| 110 | 116 | ||
| 111 | rdp = &per_cpu(rcu_bh_data, cpu); | 117 | rdp = &per_cpu(rcu_bh_data, cpu); | 
| 112 | rdp->passed_quiesc_completed = rdp->completed; | 118 | rdp->passed_quiesc_completed = rdp->gpnum - 1; | 
| 113 | barrier(); | 119 | barrier(); | 
| 114 | rdp->passed_quiesc = 1; | 120 | rdp->passed_quiesc = 1; | 
| 115 | } | 121 | } | 
| @@ -335,28 +341,9 @@ void rcu_irq_exit(void) | |||
| 335 | set_need_resched(); | 341 | set_need_resched(); | 
| 336 | } | 342 | } | 
| 337 | 343 | ||
| 338 | /* | ||
| 339 | * Record the specified "completed" value, which is later used to validate | ||
| 340 | * dynticks counter manipulations. Specify "rsp->completed - 1" to | ||
| 341 | * unconditionally invalidate any future dynticks manipulations (which is | ||
| 342 | * useful at the beginning of a grace period). | ||
| 343 | */ | ||
| 344 | static void dyntick_record_completed(struct rcu_state *rsp, long comp) | ||
| 345 | { | ||
| 346 | rsp->dynticks_completed = comp; | ||
| 347 | } | ||
| 348 | |||
| 349 | #ifdef CONFIG_SMP | 344 | #ifdef CONFIG_SMP | 
| 350 | 345 | ||
| 351 | /* | 346 | /* | 
| 352 | * Recall the previously recorded value of the completion for dynticks. | ||
| 353 | */ | ||
| 354 | static long dyntick_recall_completed(struct rcu_state *rsp) | ||
| 355 | { | ||
| 356 | return rsp->dynticks_completed; | ||
| 357 | } | ||
| 358 | |||
| 359 | /* | ||
| 360 | * Snapshot the specified CPU's dynticks counter so that we can later | 347 | * Snapshot the specified CPU's dynticks counter so that we can later | 
| 361 | * credit them with an implicit quiescent state. Return 1 if this CPU | 348 | * credit them with an implicit quiescent state. Return 1 if this CPU | 
| 362 | * is in dynticks idle mode, which is an extended quiescent state. | 349 | * is in dynticks idle mode, which is an extended quiescent state. | 
| @@ -419,24 +406,8 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp) | |||
| 419 | 406 | ||
| 420 | #else /* #ifdef CONFIG_NO_HZ */ | 407 | #else /* #ifdef CONFIG_NO_HZ */ | 
| 421 | 408 | ||
| 422 | static void dyntick_record_completed(struct rcu_state *rsp, long comp) | ||
| 423 | { | ||
| 424 | } | ||
| 425 | |||
| 426 | #ifdef CONFIG_SMP | 409 | #ifdef CONFIG_SMP | 
| 427 | 410 | ||
| 428 | /* | ||
| 429 | * If there are no dynticks, then the only way that a CPU can passively | ||
| 430 | * be in a quiescent state is to be offline. Unlike dynticks idle, which | ||
| 431 | * is a point in time during the prior (already finished) grace period, | ||
| 432 | * an offline CPU is always in a quiescent state, and thus can be | ||
| 433 | * unconditionally applied. So just return the current value of completed. | ||
| 434 | */ | ||
| 435 | static long dyntick_recall_completed(struct rcu_state *rsp) | ||
| 436 | { | ||
| 437 | return rsp->completed; | ||
| 438 | } | ||
| 439 | |||
| 440 | static int dyntick_save_progress_counter(struct rcu_data *rdp) | 411 | static int dyntick_save_progress_counter(struct rcu_data *rdp) | 
| 441 | { | 412 | { | 
| 442 | return 0; | 413 | return 0; | 
| @@ -553,13 +524,33 @@ static void check_cpu_stall(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 553 | /* | 524 | /* | 
| 554 | * Update CPU-local rcu_data state to record the newly noticed grace period. | 525 | * Update CPU-local rcu_data state to record the newly noticed grace period. | 
| 555 | * This is used both when we started the grace period and when we notice | 526 | * This is used both when we started the grace period and when we notice | 
| 556 | * that someone else started the grace period. | 527 | * that someone else started the grace period. The caller must hold the | 
| 528 | * ->lock of the leaf rcu_node structure corresponding to the current CPU, | ||
| 529 | * and must have irqs disabled. | ||
| 557 | */ | 530 | */ | 
| 531 | static void __note_new_gpnum(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp) | ||
| 532 | { | ||
| 533 | if (rdp->gpnum != rnp->gpnum) { | ||
| 534 | rdp->qs_pending = 1; | ||
| 535 | rdp->passed_quiesc = 0; | ||
| 536 | rdp->gpnum = rnp->gpnum; | ||
| 537 | } | ||
| 538 | } | ||
| 539 | |||
| 558 | static void note_new_gpnum(struct rcu_state *rsp, struct rcu_data *rdp) | 540 | static void note_new_gpnum(struct rcu_state *rsp, struct rcu_data *rdp) | 
| 559 | { | 541 | { | 
| 560 | rdp->qs_pending = 1; | 542 | unsigned long flags; | 
| 561 | rdp->passed_quiesc = 0; | 543 | struct rcu_node *rnp; | 
| 562 | rdp->gpnum = rsp->gpnum; | 544 | |
| 545 | local_irq_save(flags); | ||
| 546 | rnp = rdp->mynode; | ||
| 547 | if (rdp->gpnum == ACCESS_ONCE(rnp->gpnum) || /* outside lock. */ | ||
| 548 | !spin_trylock(&rnp->lock)) { /* irqs already off, retry later. */ | ||
| 549 | local_irq_restore(flags); | ||
| 550 | return; | ||
| 551 | } | ||
| 552 | __note_new_gpnum(rsp, rnp, rdp); | ||
| 553 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 563 | } | 554 | } | 
| 564 | 555 | ||
| 565 | /* | 556 | /* | 
| @@ -583,6 +574,79 @@ check_for_new_grace_period(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 583 | } | 574 | } | 
| 584 | 575 | ||
| 585 | /* | 576 | /* | 
| 577 | * Advance this CPU's callbacks, but only if the current grace period | ||
| 578 | * has ended. This may be called only from the CPU to whom the rdp | ||
| 579 | * belongs. In addition, the corresponding leaf rcu_node structure's | ||
| 580 | * ->lock must be held by the caller, with irqs disabled. | ||
| 581 | */ | ||
| 582 | static void | ||
| 583 | __rcu_process_gp_end(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp) | ||
| 584 | { | ||
| 585 | /* Did another grace period end? */ | ||
| 586 | if (rdp->completed != rnp->completed) { | ||
| 587 | |||
| 588 | /* Advance callbacks. No harm if list empty. */ | ||
| 589 | rdp->nxttail[RCU_DONE_TAIL] = rdp->nxttail[RCU_WAIT_TAIL]; | ||
| 590 | rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_READY_TAIL]; | ||
| 591 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 592 | |||
| 593 | /* Remember that we saw this grace-period completion. */ | ||
| 594 | rdp->completed = rnp->completed; | ||
| 595 | } | ||
| 596 | } | ||
| 597 | |||
| 598 | /* | ||
| 599 | * Advance this CPU's callbacks, but only if the current grace period | ||
| 600 | * has ended. This may be called only from the CPU to whom the rdp | ||
| 601 | * belongs. | ||
| 602 | */ | ||
| 603 | static void | ||
| 604 | rcu_process_gp_end(struct rcu_state *rsp, struct rcu_data *rdp) | ||
| 605 | { | ||
| 606 | unsigned long flags; | ||
| 607 | struct rcu_node *rnp; | ||
| 608 | |||
| 609 | local_irq_save(flags); | ||
| 610 | rnp = rdp->mynode; | ||
| 611 | if (rdp->completed == ACCESS_ONCE(rnp->completed) || /* outside lock. */ | ||
| 612 | !spin_trylock(&rnp->lock)) { /* irqs already off, retry later. */ | ||
| 613 | local_irq_restore(flags); | ||
| 614 | return; | ||
| 615 | } | ||
| 616 | __rcu_process_gp_end(rsp, rnp, rdp); | ||
| 617 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 618 | } | ||
| 619 | |||
| 620 | /* | ||
| 621 | * Do per-CPU grace-period initialization for running CPU. The caller | ||
| 622 | * must hold the lock of the leaf rcu_node structure corresponding to | ||
| 623 | * this CPU. | ||
| 624 | */ | ||
| 625 | static void | ||
| 626 | rcu_start_gp_per_cpu(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp) | ||
| 627 | { | ||
| 628 | /* Prior grace period ended, so advance callbacks for current CPU. */ | ||
| 629 | __rcu_process_gp_end(rsp, rnp, rdp); | ||
| 630 | |||
| 631 | /* | ||
| 632 | * Because this CPU just now started the new grace period, we know | ||
| 633 | * that all of its callbacks will be covered by this upcoming grace | ||
| 634 | * period, even the ones that were registered arbitrarily recently. | ||
| 635 | * Therefore, advance all outstanding callbacks to RCU_WAIT_TAIL. | ||
| 636 | * | ||
| 637 | * Other CPUs cannot be sure exactly when the grace period started. | ||
| 638 | * Therefore, their recently registered callbacks must pass through | ||
| 639 | * an additional RCU_NEXT_READY stage, so that they will be handled | ||
| 640 | * by the next RCU grace period. | ||
| 641 | */ | ||
| 642 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 643 | rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 644 | |||
| 645 | /* Set state so that this CPU will detect the next quiescent state. */ | ||
| 646 | __note_new_gpnum(rsp, rnp, rdp); | ||
| 647 | } | ||
| 648 | |||
| 649 | /* | ||
| 586 | * Start a new RCU grace period if warranted, re-initializing the hierarchy | 650 | * Start a new RCU grace period if warranted, re-initializing the hierarchy | 
| 587 | * in preparation for detecting the next grace period. The caller must hold | 651 | * in preparation for detecting the next grace period. The caller must hold | 
| 588 | * the root node's ->lock, which is released before return. Hard irqs must | 652 | * the root node's ->lock, which is released before return. Hard irqs must | 
| @@ -596,7 +660,23 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
| 596 | struct rcu_node *rnp = rcu_get_root(rsp); | 660 | struct rcu_node *rnp = rcu_get_root(rsp); | 
| 597 | 661 | ||
| 598 | if (!cpu_needs_another_gp(rsp, rdp)) { | 662 | if (!cpu_needs_another_gp(rsp, rdp)) { | 
| 599 | spin_unlock_irqrestore(&rnp->lock, flags); | 663 | if (rnp->completed == rsp->completed) { | 
| 664 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 665 | return; | ||
| 666 | } | ||
| 667 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | ||
| 668 | |||
| 669 | /* | ||
| 670 | * Propagate new ->completed value to rcu_node structures | ||
| 671 | * so that other CPUs don't have to wait until the start | ||
| 672 | * of the next grace period to process their callbacks. | ||
| 673 | */ | ||
| 674 | rcu_for_each_node_breadth_first(rsp, rnp) { | ||
| 675 | spin_lock(&rnp->lock); /* irqs already disabled. */ | ||
| 676 | rnp->completed = rsp->completed; | ||
| 677 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | ||
| 678 | } | ||
| 679 | local_irq_restore(flags); | ||
| 600 | return; | 680 | return; | 
| 601 | } | 681 | } | 
| 602 | 682 | ||
| @@ -606,29 +686,15 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
| 606 | rsp->signaled = RCU_GP_INIT; /* Hold off force_quiescent_state. */ | 686 | rsp->signaled = RCU_GP_INIT; /* Hold off force_quiescent_state. */ | 
| 607 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 687 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 
| 608 | record_gp_stall_check_time(rsp); | 688 | record_gp_stall_check_time(rsp); | 
| 609 | dyntick_record_completed(rsp, rsp->completed - 1); | ||
| 610 | note_new_gpnum(rsp, rdp); | ||
| 611 | |||
| 612 | /* | ||
| 613 | * Because this CPU just now started the new grace period, we know | ||
| 614 | * that all of its callbacks will be covered by this upcoming grace | ||
| 615 | * period, even the ones that were registered arbitrarily recently. | ||
| 616 | * Therefore, advance all outstanding callbacks to RCU_WAIT_TAIL. | ||
| 617 | * | ||
| 618 | * Other CPUs cannot be sure exactly when the grace period started. | ||
| 619 | * Therefore, their recently registered callbacks must pass through | ||
| 620 | * an additional RCU_NEXT_READY stage, so that they will be handled | ||
| 621 | * by the next RCU grace period. | ||
| 622 | */ | ||
| 623 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 624 | rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 625 | 689 | ||
| 626 | /* Special-case the common single-level case. */ | 690 | /* Special-case the common single-level case. */ | 
| 627 | if (NUM_RCU_NODES == 1) { | 691 | if (NUM_RCU_NODES == 1) { | 
| 628 | rcu_preempt_check_blocked_tasks(rnp); | 692 | rcu_preempt_check_blocked_tasks(rnp); | 
| 629 | rnp->qsmask = rnp->qsmaskinit; | 693 | rnp->qsmask = rnp->qsmaskinit; | 
| 630 | rnp->gpnum = rsp->gpnum; | 694 | rnp->gpnum = rsp->gpnum; | 
| 695 | rnp->completed = rsp->completed; | ||
| 631 | rsp->signaled = RCU_SIGNAL_INIT; /* force_quiescent_state OK. */ | 696 | rsp->signaled = RCU_SIGNAL_INIT; /* force_quiescent_state OK. */ | 
| 697 | rcu_start_gp_per_cpu(rsp, rnp, rdp); | ||
| 632 | spin_unlock_irqrestore(&rnp->lock, flags); | 698 | spin_unlock_irqrestore(&rnp->lock, flags); | 
| 633 | return; | 699 | return; | 
| 634 | } | 700 | } | 
| @@ -661,6 +727,9 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
| 661 | rcu_preempt_check_blocked_tasks(rnp); | 727 | rcu_preempt_check_blocked_tasks(rnp); | 
| 662 | rnp->qsmask = rnp->qsmaskinit; | 728 | rnp->qsmask = rnp->qsmaskinit; | 
| 663 | rnp->gpnum = rsp->gpnum; | 729 | rnp->gpnum = rsp->gpnum; | 
| 730 | rnp->completed = rsp->completed; | ||
| 731 | if (rnp == rdp->mynode) | ||
| 732 | rcu_start_gp_per_cpu(rsp, rnp, rdp); | ||
| 664 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 733 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 
| 665 | } | 734 | } | 
| 666 | 735 | ||
| @@ -672,58 +741,32 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
| 672 | } | 741 | } | 
| 673 | 742 | ||
| 674 | /* | 743 | /* | 
| 675 | * Advance this CPU's callbacks, but only if the current grace period | 744 | * Report a full set of quiescent states to the specified rcu_state | 
| 676 | * has ended. This may be called only from the CPU to whom the rdp | 745 | * data structure. This involves cleaning up after the prior grace | 
| 677 | * belongs. | 746 | * period and letting rcu_start_gp() start up the next grace period | 
| 747 | * if one is needed. Note that the caller must hold rnp->lock, as | ||
| 748 | * required by rcu_start_gp(), which will release it. | ||
| 678 | */ | 749 | */ | 
| 679 | static void | 750 | static void rcu_report_qs_rsp(struct rcu_state *rsp, unsigned long flags) | 
| 680 | rcu_process_gp_end(struct rcu_state *rsp, struct rcu_data *rdp) | ||
| 681 | { | ||
| 682 | long completed_snap; | ||
| 683 | unsigned long flags; | ||
| 684 | |||
| 685 | local_irq_save(flags); | ||
| 686 | completed_snap = ACCESS_ONCE(rsp->completed); /* outside of lock. */ | ||
| 687 | |||
| 688 | /* Did another grace period end? */ | ||
| 689 | if (rdp->completed != completed_snap) { | ||
| 690 | |||
| 691 | /* Advance callbacks. No harm if list empty. */ | ||
| 692 | rdp->nxttail[RCU_DONE_TAIL] = rdp->nxttail[RCU_WAIT_TAIL]; | ||
| 693 | rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_READY_TAIL]; | ||
| 694 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 695 | |||
| 696 | /* Remember that we saw this grace-period completion. */ | ||
| 697 | rdp->completed = completed_snap; | ||
| 698 | } | ||
| 699 | local_irq_restore(flags); | ||
| 700 | } | ||
| 701 | |||
| 702 | /* | ||
| 703 | * Clean up after the prior grace period and let rcu_start_gp() start up | ||
| 704 | * the next grace period if one is needed. Note that the caller must | ||
| 705 | * hold rnp->lock, as required by rcu_start_gp(), which will release it. | ||
| 706 | */ | ||
| 707 | static void cpu_quiet_msk_finish(struct rcu_state *rsp, unsigned long flags) | ||
| 708 | __releases(rcu_get_root(rsp)->lock) | 751 | __releases(rcu_get_root(rsp)->lock) | 
| 709 | { | 752 | { | 
| 710 | WARN_ON_ONCE(!rcu_gp_in_progress(rsp)); | 753 | WARN_ON_ONCE(!rcu_gp_in_progress(rsp)); | 
| 711 | rsp->completed = rsp->gpnum; | 754 | rsp->completed = rsp->gpnum; | 
| 712 | rsp->signaled = RCU_GP_IDLE; | 755 | rsp->signaled = RCU_GP_IDLE; | 
| 713 | rcu_process_gp_end(rsp, rsp->rda[smp_processor_id()]); | ||
| 714 | rcu_start_gp(rsp, flags); /* releases root node's rnp->lock. */ | 756 | rcu_start_gp(rsp, flags); /* releases root node's rnp->lock. */ | 
| 715 | } | 757 | } | 
| 716 | 758 | ||
| 717 | /* | 759 | /* | 
| 718 | * Similar to cpu_quiet(), for which it is a helper function. Allows | 760 | * Similar to rcu_report_qs_rdp(), for which it is a helper function. | 
| 719 | * a group of CPUs to be quieted at one go, though all the CPUs in the | 761 | * Allows quiescent states for a group of CPUs to be reported at one go | 
| 720 | * group must be represented by the same leaf rcu_node structure. | 762 | * to the specified rcu_node structure, though all the CPUs in the group | 
| 721 | * That structure's lock must be held upon entry, and it is released | 763 | * must be represented by the same rcu_node structure (which need not be | 
| 722 | * before return. | 764 | * a leaf rcu_node structure, though it often will be). That structure's | 
| 765 | * lock must be held upon entry, and it is released before return. | ||
| 723 | */ | 766 | */ | 
| 724 | static void | 767 | static void | 
| 725 | cpu_quiet_msk(unsigned long mask, struct rcu_state *rsp, struct rcu_node *rnp, | 768 | rcu_report_qs_rnp(unsigned long mask, struct rcu_state *rsp, | 
| 726 | unsigned long flags) | 769 | struct rcu_node *rnp, unsigned long flags) | 
| 727 | __releases(rnp->lock) | 770 | __releases(rnp->lock) | 
| 728 | { | 771 | { | 
| 729 | struct rcu_node *rnp_c; | 772 | struct rcu_node *rnp_c; | 
| @@ -759,21 +802,23 @@ cpu_quiet_msk(unsigned long mask, struct rcu_state *rsp, struct rcu_node *rnp, | |||
| 759 | 802 | ||
| 760 | /* | 803 | /* | 
| 761 | * Get here if we are the last CPU to pass through a quiescent | 804 | * Get here if we are the last CPU to pass through a quiescent | 
| 762 | * state for this grace period. Invoke cpu_quiet_msk_finish() | 805 | * state for this grace period. Invoke rcu_report_qs_rsp() | 
| 763 | * to clean up and start the next grace period if one is needed. | 806 | * to clean up and start the next grace period if one is needed. | 
| 764 | */ | 807 | */ | 
| 765 | cpu_quiet_msk_finish(rsp, flags); /* releases rnp->lock. */ | 808 | rcu_report_qs_rsp(rsp, flags); /* releases rnp->lock. */ | 
| 766 | } | 809 | } | 
| 767 | 810 | ||
| 768 | /* | 811 | /* | 
| 769 | * Record a quiescent state for the specified CPU, which must either be | 812 | * Record a quiescent state for the specified CPU to that CPU's rcu_data | 
| 770 | * the current CPU. The lastcomp argument is used to make sure we are | 813 | * structure. This must be either called from the specified CPU, or | 
| 771 | * still in the grace period of interest. We don't want to end the current | 814 | * called when the specified CPU is known to be offline (and when it is | 
| 772 | * grace period based on quiescent states detected in an earlier grace | 815 | * also known that no other CPU is concurrently trying to help the offline | 
| 773 | * period! | 816 | * CPU). The lastcomp argument is used to make sure we are still in the | 
| 817 | * grace period of interest. We don't want to end the current grace period | ||
| 818 | * based on quiescent states detected in an earlier grace period! | ||
| 774 | */ | 819 | */ | 
| 775 | static void | 820 | static void | 
| 776 | cpu_quiet(int cpu, struct rcu_state *rsp, struct rcu_data *rdp, long lastcomp) | 821 | rcu_report_qs_rdp(int cpu, struct rcu_state *rsp, struct rcu_data *rdp, long lastcomp) | 
| 777 | { | 822 | { | 
| 778 | unsigned long flags; | 823 | unsigned long flags; | 
| 779 | unsigned long mask; | 824 | unsigned long mask; | 
| @@ -781,15 +826,15 @@ cpu_quiet(int cpu, struct rcu_state *rsp, struct rcu_data *rdp, long lastcomp) | |||
| 781 | 826 | ||
| 782 | rnp = rdp->mynode; | 827 | rnp = rdp->mynode; | 
| 783 | spin_lock_irqsave(&rnp->lock, flags); | 828 | spin_lock_irqsave(&rnp->lock, flags); | 
| 784 | if (lastcomp != ACCESS_ONCE(rsp->completed)) { | 829 | if (lastcomp != rnp->completed) { | 
| 785 | 830 | ||
| 786 | /* | 831 | /* | 
| 787 | * Someone beat us to it for this grace period, so leave. | 832 | * Someone beat us to it for this grace period, so leave. | 
| 788 | * The race with GP start is resolved by the fact that we | 833 | * The race with GP start is resolved by the fact that we | 
| 789 | * hold the leaf rcu_node lock, so that the per-CPU bits | 834 | * hold the leaf rcu_node lock, so that the per-CPU bits | 
| 790 | * cannot yet be initialized -- so we would simply find our | 835 | * cannot yet be initialized -- so we would simply find our | 
| 791 | * CPU's bit already cleared in cpu_quiet_msk() if this race | 836 | * CPU's bit already cleared in rcu_report_qs_rnp() if this | 
| 792 | * occurred. | 837 | * race occurred. | 
| 793 | */ | 838 | */ | 
| 794 | rdp->passed_quiesc = 0; /* try again later! */ | 839 | rdp->passed_quiesc = 0; /* try again later! */ | 
| 795 | spin_unlock_irqrestore(&rnp->lock, flags); | 840 | spin_unlock_irqrestore(&rnp->lock, flags); | 
| @@ -807,7 +852,7 @@ cpu_quiet(int cpu, struct rcu_state *rsp, struct rcu_data *rdp, long lastcomp) | |||
| 807 | */ | 852 | */ | 
| 808 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | 853 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | 
| 809 | 854 | ||
| 810 | cpu_quiet_msk(mask, rsp, rnp, flags); /* releases rnp->lock */ | 855 | rcu_report_qs_rnp(mask, rsp, rnp, flags); /* rlses rnp->lock */ | 
| 811 | } | 856 | } | 
| 812 | } | 857 | } | 
| 813 | 858 | ||
| @@ -838,8 +883,11 @@ rcu_check_quiescent_state(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 838 | if (!rdp->passed_quiesc) | 883 | if (!rdp->passed_quiesc) | 
| 839 | return; | 884 | return; | 
| 840 | 885 | ||
| 841 | /* Tell RCU we are done (but cpu_quiet() will be the judge of that). */ | 886 | /* | 
| 842 | cpu_quiet(rdp->cpu, rsp, rdp, rdp->passed_quiesc_completed); | 887 | * Tell RCU we are done (but rcu_report_qs_rdp() will be the | 
| 888 | * judge of that). | ||
| 889 | */ | ||
| 890 | rcu_report_qs_rdp(rdp->cpu, rsp, rdp, rdp->passed_quiesc_completed); | ||
| 843 | } | 891 | } | 
| 844 | 892 | ||
| 845 | #ifdef CONFIG_HOTPLUG_CPU | 893 | #ifdef CONFIG_HOTPLUG_CPU | 
| @@ -899,8 +947,8 @@ static void rcu_adopt_orphan_cbs(struct rcu_state *rsp) | |||
| 899 | static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp) | 947 | static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp) | 
| 900 | { | 948 | { | 
| 901 | unsigned long flags; | 949 | unsigned long flags; | 
| 902 | long lastcomp; | ||
| 903 | unsigned long mask; | 950 | unsigned long mask; | 
| 951 | int need_report = 0; | ||
| 904 | struct rcu_data *rdp = rsp->rda[cpu]; | 952 | struct rcu_data *rdp = rsp->rda[cpu]; | 
| 905 | struct rcu_node *rnp; | 953 | struct rcu_node *rnp; | 
| 906 | 954 | ||
| @@ -914,30 +962,32 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp) | |||
| 914 | spin_lock(&rnp->lock); /* irqs already disabled. */ | 962 | spin_lock(&rnp->lock); /* irqs already disabled. */ | 
| 915 | rnp->qsmaskinit &= ~mask; | 963 | rnp->qsmaskinit &= ~mask; | 
| 916 | if (rnp->qsmaskinit != 0) { | 964 | if (rnp->qsmaskinit != 0) { | 
| 917 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 965 | if (rnp != rdp->mynode) | 
| 966 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | ||
| 918 | break; | 967 | break; | 
| 919 | } | 968 | } | 
| 920 | 969 | if (rnp == rdp->mynode) | |
| 921 | /* | 970 | need_report = rcu_preempt_offline_tasks(rsp, rnp, rdp); | 
| 922 | * If there was a task blocking the current grace period, | 971 | else | 
| 923 | * and if all CPUs have checked in, we need to propagate | 972 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 
| 924 | * the quiescent state up the rcu_node hierarchy. But that | ||
| 925 | * is inconvenient at the moment due to deadlock issues if | ||
| 926 | * this should end the current grace period. So set the | ||
| 927 | * offlined CPU's bit in ->qsmask in order to force the | ||
| 928 | * next force_quiescent_state() invocation to clean up this | ||
| 929 | * mess in a deadlock-free manner. | ||
| 930 | */ | ||
| 931 | if (rcu_preempt_offline_tasks(rsp, rnp, rdp) && !rnp->qsmask) | ||
| 932 | rnp->qsmask |= mask; | ||
| 933 | |||
| 934 | mask = rnp->grpmask; | 973 | mask = rnp->grpmask; | 
| 935 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | ||
| 936 | rnp = rnp->parent; | 974 | rnp = rnp->parent; | 
| 937 | } while (rnp != NULL); | 975 | } while (rnp != NULL); | 
| 938 | lastcomp = rsp->completed; | ||
| 939 | 976 | ||
| 940 | spin_unlock_irqrestore(&rsp->onofflock, flags); | 977 | /* | 
| 978 | * We still hold the leaf rcu_node structure lock here, and | ||
| 979 | * irqs are still disabled. The reason for this subterfuge is | ||
| 980 | * because invoking rcu_report_unblock_qs_rnp() with ->onofflock | ||
| 981 | * held leads to deadlock. | ||
| 982 | */ | ||
| 983 | spin_unlock(&rsp->onofflock); /* irqs remain disabled. */ | ||
| 984 | rnp = rdp->mynode; | ||
| 985 | if (need_report & RCU_OFL_TASKS_NORM_GP) | ||
| 986 | rcu_report_unblock_qs_rnp(rnp, flags); | ||
| 987 | else | ||
| 988 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 989 | if (need_report & RCU_OFL_TASKS_EXP_GP) | ||
| 990 | rcu_report_exp_rnp(rsp, rnp); | ||
| 941 | 991 | ||
| 942 | rcu_adopt_orphan_cbs(rsp); | 992 | rcu_adopt_orphan_cbs(rsp); | 
| 943 | } | 993 | } | 
| @@ -1109,7 +1159,7 @@ static int rcu_process_dyntick(struct rcu_state *rsp, long lastcomp, | |||
| 1109 | rcu_for_each_leaf_node(rsp, rnp) { | 1159 | rcu_for_each_leaf_node(rsp, rnp) { | 
| 1110 | mask = 0; | 1160 | mask = 0; | 
| 1111 | spin_lock_irqsave(&rnp->lock, flags); | 1161 | spin_lock_irqsave(&rnp->lock, flags); | 
| 1112 | if (rsp->completed != lastcomp) { | 1162 | if (rnp->completed != lastcomp) { | 
| 1113 | spin_unlock_irqrestore(&rnp->lock, flags); | 1163 | spin_unlock_irqrestore(&rnp->lock, flags); | 
| 1114 | return 1; | 1164 | return 1; | 
| 1115 | } | 1165 | } | 
| @@ -1123,10 +1173,10 @@ static int rcu_process_dyntick(struct rcu_state *rsp, long lastcomp, | |||
| 1123 | if ((rnp->qsmask & bit) != 0 && f(rsp->rda[cpu])) | 1173 | if ((rnp->qsmask & bit) != 0 && f(rsp->rda[cpu])) | 
| 1124 | mask |= bit; | 1174 | mask |= bit; | 
| 1125 | } | 1175 | } | 
| 1126 | if (mask != 0 && rsp->completed == lastcomp) { | 1176 | if (mask != 0 && rnp->completed == lastcomp) { | 
| 1127 | 1177 | ||
| 1128 | /* cpu_quiet_msk() releases rnp->lock. */ | 1178 | /* rcu_report_qs_rnp() releases rnp->lock. */ | 
| 1129 | cpu_quiet_msk(mask, rsp, rnp, flags); | 1179 | rcu_report_qs_rnp(mask, rsp, rnp, flags); | 
| 1130 | continue; | 1180 | continue; | 
| 1131 | } | 1181 | } | 
| 1132 | spin_unlock_irqrestore(&rnp->lock, flags); | 1182 | spin_unlock_irqrestore(&rnp->lock, flags); | 
| @@ -1144,6 +1194,7 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
| 1144 | long lastcomp; | 1194 | long lastcomp; | 
| 1145 | struct rcu_node *rnp = rcu_get_root(rsp); | 1195 | struct rcu_node *rnp = rcu_get_root(rsp); | 
| 1146 | u8 signaled; | 1196 | u8 signaled; | 
| 1197 | u8 forcenow; | ||
| 1147 | 1198 | ||
| 1148 | if (!rcu_gp_in_progress(rsp)) | 1199 | if (!rcu_gp_in_progress(rsp)) | 
| 1149 | return; /* No grace period in progress, nothing to force. */ | 1200 | return; /* No grace period in progress, nothing to force. */ | 
| @@ -1156,10 +1207,10 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
| 1156 | goto unlock_ret; /* no emergency and done recently. */ | 1207 | goto unlock_ret; /* no emergency and done recently. */ | 
| 1157 | rsp->n_force_qs++; | 1208 | rsp->n_force_qs++; | 
| 1158 | spin_lock(&rnp->lock); | 1209 | spin_lock(&rnp->lock); | 
| 1159 | lastcomp = rsp->completed; | 1210 | lastcomp = rsp->gpnum - 1; | 
| 1160 | signaled = rsp->signaled; | 1211 | signaled = rsp->signaled; | 
| 1161 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 1212 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 
| 1162 | if (lastcomp == rsp->gpnum) { | 1213 | if(!rcu_gp_in_progress(rsp)) { | 
| 1163 | rsp->n_force_qs_ngp++; | 1214 | rsp->n_force_qs_ngp++; | 
| 1164 | spin_unlock(&rnp->lock); | 1215 | spin_unlock(&rnp->lock); | 
| 1165 | goto unlock_ret; /* no GP in progress, time updated. */ | 1216 | goto unlock_ret; /* no GP in progress, time updated. */ | 
| @@ -1180,21 +1231,29 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
| 1180 | if (rcu_process_dyntick(rsp, lastcomp, | 1231 | if (rcu_process_dyntick(rsp, lastcomp, | 
| 1181 | dyntick_save_progress_counter)) | 1232 | dyntick_save_progress_counter)) | 
| 1182 | goto unlock_ret; | 1233 | goto unlock_ret; | 
| 1234 | /* fall into next case. */ | ||
| 1235 | |||
| 1236 | case RCU_SAVE_COMPLETED: | ||
| 1183 | 1237 | ||
| 1184 | /* Update state, record completion counter. */ | 1238 | /* Update state, record completion counter. */ | 
| 1239 | forcenow = 0; | ||
| 1185 | spin_lock(&rnp->lock); | 1240 | spin_lock(&rnp->lock); | 
| 1186 | if (lastcomp == rsp->completed && | 1241 | if (lastcomp + 1 == rsp->gpnum && | 
| 1187 | rsp->signaled == RCU_SAVE_DYNTICK) { | 1242 | lastcomp == rsp->completed && | 
| 1243 | rsp->signaled == signaled) { | ||
| 1188 | rsp->signaled = RCU_FORCE_QS; | 1244 | rsp->signaled = RCU_FORCE_QS; | 
| 1189 | dyntick_record_completed(rsp, lastcomp); | 1245 | rsp->completed_fqs = lastcomp; | 
| 1246 | forcenow = signaled == RCU_SAVE_COMPLETED; | ||
| 1190 | } | 1247 | } | 
| 1191 | spin_unlock(&rnp->lock); | 1248 | spin_unlock(&rnp->lock); | 
| 1192 | break; | 1249 | if (!forcenow) | 
| 1250 | break; | ||
| 1251 | /* fall into next case. */ | ||
| 1193 | 1252 | ||
| 1194 | case RCU_FORCE_QS: | 1253 | case RCU_FORCE_QS: | 
| 1195 | 1254 | ||
| 1196 | /* Check dyntick-idle state, send IPI to laggarts. */ | 1255 | /* Check dyntick-idle state, send IPI to laggarts. */ | 
| 1197 | if (rcu_process_dyntick(rsp, dyntick_recall_completed(rsp), | 1256 | if (rcu_process_dyntick(rsp, rsp->completed_fqs, | 
| 1198 | rcu_implicit_dynticks_qs)) | 1257 | rcu_implicit_dynticks_qs)) | 
| 1199 | goto unlock_ret; | 1258 | goto unlock_ret; | 
| 1200 | 1259 | ||
| @@ -1351,6 +1410,68 @@ void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
| 1351 | } | 1410 | } | 
| 1352 | EXPORT_SYMBOL_GPL(call_rcu_bh); | 1411 | EXPORT_SYMBOL_GPL(call_rcu_bh); | 
| 1353 | 1412 | ||
| 1413 | /** | ||
| 1414 | * synchronize_sched - wait until an rcu-sched grace period has elapsed. | ||
| 1415 | * | ||
| 1416 | * Control will return to the caller some time after a full rcu-sched | ||
| 1417 | * grace period has elapsed, in other words after all currently executing | ||
| 1418 | * rcu-sched read-side critical sections have completed. These read-side | ||
| 1419 | * critical sections are delimited by rcu_read_lock_sched() and | ||
| 1420 | * rcu_read_unlock_sched(), and may be nested. Note that preempt_disable(), | ||
| 1421 | * local_irq_disable(), and so on may be used in place of | ||
| 1422 | * rcu_read_lock_sched(). | ||
| 1423 | * | ||
| 1424 | * This means that all preempt_disable code sequences, including NMI and | ||
| 1425 | * hardware-interrupt handlers, in progress on entry will have completed | ||
| 1426 | * before this primitive returns. However, this does not guarantee that | ||
| 1427 | * softirq handlers will have completed, since in some kernels, these | ||
| 1428 | * handlers can run in process context, and can block. | ||
| 1429 | * | ||
| 1430 | * This primitive provides the guarantees made by the (now removed) | ||
| 1431 | * synchronize_kernel() API. In contrast, synchronize_rcu() only | ||
| 1432 | * guarantees that rcu_read_lock() sections will have completed. | ||
| 1433 | * In "classic RCU", these two guarantees happen to be one and | ||
| 1434 | * the same, but can differ in realtime RCU implementations. | ||
| 1435 | */ | ||
| 1436 | void synchronize_sched(void) | ||
| 1437 | { | ||
| 1438 | struct rcu_synchronize rcu; | ||
| 1439 | |||
| 1440 | if (rcu_blocking_is_gp()) | ||
| 1441 | return; | ||
| 1442 | |||
| 1443 | init_completion(&rcu.completion); | ||
| 1444 | /* Will wake me after RCU finished. */ | ||
| 1445 | call_rcu_sched(&rcu.head, wakeme_after_rcu); | ||
| 1446 | /* Wait for it. */ | ||
| 1447 | wait_for_completion(&rcu.completion); | ||
| 1448 | } | ||
| 1449 | EXPORT_SYMBOL_GPL(synchronize_sched); | ||
| 1450 | |||
| 1451 | /** | ||
| 1452 | * synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed. | ||
| 1453 | * | ||
| 1454 | * Control will return to the caller some time after a full rcu_bh grace | ||
| 1455 | * period has elapsed, in other words after all currently executing rcu_bh | ||
| 1456 | * read-side critical sections have completed. RCU read-side critical | ||
| 1457 | * sections are delimited by rcu_read_lock_bh() and rcu_read_unlock_bh(), | ||
| 1458 | * and may be nested. | ||
| 1459 | */ | ||
| 1460 | void synchronize_rcu_bh(void) | ||
| 1461 | { | ||
| 1462 | struct rcu_synchronize rcu; | ||
| 1463 | |||
| 1464 | if (rcu_blocking_is_gp()) | ||
| 1465 | return; | ||
| 1466 | |||
| 1467 | init_completion(&rcu.completion); | ||
| 1468 | /* Will wake me after RCU finished. */ | ||
| 1469 | call_rcu_bh(&rcu.head, wakeme_after_rcu); | ||
| 1470 | /* Wait for it. */ | ||
| 1471 | wait_for_completion(&rcu.completion); | ||
| 1472 | } | ||
| 1473 | EXPORT_SYMBOL_GPL(synchronize_rcu_bh); | ||
| 1474 | |||
| 1354 | /* | 1475 | /* | 
| 1355 | * Check to see if there is any immediate RCU-related work to be done | 1476 | * Check to see if there is any immediate RCU-related work to be done | 
| 1356 | * by the current CPU, for the specified type of RCU, returning 1 if so. | 1477 | * by the current CPU, for the specified type of RCU, returning 1 if so. | 
| @@ -1360,6 +1481,8 @@ EXPORT_SYMBOL_GPL(call_rcu_bh); | |||
| 1360 | */ | 1481 | */ | 
| 1361 | static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) | 1482 | static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) | 
| 1362 | { | 1483 | { | 
| 1484 | struct rcu_node *rnp = rdp->mynode; | ||
| 1485 | |||
| 1363 | rdp->n_rcu_pending++; | 1486 | rdp->n_rcu_pending++; | 
| 1364 | 1487 | ||
| 1365 | /* Check for CPU stalls, if enabled. */ | 1488 | /* Check for CPU stalls, if enabled. */ | 
| @@ -1384,13 +1507,13 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 1384 | } | 1507 | } | 
| 1385 | 1508 | ||
| 1386 | /* Has another RCU grace period completed? */ | 1509 | /* Has another RCU grace period completed? */ | 
| 1387 | if (ACCESS_ONCE(rsp->completed) != rdp->completed) { /* outside lock */ | 1510 | if (ACCESS_ONCE(rnp->completed) != rdp->completed) { /* outside lock */ | 
| 1388 | rdp->n_rp_gp_completed++; | 1511 | rdp->n_rp_gp_completed++; | 
| 1389 | return 1; | 1512 | return 1; | 
| 1390 | } | 1513 | } | 
| 1391 | 1514 | ||
| 1392 | /* Has a new RCU grace period started? */ | 1515 | /* Has a new RCU grace period started? */ | 
| 1393 | if (ACCESS_ONCE(rsp->gpnum) != rdp->gpnum) { /* outside lock */ | 1516 | if (ACCESS_ONCE(rnp->gpnum) != rdp->gpnum) { /* outside lock */ | 
| 1394 | rdp->n_rp_gp_started++; | 1517 | rdp->n_rp_gp_started++; | 
| 1395 | return 1; | 1518 | return 1; | 
| 1396 | } | 1519 | } | 
| @@ -1433,6 +1556,21 @@ int rcu_needs_cpu(int cpu) | |||
| 1433 | rcu_preempt_needs_cpu(cpu); | 1556 | rcu_preempt_needs_cpu(cpu); | 
| 1434 | } | 1557 | } | 
| 1435 | 1558 | ||
| 1559 | /* | ||
| 1560 | * This function is invoked towards the end of the scheduler's initialization | ||
| 1561 | * process. Before this is called, the idle task might contain | ||
| 1562 | * RCU read-side critical sections (during which time, this idle | ||
| 1563 | * task is booting the system). After this function is called, the | ||
| 1564 | * idle tasks are prohibited from containing RCU read-side critical | ||
| 1565 | * sections. | ||
| 1566 | */ | ||
| 1567 | void rcu_scheduler_starting(void) | ||
| 1568 | { | ||
| 1569 | WARN_ON(num_online_cpus() != 1); | ||
| 1570 | WARN_ON(nr_context_switches() > 0); | ||
| 1571 | rcu_scheduler_active = 1; | ||
| 1572 | } | ||
| 1573 | |||
| 1436 | static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; | 1574 | static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; | 
| 1437 | static atomic_t rcu_barrier_cpu_count; | 1575 | static atomic_t rcu_barrier_cpu_count; | 
| 1438 | static DEFINE_MUTEX(rcu_barrier_mutex); | 1576 | static DEFINE_MUTEX(rcu_barrier_mutex); | 
| @@ -1544,21 +1682,16 @@ static void __cpuinit | |||
| 1544 | rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptable) | 1682 | rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptable) | 
| 1545 | { | 1683 | { | 
| 1546 | unsigned long flags; | 1684 | unsigned long flags; | 
| 1547 | long lastcomp; | ||
| 1548 | unsigned long mask; | 1685 | unsigned long mask; | 
| 1549 | struct rcu_data *rdp = rsp->rda[cpu]; | 1686 | struct rcu_data *rdp = rsp->rda[cpu]; | 
| 1550 | struct rcu_node *rnp = rcu_get_root(rsp); | 1687 | struct rcu_node *rnp = rcu_get_root(rsp); | 
| 1551 | 1688 | ||
| 1552 | /* Set up local state, ensuring consistent view of global state. */ | 1689 | /* Set up local state, ensuring consistent view of global state. */ | 
| 1553 | spin_lock_irqsave(&rnp->lock, flags); | 1690 | spin_lock_irqsave(&rnp->lock, flags); | 
| 1554 | lastcomp = rsp->completed; | ||
| 1555 | rdp->completed = lastcomp; | ||
| 1556 | rdp->gpnum = lastcomp; | ||
| 1557 | rdp->passed_quiesc = 0; /* We could be racing with new GP, */ | 1691 | rdp->passed_quiesc = 0; /* We could be racing with new GP, */ | 
| 1558 | rdp->qs_pending = 1; /* so set up to respond to current GP. */ | 1692 | rdp->qs_pending = 1; /* so set up to respond to current GP. */ | 
| 1559 | rdp->beenonline = 1; /* We have now been online. */ | 1693 | rdp->beenonline = 1; /* We have now been online. */ | 
| 1560 | rdp->preemptable = preemptable; | 1694 | rdp->preemptable = preemptable; | 
| 1561 | rdp->passed_quiesc_completed = lastcomp - 1; | ||
| 1562 | rdp->qlen_last_fqs_check = 0; | 1695 | rdp->qlen_last_fqs_check = 0; | 
| 1563 | rdp->n_force_qs_snap = rsp->n_force_qs; | 1696 | rdp->n_force_qs_snap = rsp->n_force_qs; | 
| 1564 | rdp->blimit = blimit; | 1697 | rdp->blimit = blimit; | 
| @@ -1580,6 +1713,11 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptable) | |||
| 1580 | spin_lock(&rnp->lock); /* irqs already disabled. */ | 1713 | spin_lock(&rnp->lock); /* irqs already disabled. */ | 
| 1581 | rnp->qsmaskinit |= mask; | 1714 | rnp->qsmaskinit |= mask; | 
| 1582 | mask = rnp->grpmask; | 1715 | mask = rnp->grpmask; | 
| 1716 | if (rnp == rdp->mynode) { | ||
| 1717 | rdp->gpnum = rnp->completed; /* if GP in progress... */ | ||
| 1718 | rdp->completed = rnp->completed; | ||
| 1719 | rdp->passed_quiesc_completed = rnp->completed - 1; | ||
| 1720 | } | ||
| 1583 | spin_unlock(&rnp->lock); /* irqs already disabled. */ | 1721 | spin_unlock(&rnp->lock); /* irqs already disabled. */ | 
| 1584 | rnp = rnp->parent; | 1722 | rnp = rnp->parent; | 
| 1585 | } while (rnp != NULL && !(rnp->qsmaskinit & mask)); | 1723 | } while (rnp != NULL && !(rnp->qsmaskinit & mask)); | 
| @@ -1597,8 +1735,8 @@ static void __cpuinit rcu_online_cpu(int cpu) | |||
| 1597 | /* | 1735 | /* | 
| 1598 | * Handle CPU online/offline notification events. | 1736 | * Handle CPU online/offline notification events. | 
| 1599 | */ | 1737 | */ | 
| 1600 | int __cpuinit rcu_cpu_notify(struct notifier_block *self, | 1738 | static int __cpuinit rcu_cpu_notify(struct notifier_block *self, | 
| 1601 | unsigned long action, void *hcpu) | 1739 | unsigned long action, void *hcpu) | 
| 1602 | { | 1740 | { | 
| 1603 | long cpu = (long)hcpu; | 1741 | long cpu = (long)hcpu; | 
| 1604 | 1742 | ||
| @@ -1685,8 +1823,8 @@ static void __init rcu_init_one(struct rcu_state *rsp) | |||
| 1685 | cpustride *= rsp->levelspread[i]; | 1823 | cpustride *= rsp->levelspread[i]; | 
| 1686 | rnp = rsp->level[i]; | 1824 | rnp = rsp->level[i]; | 
| 1687 | for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) { | 1825 | for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) { | 
| 1688 | if (rnp != rcu_get_root(rsp)) | 1826 | spin_lock_init(&rnp->lock); | 
| 1689 | spin_lock_init(&rnp->lock); | 1827 | lockdep_set_class(&rnp->lock, &rcu_node_class[i]); | 
| 1690 | rnp->gpnum = 0; | 1828 | rnp->gpnum = 0; | 
| 1691 | rnp->qsmask = 0; | 1829 | rnp->qsmask = 0; | 
| 1692 | rnp->qsmaskinit = 0; | 1830 | rnp->qsmaskinit = 0; | 
| @@ -1707,9 +1845,10 @@ static void __init rcu_init_one(struct rcu_state *rsp) | |||
| 1707 | rnp->level = i; | 1845 | rnp->level = i; | 
| 1708 | INIT_LIST_HEAD(&rnp->blocked_tasks[0]); | 1846 | INIT_LIST_HEAD(&rnp->blocked_tasks[0]); | 
| 1709 | INIT_LIST_HEAD(&rnp->blocked_tasks[1]); | 1847 | INIT_LIST_HEAD(&rnp->blocked_tasks[1]); | 
| 1848 | INIT_LIST_HEAD(&rnp->blocked_tasks[2]); | ||
| 1849 | INIT_LIST_HEAD(&rnp->blocked_tasks[3]); | ||
| 1710 | } | 1850 | } | 
| 1711 | } | 1851 | } | 
| 1712 | spin_lock_init(&rcu_get_root(rsp)->lock); | ||
| 1713 | } | 1852 | } | 
| 1714 | 1853 | ||
| 1715 | /* | 1854 | /* | 
| @@ -1735,16 +1874,30 @@ do { \ | |||
| 1735 | } \ | 1874 | } \ | 
| 1736 | } while (0) | 1875 | } while (0) | 
| 1737 | 1876 | ||
| 1738 | void __init __rcu_init(void) | 1877 | void __init rcu_init(void) | 
| 1739 | { | 1878 | { | 
| 1879 | int i; | ||
| 1880 | |||
| 1740 | rcu_bootup_announce(); | 1881 | rcu_bootup_announce(); | 
| 1741 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 1882 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 
| 1742 | printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n"); | 1883 | printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n"); | 
| 1743 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 1884 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 
| 1885 | #if NUM_RCU_LVL_4 != 0 | ||
| 1886 | printk(KERN_INFO "Experimental four-level hierarchy is enabled.\n"); | ||
| 1887 | #endif /* #if NUM_RCU_LVL_4 != 0 */ | ||
| 1744 | RCU_INIT_FLAVOR(&rcu_sched_state, rcu_sched_data); | 1888 | RCU_INIT_FLAVOR(&rcu_sched_state, rcu_sched_data); | 
| 1745 | RCU_INIT_FLAVOR(&rcu_bh_state, rcu_bh_data); | 1889 | RCU_INIT_FLAVOR(&rcu_bh_state, rcu_bh_data); | 
| 1746 | __rcu_init_preempt(); | 1890 | __rcu_init_preempt(); | 
| 1747 | open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); | 1891 | open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); | 
| 1892 | |||
| 1893 | /* | ||
| 1894 | * We don't need protection against CPU-hotplug here because | ||
| 1895 | * this is called early in boot, before either interrupts | ||
| 1896 | * or the scheduler are operational. | ||
| 1897 | */ | ||
| 1898 | cpu_notifier(rcu_cpu_notify, 0); | ||
| 1899 | for_each_online_cpu(i) | ||
| 1900 | rcu_cpu_notify(NULL, CPU_UP_PREPARE, (void *)(long)i); | ||
| 1748 | } | 1901 | } | 
| 1749 | 1902 | ||
| 1750 | #include "rcutree_plugin.h" | 1903 | #include "rcutree_plugin.h" | 
| diff --git a/kernel/rcutree.h b/kernel/rcutree.h index 1899023b0962..d2a0046f63b2 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
| @@ -34,10 +34,11 @@ | |||
| 34 | * In practice, this has not been tested, so there is probably some | 34 | * In practice, this has not been tested, so there is probably some | 
| 35 | * bug somewhere. | 35 | * bug somewhere. | 
| 36 | */ | 36 | */ | 
| 37 | #define MAX_RCU_LVLS 3 | 37 | #define MAX_RCU_LVLS 4 | 
| 38 | #define RCU_FANOUT (CONFIG_RCU_FANOUT) | 38 | #define RCU_FANOUT (CONFIG_RCU_FANOUT) | 
| 39 | #define RCU_FANOUT_SQ (RCU_FANOUT * RCU_FANOUT) | 39 | #define RCU_FANOUT_SQ (RCU_FANOUT * RCU_FANOUT) | 
| 40 | #define RCU_FANOUT_CUBE (RCU_FANOUT_SQ * RCU_FANOUT) | 40 | #define RCU_FANOUT_CUBE (RCU_FANOUT_SQ * RCU_FANOUT) | 
| 41 | #define RCU_FANOUT_FOURTH (RCU_FANOUT_CUBE * RCU_FANOUT) | ||
| 41 | 42 | ||
| 42 | #if NR_CPUS <= RCU_FANOUT | 43 | #if NR_CPUS <= RCU_FANOUT | 
| 43 | # define NUM_RCU_LVLS 1 | 44 | # define NUM_RCU_LVLS 1 | 
| @@ -45,23 +46,33 @@ | |||
| 45 | # define NUM_RCU_LVL_1 (NR_CPUS) | 46 | # define NUM_RCU_LVL_1 (NR_CPUS) | 
| 46 | # define NUM_RCU_LVL_2 0 | 47 | # define NUM_RCU_LVL_2 0 | 
| 47 | # define NUM_RCU_LVL_3 0 | 48 | # define NUM_RCU_LVL_3 0 | 
| 49 | # define NUM_RCU_LVL_4 0 | ||
| 48 | #elif NR_CPUS <= RCU_FANOUT_SQ | 50 | #elif NR_CPUS <= RCU_FANOUT_SQ | 
| 49 | # define NUM_RCU_LVLS 2 | 51 | # define NUM_RCU_LVLS 2 | 
| 50 | # define NUM_RCU_LVL_0 1 | 52 | # define NUM_RCU_LVL_0 1 | 
| 51 | # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) | 53 | # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) | 
| 52 | # define NUM_RCU_LVL_2 (NR_CPUS) | 54 | # define NUM_RCU_LVL_2 (NR_CPUS) | 
| 53 | # define NUM_RCU_LVL_3 0 | 55 | # define NUM_RCU_LVL_3 0 | 
| 56 | # define NUM_RCU_LVL_4 0 | ||
| 54 | #elif NR_CPUS <= RCU_FANOUT_CUBE | 57 | #elif NR_CPUS <= RCU_FANOUT_CUBE | 
| 55 | # define NUM_RCU_LVLS 3 | 58 | # define NUM_RCU_LVLS 3 | 
| 56 | # define NUM_RCU_LVL_0 1 | 59 | # define NUM_RCU_LVL_0 1 | 
| 57 | # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_SQ) | 60 | # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_SQ) | 
| 58 | # define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) | 61 | # define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) | 
| 59 | # define NUM_RCU_LVL_3 NR_CPUS | 62 | # define NUM_RCU_LVL_3 NR_CPUS | 
| 63 | # define NUM_RCU_LVL_4 0 | ||
| 64 | #elif NR_CPUS <= RCU_FANOUT_FOURTH | ||
| 65 | # define NUM_RCU_LVLS 4 | ||
| 66 | # define NUM_RCU_LVL_0 1 | ||
| 67 | # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_CUBE) | ||
| 68 | # define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_SQ) | ||
| 69 | # define NUM_RCU_LVL_3 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) | ||
| 70 | # define NUM_RCU_LVL_4 NR_CPUS | ||
| 60 | #else | 71 | #else | 
| 61 | # error "CONFIG_RCU_FANOUT insufficient for NR_CPUS" | 72 | # error "CONFIG_RCU_FANOUT insufficient for NR_CPUS" | 
| 62 | #endif /* #if (NR_CPUS) <= RCU_FANOUT */ | 73 | #endif /* #if (NR_CPUS) <= RCU_FANOUT */ | 
| 63 | 74 | ||
| 64 | #define RCU_SUM (NUM_RCU_LVL_0 + NUM_RCU_LVL_1 + NUM_RCU_LVL_2 + NUM_RCU_LVL_3) | 75 | #define RCU_SUM (NUM_RCU_LVL_0 + NUM_RCU_LVL_1 + NUM_RCU_LVL_2 + NUM_RCU_LVL_3 + NUM_RCU_LVL_4) | 
| 65 | #define NUM_RCU_NODES (RCU_SUM - NR_CPUS) | 76 | #define NUM_RCU_NODES (RCU_SUM - NR_CPUS) | 
| 66 | 77 | ||
| 67 | /* | 78 | /* | 
| @@ -84,14 +95,21 @@ struct rcu_node { | |||
| 84 | long gpnum; /* Current grace period for this node. */ | 95 | long gpnum; /* Current grace period for this node. */ | 
| 85 | /* This will either be equal to or one */ | 96 | /* This will either be equal to or one */ | 
| 86 | /* behind the root rcu_node's gpnum. */ | 97 | /* behind the root rcu_node's gpnum. */ | 
| 98 | long completed; /* Last grace period completed for this node. */ | ||
| 99 | /* This will either be equal to or one */ | ||
| 100 | /* behind the root rcu_node's gpnum. */ | ||
| 87 | unsigned long qsmask; /* CPUs or groups that need to switch in */ | 101 | unsigned long qsmask; /* CPUs or groups that need to switch in */ | 
| 88 | /* order for current grace period to proceed.*/ | 102 | /* order for current grace period to proceed.*/ | 
| 89 | /* In leaf rcu_node, each bit corresponds to */ | 103 | /* In leaf rcu_node, each bit corresponds to */ | 
| 90 | /* an rcu_data structure, otherwise, each */ | 104 | /* an rcu_data structure, otherwise, each */ | 
| 91 | /* bit corresponds to a child rcu_node */ | 105 | /* bit corresponds to a child rcu_node */ | 
| 92 | /* structure. */ | 106 | /* structure. */ | 
| 107 | unsigned long expmask; /* Groups that have ->blocked_tasks[] */ | ||
| 108 | /* elements that need to drain to allow the */ | ||
| 109 | /* current expedited grace period to */ | ||
| 110 | /* complete (only for TREE_PREEMPT_RCU). */ | ||
| 93 | unsigned long qsmaskinit; | 111 | unsigned long qsmaskinit; | 
| 94 | /* Per-GP initialization for qsmask. */ | 112 | /* Per-GP initial value for qsmask & expmask. */ | 
| 95 | unsigned long grpmask; /* Mask to apply to parent qsmask. */ | 113 | unsigned long grpmask; /* Mask to apply to parent qsmask. */ | 
| 96 | /* Only one bit will be set in this mask. */ | 114 | /* Only one bit will be set in this mask. */ | 
| 97 | int grplo; /* lowest-numbered CPU or group here. */ | 115 | int grplo; /* lowest-numbered CPU or group here. */ | 
| @@ -99,7 +117,7 @@ struct rcu_node { | |||
| 99 | u8 grpnum; /* CPU/group number for next level up. */ | 117 | u8 grpnum; /* CPU/group number for next level up. */ | 
| 100 | u8 level; /* root is at level 0. */ | 118 | u8 level; /* root is at level 0. */ | 
| 101 | struct rcu_node *parent; | 119 | struct rcu_node *parent; | 
| 102 | struct list_head blocked_tasks[2]; | 120 | struct list_head blocked_tasks[4]; | 
| 103 | /* Tasks blocked in RCU read-side critsect. */ | 121 | /* Tasks blocked in RCU read-side critsect. */ | 
| 104 | /* Grace period number (->gpnum) x blocked */ | 122 | /* Grace period number (->gpnum) x blocked */ | 
| 105 | /* by tasks on the (x & 0x1) element of the */ | 123 | /* by tasks on the (x & 0x1) element of the */ | 
| @@ -114,6 +132,21 @@ struct rcu_node { | |||
| 114 | for ((rnp) = &(rsp)->node[0]; \ | 132 | for ((rnp) = &(rsp)->node[0]; \ | 
| 115 | (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | 133 | (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | 
| 116 | 134 | ||
| 135 | /* | ||
| 136 | * Do a breadth-first scan of the non-leaf rcu_node structures for the | ||
| 137 | * specified rcu_state structure. Note that if there is a singleton | ||
| 138 | * rcu_node tree with but one rcu_node structure, this loop is a no-op. | ||
| 139 | */ | ||
| 140 | #define rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) \ | ||
| 141 | for ((rnp) = &(rsp)->node[0]; \ | ||
| 142 | (rnp) < (rsp)->level[NUM_RCU_LVLS - 1]; (rnp)++) | ||
| 143 | |||
| 144 | /* | ||
| 145 | * Scan the leaves of the rcu_node hierarchy for the specified rcu_state | ||
| 146 | * structure. Note that if there is a singleton rcu_node tree with but | ||
| 147 | * one rcu_node structure, this loop -will- visit the rcu_node structure. | ||
| 148 | * It is still a leaf node, even if it is also the root node. | ||
| 149 | */ | ||
| 117 | #define rcu_for_each_leaf_node(rsp, rnp) \ | 150 | #define rcu_for_each_leaf_node(rsp, rnp) \ | 
| 118 | for ((rnp) = (rsp)->level[NUM_RCU_LVLS - 1]; \ | 151 | for ((rnp) = (rsp)->level[NUM_RCU_LVLS - 1]; \ | 
| 119 | (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | 152 | (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | 
| @@ -204,11 +237,12 @@ struct rcu_data { | |||
| 204 | #define RCU_GP_IDLE 0 /* No grace period in progress. */ | 237 | #define RCU_GP_IDLE 0 /* No grace period in progress. */ | 
| 205 | #define RCU_GP_INIT 1 /* Grace period being initialized. */ | 238 | #define RCU_GP_INIT 1 /* Grace period being initialized. */ | 
| 206 | #define RCU_SAVE_DYNTICK 2 /* Need to scan dyntick state. */ | 239 | #define RCU_SAVE_DYNTICK 2 /* Need to scan dyntick state. */ | 
| 207 | #define RCU_FORCE_QS 3 /* Need to force quiescent state. */ | 240 | #define RCU_SAVE_COMPLETED 3 /* Need to save rsp->completed. */ | 
| 241 | #define RCU_FORCE_QS 4 /* Need to force quiescent state. */ | ||
| 208 | #ifdef CONFIG_NO_HZ | 242 | #ifdef CONFIG_NO_HZ | 
| 209 | #define RCU_SIGNAL_INIT RCU_SAVE_DYNTICK | 243 | #define RCU_SIGNAL_INIT RCU_SAVE_DYNTICK | 
| 210 | #else /* #ifdef CONFIG_NO_HZ */ | 244 | #else /* #ifdef CONFIG_NO_HZ */ | 
| 211 | #define RCU_SIGNAL_INIT RCU_FORCE_QS | 245 | #define RCU_SIGNAL_INIT RCU_SAVE_COMPLETED | 
| 212 | #endif /* #else #ifdef CONFIG_NO_HZ */ | 246 | #endif /* #else #ifdef CONFIG_NO_HZ */ | 
| 213 | 247 | ||
| 214 | #define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */ | 248 | #define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */ | 
| @@ -246,7 +280,7 @@ struct rcu_state { | |||
| 246 | long gpnum; /* Current gp number. */ | 280 | long gpnum; /* Current gp number. */ | 
| 247 | long completed; /* # of last completed gp. */ | 281 | long completed; /* # of last completed gp. */ | 
| 248 | 282 | ||
| 249 | /* End of fields guarded by root rcu_node's lock. */ | 283 | /* End of fields guarded by root rcu_node's lock. */ | 
| 250 | 284 | ||
| 251 | spinlock_t onofflock; /* exclude on/offline and */ | 285 | spinlock_t onofflock; /* exclude on/offline and */ | 
| 252 | /* starting new GP. Also */ | 286 | /* starting new GP. Also */ | 
| @@ -260,6 +294,8 @@ struct rcu_state { | |||
| 260 | long orphan_qlen; /* Number of orphaned cbs. */ | 294 | long orphan_qlen; /* Number of orphaned cbs. */ | 
| 261 | spinlock_t fqslock; /* Only one task forcing */ | 295 | spinlock_t fqslock; /* Only one task forcing */ | 
| 262 | /* quiescent states. */ | 296 | /* quiescent states. */ | 
| 297 | long completed_fqs; /* Value of completed @ snap. */ | ||
| 298 | /* Protected by fqslock. */ | ||
| 263 | unsigned long jiffies_force_qs; /* Time at which to invoke */ | 299 | unsigned long jiffies_force_qs; /* Time at which to invoke */ | 
| 264 | /* force_quiescent_state(). */ | 300 | /* force_quiescent_state(). */ | 
| 265 | unsigned long n_force_qs; /* Number of calls to */ | 301 | unsigned long n_force_qs; /* Number of calls to */ | 
| @@ -274,11 +310,15 @@ struct rcu_state { | |||
| 274 | unsigned long jiffies_stall; /* Time at which to check */ | 310 | unsigned long jiffies_stall; /* Time at which to check */ | 
| 275 | /* for CPU stalls. */ | 311 | /* for CPU stalls. */ | 
| 276 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 312 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 
| 277 | #ifdef CONFIG_NO_HZ | ||
| 278 | long dynticks_completed; /* Value of completed @ snap. */ | ||
| 279 | #endif /* #ifdef CONFIG_NO_HZ */ | ||
| 280 | }; | 313 | }; | 
| 281 | 314 | ||
| 315 | /* Return values for rcu_preempt_offline_tasks(). */ | ||
| 316 | |||
| 317 | #define RCU_OFL_TASKS_NORM_GP 0x1 /* Tasks blocking normal */ | ||
| 318 | /* GP were moved to root. */ | ||
| 319 | #define RCU_OFL_TASKS_EXP_GP 0x2 /* Tasks blocking expedited */ | ||
| 320 | /* GP were moved to root. */ | ||
| 321 | |||
| 282 | #ifdef RCU_TREE_NONCORE | 322 | #ifdef RCU_TREE_NONCORE | 
| 283 | 323 | ||
| 284 | /* | 324 | /* | 
| @@ -298,10 +338,14 @@ DECLARE_PER_CPU(struct rcu_data, rcu_preempt_data); | |||
| 298 | #else /* #ifdef RCU_TREE_NONCORE */ | 338 | #else /* #ifdef RCU_TREE_NONCORE */ | 
| 299 | 339 | ||
| 300 | /* Forward declarations for rcutree_plugin.h */ | 340 | /* Forward declarations for rcutree_plugin.h */ | 
| 301 | static inline void rcu_bootup_announce(void); | 341 | static void rcu_bootup_announce(void); | 
| 302 | long rcu_batches_completed(void); | 342 | long rcu_batches_completed(void); | 
| 303 | static void rcu_preempt_note_context_switch(int cpu); | 343 | static void rcu_preempt_note_context_switch(int cpu); | 
| 304 | static int rcu_preempted_readers(struct rcu_node *rnp); | 344 | static int rcu_preempted_readers(struct rcu_node *rnp); | 
| 345 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 346 | static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, | ||
| 347 | unsigned long flags); | ||
| 348 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
| 305 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 349 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 
| 306 | static void rcu_print_task_stall(struct rcu_node *rnp); | 350 | static void rcu_print_task_stall(struct rcu_node *rnp); | 
| 307 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 351 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 
| @@ -315,6 +359,9 @@ static void rcu_preempt_offline_cpu(int cpu); | |||
| 315 | static void rcu_preempt_check_callbacks(int cpu); | 359 | static void rcu_preempt_check_callbacks(int cpu); | 
| 316 | static void rcu_preempt_process_callbacks(void); | 360 | static void rcu_preempt_process_callbacks(void); | 
| 317 | void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)); | 361 | void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)); | 
| 362 | #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) | ||
| 363 | static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp); | ||
| 364 | #endif /* #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) */ | ||
| 318 | static int rcu_preempt_pending(int cpu); | 365 | static int rcu_preempt_pending(int cpu); | 
| 319 | static int rcu_preempt_needs_cpu(int cpu); | 366 | static int rcu_preempt_needs_cpu(int cpu); | 
| 320 | static void __cpuinit rcu_preempt_init_percpu_data(int cpu); | 367 | static void __cpuinit rcu_preempt_init_percpu_data(int cpu); | 
| diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index ef2a58c2b9d5..37fbccdf41d5 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
| @@ -24,16 +24,19 @@ | |||
| 24 | * Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 24 | * Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 
| 25 | */ | 25 | */ | 
| 26 | 26 | ||
| 27 | #include <linux/delay.h> | ||
| 27 | 28 | ||
| 28 | #ifdef CONFIG_TREE_PREEMPT_RCU | 29 | #ifdef CONFIG_TREE_PREEMPT_RCU | 
| 29 | 30 | ||
| 30 | struct rcu_state rcu_preempt_state = RCU_STATE_INITIALIZER(rcu_preempt_state); | 31 | struct rcu_state rcu_preempt_state = RCU_STATE_INITIALIZER(rcu_preempt_state); | 
| 31 | DEFINE_PER_CPU(struct rcu_data, rcu_preempt_data); | 32 | DEFINE_PER_CPU(struct rcu_data, rcu_preempt_data); | 
| 32 | 33 | ||
| 34 | static int rcu_preempted_readers_exp(struct rcu_node *rnp); | ||
| 35 | |||
| 33 | /* | 36 | /* | 
| 34 | * Tell them what RCU they are running. | 37 | * Tell them what RCU they are running. | 
| 35 | */ | 38 | */ | 
| 36 | static inline void rcu_bootup_announce(void) | 39 | static void __init rcu_bootup_announce(void) | 
| 37 | { | 40 | { | 
| 38 | printk(KERN_INFO | 41 | printk(KERN_INFO | 
| 39 | "Experimental preemptable hierarchical RCU implementation.\n"); | 42 | "Experimental preemptable hierarchical RCU implementation.\n"); | 
| @@ -67,7 +70,7 @@ EXPORT_SYMBOL_GPL(rcu_batches_completed); | |||
| 67 | static void rcu_preempt_qs(int cpu) | 70 | static void rcu_preempt_qs(int cpu) | 
| 68 | { | 71 | { | 
| 69 | struct rcu_data *rdp = &per_cpu(rcu_preempt_data, cpu); | 72 | struct rcu_data *rdp = &per_cpu(rcu_preempt_data, cpu); | 
| 70 | rdp->passed_quiesc_completed = rdp->completed; | 73 | rdp->passed_quiesc_completed = rdp->gpnum - 1; | 
| 71 | barrier(); | 74 | barrier(); | 
| 72 | rdp->passed_quiesc = 1; | 75 | rdp->passed_quiesc = 1; | 
| 73 | } | 76 | } | 
| @@ -157,14 +160,58 @@ EXPORT_SYMBOL_GPL(__rcu_read_lock); | |||
| 157 | */ | 160 | */ | 
| 158 | static int rcu_preempted_readers(struct rcu_node *rnp) | 161 | static int rcu_preempted_readers(struct rcu_node *rnp) | 
| 159 | { | 162 | { | 
| 160 | return !list_empty(&rnp->blocked_tasks[rnp->gpnum & 0x1]); | 163 | int phase = rnp->gpnum & 0x1; | 
| 164 | |||
| 165 | return !list_empty(&rnp->blocked_tasks[phase]) || | ||
| 166 | !list_empty(&rnp->blocked_tasks[phase + 2]); | ||
| 167 | } | ||
| 168 | |||
| 169 | /* | ||
| 170 | * Record a quiescent state for all tasks that were previously queued | ||
| 171 | * on the specified rcu_node structure and that were blocking the current | ||
| 172 | * RCU grace period. The caller must hold the specified rnp->lock with | ||
| 173 | * irqs disabled, and this lock is released upon return, but irqs remain | ||
| 174 | * disabled. | ||
| 175 | */ | ||
| 176 | static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) | ||
| 177 | __releases(rnp->lock) | ||
| 178 | { | ||
| 179 | unsigned long mask; | ||
| 180 | struct rcu_node *rnp_p; | ||
| 181 | |||
| 182 | if (rnp->qsmask != 0 || rcu_preempted_readers(rnp)) { | ||
| 183 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 184 | return; /* Still need more quiescent states! */ | ||
| 185 | } | ||
| 186 | |||
| 187 | rnp_p = rnp->parent; | ||
| 188 | if (rnp_p == NULL) { | ||
| 189 | /* | ||
| 190 | * Either there is only one rcu_node in the tree, | ||
| 191 | * or tasks were kicked up to root rcu_node due to | ||
| 192 | * CPUs going offline. | ||
| 193 | */ | ||
| 194 | rcu_report_qs_rsp(&rcu_preempt_state, flags); | ||
| 195 | return; | ||
| 196 | } | ||
| 197 | |||
| 198 | /* Report up the rest of the hierarchy. */ | ||
| 199 | mask = rnp->grpmask; | ||
| 200 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | ||
| 201 | spin_lock(&rnp_p->lock); /* irqs already disabled. */ | ||
| 202 | rcu_report_qs_rnp(mask, &rcu_preempt_state, rnp_p, flags); | ||
| 161 | } | 203 | } | 
| 162 | 204 | ||
| 205 | /* | ||
| 206 | * Handle special cases during rcu_read_unlock(), such as needing to | ||
| 207 | * notify RCU core processing or task having blocked during the RCU | ||
| 208 | * read-side critical section. | ||
| 209 | */ | ||
| 163 | static void rcu_read_unlock_special(struct task_struct *t) | 210 | static void rcu_read_unlock_special(struct task_struct *t) | 
| 164 | { | 211 | { | 
| 165 | int empty; | 212 | int empty; | 
| 213 | int empty_exp; | ||
| 166 | unsigned long flags; | 214 | unsigned long flags; | 
| 167 | unsigned long mask; | ||
| 168 | struct rcu_node *rnp; | 215 | struct rcu_node *rnp; | 
| 169 | int special; | 216 | int special; | 
| 170 | 217 | ||
| @@ -207,36 +254,30 @@ static void rcu_read_unlock_special(struct task_struct *t) | |||
| 207 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 254 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 
| 208 | } | 255 | } | 
| 209 | empty = !rcu_preempted_readers(rnp); | 256 | empty = !rcu_preempted_readers(rnp); | 
| 257 | empty_exp = !rcu_preempted_readers_exp(rnp); | ||
| 258 | smp_mb(); /* ensure expedited fastpath sees end of RCU c-s. */ | ||
| 210 | list_del_init(&t->rcu_node_entry); | 259 | list_del_init(&t->rcu_node_entry); | 
| 211 | t->rcu_blocked_node = NULL; | 260 | t->rcu_blocked_node = NULL; | 
| 212 | 261 | ||
| 213 | /* | 262 | /* | 
| 214 | * If this was the last task on the current list, and if | 263 | * If this was the last task on the current list, and if | 
| 215 | * we aren't waiting on any CPUs, report the quiescent state. | 264 | * we aren't waiting on any CPUs, report the quiescent state. | 
| 216 | * Note that both cpu_quiet_msk_finish() and cpu_quiet_msk() | 265 | * Note that rcu_report_unblock_qs_rnp() releases rnp->lock. | 
| 217 | * drop rnp->lock and restore irq. | ||
| 218 | */ | 266 | */ | 
| 219 | if (!empty && rnp->qsmask == 0 && | 267 | if (empty) | 
| 220 | !rcu_preempted_readers(rnp)) { | ||
| 221 | struct rcu_node *rnp_p; | ||
| 222 | |||
| 223 | if (rnp->parent == NULL) { | ||
| 224 | /* Only one rcu_node in the tree. */ | ||
| 225 | cpu_quiet_msk_finish(&rcu_preempt_state, flags); | ||
| 226 | return; | ||
| 227 | } | ||
| 228 | /* Report up the rest of the hierarchy. */ | ||
| 229 | mask = rnp->grpmask; | ||
| 230 | spin_unlock_irqrestore(&rnp->lock, flags); | 268 | spin_unlock_irqrestore(&rnp->lock, flags); | 
| 231 | rnp_p = rnp->parent; | 269 | else | 
| 232 | spin_lock_irqsave(&rnp_p->lock, flags); | 270 | rcu_report_unblock_qs_rnp(rnp, flags); | 
| 233 | WARN_ON_ONCE(rnp->qsmask); | 271 | |
| 234 | cpu_quiet_msk(mask, &rcu_preempt_state, rnp_p, flags); | 272 | /* | 
| 235 | return; | 273 | * If this was the last task on the expedited lists, | 
| 236 | } | 274 | * then we need to report up the rcu_node hierarchy. | 
| 237 | spin_unlock(&rnp->lock); | 275 | */ | 
| 276 | if (!empty_exp && !rcu_preempted_readers_exp(rnp)) | ||
| 277 | rcu_report_exp_rnp(&rcu_preempt_state, rnp); | ||
| 278 | } else { | ||
| 279 | local_irq_restore(flags); | ||
| 238 | } | 280 | } | 
| 239 | local_irq_restore(flags); | ||
| 240 | } | 281 | } | 
| 241 | 282 | ||
| 242 | /* | 283 | /* | 
| @@ -303,6 +344,8 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) | |||
| 303 | * rcu_node. The reason for not just moving them to the immediate | 344 | * rcu_node. The reason for not just moving them to the immediate | 
| 304 | * parent is to remove the need for rcu_read_unlock_special() to | 345 | * parent is to remove the need for rcu_read_unlock_special() to | 
| 305 | * make more than two attempts to acquire the target rcu_node's lock. | 346 | * make more than two attempts to acquire the target rcu_node's lock. | 
| 347 | * Returns true if there were tasks blocking the current RCU grace | ||
| 348 | * period. | ||
| 306 | * | 349 | * | 
| 307 | * Returns 1 if there was previously a task blocking the current grace | 350 | * Returns 1 if there was previously a task blocking the current grace | 
| 308 | * period on the specified rcu_node structure. | 351 | * period on the specified rcu_node structure. | 
| @@ -316,7 +359,7 @@ static int rcu_preempt_offline_tasks(struct rcu_state *rsp, | |||
| 316 | int i; | 359 | int i; | 
| 317 | struct list_head *lp; | 360 | struct list_head *lp; | 
| 318 | struct list_head *lp_root; | 361 | struct list_head *lp_root; | 
| 319 | int retval = rcu_preempted_readers(rnp); | 362 | int retval = 0; | 
| 320 | struct rcu_node *rnp_root = rcu_get_root(rsp); | 363 | struct rcu_node *rnp_root = rcu_get_root(rsp); | 
| 321 | struct task_struct *tp; | 364 | struct task_struct *tp; | 
| 322 | 365 | ||
| @@ -326,7 +369,9 @@ static int rcu_preempt_offline_tasks(struct rcu_state *rsp, | |||
| 326 | } | 369 | } | 
| 327 | WARN_ON_ONCE(rnp != rdp->mynode && | 370 | WARN_ON_ONCE(rnp != rdp->mynode && | 
| 328 | (!list_empty(&rnp->blocked_tasks[0]) || | 371 | (!list_empty(&rnp->blocked_tasks[0]) || | 
| 329 | !list_empty(&rnp->blocked_tasks[1]))); | 372 | !list_empty(&rnp->blocked_tasks[1]) || | 
| 373 | !list_empty(&rnp->blocked_tasks[2]) || | ||
| 374 | !list_empty(&rnp->blocked_tasks[3]))); | ||
| 330 | 375 | ||
| 331 | /* | 376 | /* | 
| 332 | * Move tasks up to root rcu_node. Rely on the fact that the | 377 | * Move tasks up to root rcu_node. Rely on the fact that the | 
| @@ -334,7 +379,11 @@ static int rcu_preempt_offline_tasks(struct rcu_state *rsp, | |||
| 334 | * rcu_nodes in terms of gp_num value. This fact allows us to | 379 | * rcu_nodes in terms of gp_num value. This fact allows us to | 
| 335 | * move the blocked_tasks[] array directly, element by element. | 380 | * move the blocked_tasks[] array directly, element by element. | 
| 336 | */ | 381 | */ | 
| 337 | for (i = 0; i < 2; i++) { | 382 | if (rcu_preempted_readers(rnp)) | 
| 383 | retval |= RCU_OFL_TASKS_NORM_GP; | ||
| 384 | if (rcu_preempted_readers_exp(rnp)) | ||
| 385 | retval |= RCU_OFL_TASKS_EXP_GP; | ||
| 386 | for (i = 0; i < 4; i++) { | ||
| 338 | lp = &rnp->blocked_tasks[i]; | 387 | lp = &rnp->blocked_tasks[i]; | 
| 339 | lp_root = &rnp_root->blocked_tasks[i]; | 388 | lp_root = &rnp_root->blocked_tasks[i]; | 
| 340 | while (!list_empty(lp)) { | 389 | while (!list_empty(lp)) { | 
| @@ -346,7 +395,6 @@ static int rcu_preempt_offline_tasks(struct rcu_state *rsp, | |||
| 346 | spin_unlock(&rnp_root->lock); /* irqs remain disabled */ | 395 | spin_unlock(&rnp_root->lock); /* irqs remain disabled */ | 
| 347 | } | 396 | } | 
| 348 | } | 397 | } | 
| 349 | |||
| 350 | return retval; | 398 | return retval; | 
| 351 | } | 399 | } | 
| 352 | 400 | ||
| @@ -398,14 +446,183 @@ void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
| 398 | } | 446 | } | 
| 399 | EXPORT_SYMBOL_GPL(call_rcu); | 447 | EXPORT_SYMBOL_GPL(call_rcu); | 
| 400 | 448 | ||
| 449 | /** | ||
| 450 | * synchronize_rcu - wait until a grace period has elapsed. | ||
| 451 | * | ||
| 452 | * Control will return to the caller some time after a full grace | ||
| 453 | * period has elapsed, in other words after all currently executing RCU | ||
| 454 | * read-side critical sections have completed. RCU read-side critical | ||
| 455 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), | ||
| 456 | * and may be nested. | ||
| 457 | */ | ||
| 458 | void synchronize_rcu(void) | ||
| 459 | { | ||
| 460 | struct rcu_synchronize rcu; | ||
| 461 | |||
| 462 | if (!rcu_scheduler_active) | ||
| 463 | return; | ||
| 464 | |||
| 465 | init_completion(&rcu.completion); | ||
| 466 | /* Will wake me after RCU finished. */ | ||
| 467 | call_rcu(&rcu.head, wakeme_after_rcu); | ||
| 468 | /* Wait for it. */ | ||
| 469 | wait_for_completion(&rcu.completion); | ||
| 470 | } | ||
| 471 | EXPORT_SYMBOL_GPL(synchronize_rcu); | ||
| 472 | |||
| 473 | static DECLARE_WAIT_QUEUE_HEAD(sync_rcu_preempt_exp_wq); | ||
| 474 | static long sync_rcu_preempt_exp_count; | ||
| 475 | static DEFINE_MUTEX(sync_rcu_preempt_exp_mutex); | ||
| 476 | |||
| 401 | /* | 477 | /* | 
| 402 | * Wait for an rcu-preempt grace period. We are supposed to expedite the | 478 | * Return non-zero if there are any tasks in RCU read-side critical | 
| 403 | * grace period, but this is the crude slow compatability hack, so just | 479 | * sections blocking the current preemptible-RCU expedited grace period. | 
| 404 | * invoke synchronize_rcu(). | 480 | * If there is no preemptible-RCU expedited grace period currently in | 
| 481 | * progress, returns zero unconditionally. | ||
| 482 | */ | ||
| 483 | static int rcu_preempted_readers_exp(struct rcu_node *rnp) | ||
| 484 | { | ||
| 485 | return !list_empty(&rnp->blocked_tasks[2]) || | ||
| 486 | !list_empty(&rnp->blocked_tasks[3]); | ||
| 487 | } | ||
| 488 | |||
| 489 | /* | ||
| 490 | * return non-zero if there is no RCU expedited grace period in progress | ||
| 491 | * for the specified rcu_node structure, in other words, if all CPUs and | ||
| 492 | * tasks covered by the specified rcu_node structure have done their bit | ||
| 493 | * for the current expedited grace period. Works only for preemptible | ||
| 494 | * RCU -- other RCU implementation use other means. | ||
| 495 | * | ||
| 496 | * Caller must hold sync_rcu_preempt_exp_mutex. | ||
| 497 | */ | ||
| 498 | static int sync_rcu_preempt_exp_done(struct rcu_node *rnp) | ||
| 499 | { | ||
| 500 | return !rcu_preempted_readers_exp(rnp) && | ||
| 501 | ACCESS_ONCE(rnp->expmask) == 0; | ||
| 502 | } | ||
| 503 | |||
| 504 | /* | ||
| 505 | * Report the exit from RCU read-side critical section for the last task | ||
| 506 | * that queued itself during or before the current expedited preemptible-RCU | ||
| 507 | * grace period. This event is reported either to the rcu_node structure on | ||
| 508 | * which the task was queued or to one of that rcu_node structure's ancestors, | ||
| 509 | * recursively up the tree. (Calm down, calm down, we do the recursion | ||
| 510 | * iteratively!) | ||
| 511 | * | ||
| 512 | * Caller must hold sync_rcu_preempt_exp_mutex. | ||
| 513 | */ | ||
| 514 | static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp) | ||
| 515 | { | ||
| 516 | unsigned long flags; | ||
| 517 | unsigned long mask; | ||
| 518 | |||
| 519 | spin_lock_irqsave(&rnp->lock, flags); | ||
| 520 | for (;;) { | ||
| 521 | if (!sync_rcu_preempt_exp_done(rnp)) | ||
| 522 | break; | ||
| 523 | if (rnp->parent == NULL) { | ||
| 524 | wake_up(&sync_rcu_preempt_exp_wq); | ||
| 525 | break; | ||
| 526 | } | ||
| 527 | mask = rnp->grpmask; | ||
| 528 | spin_unlock(&rnp->lock); /* irqs remain disabled */ | ||
| 529 | rnp = rnp->parent; | ||
| 530 | spin_lock(&rnp->lock); /* irqs already disabled */ | ||
| 531 | rnp->expmask &= ~mask; | ||
| 532 | } | ||
| 533 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 534 | } | ||
| 535 | |||
| 536 | /* | ||
| 537 | * Snapshot the tasks blocking the newly started preemptible-RCU expedited | ||
| 538 | * grace period for the specified rcu_node structure. If there are no such | ||
| 539 | * tasks, report it up the rcu_node hierarchy. | ||
| 540 | * | ||
| 541 | * Caller must hold sync_rcu_preempt_exp_mutex and rsp->onofflock. | ||
| 542 | */ | ||
| 543 | static void | ||
| 544 | sync_rcu_preempt_exp_init(struct rcu_state *rsp, struct rcu_node *rnp) | ||
| 545 | { | ||
| 546 | int must_wait; | ||
| 547 | |||
| 548 | spin_lock(&rnp->lock); /* irqs already disabled */ | ||
| 549 | list_splice_init(&rnp->blocked_tasks[0], &rnp->blocked_tasks[2]); | ||
| 550 | list_splice_init(&rnp->blocked_tasks[1], &rnp->blocked_tasks[3]); | ||
| 551 | must_wait = rcu_preempted_readers_exp(rnp); | ||
| 552 | spin_unlock(&rnp->lock); /* irqs remain disabled */ | ||
| 553 | if (!must_wait) | ||
| 554 | rcu_report_exp_rnp(rsp, rnp); | ||
| 555 | } | ||
| 556 | |||
| 557 | /* | ||
| 558 | * Wait for an rcu-preempt grace period, but expedite it. The basic idea | ||
| 559 | * is to invoke synchronize_sched_expedited() to push all the tasks to | ||
| 560 | * the ->blocked_tasks[] lists, move all entries from the first set of | ||
| 561 | * ->blocked_tasks[] lists to the second set, and finally wait for this | ||
| 562 | * second set to drain. | ||
| 405 | */ | 563 | */ | 
| 406 | void synchronize_rcu_expedited(void) | 564 | void synchronize_rcu_expedited(void) | 
| 407 | { | 565 | { | 
| 408 | synchronize_rcu(); | 566 | unsigned long flags; | 
| 567 | struct rcu_node *rnp; | ||
| 568 | struct rcu_state *rsp = &rcu_preempt_state; | ||
| 569 | long snap; | ||
| 570 | int trycount = 0; | ||
| 571 | |||
| 572 | smp_mb(); /* Caller's modifications seen first by other CPUs. */ | ||
| 573 | snap = ACCESS_ONCE(sync_rcu_preempt_exp_count) + 1; | ||
| 574 | smp_mb(); /* Above access cannot bleed into critical section. */ | ||
| 575 | |||
| 576 | /* | ||
| 577 | * Acquire lock, falling back to synchronize_rcu() if too many | ||
| 578 | * lock-acquisition failures. Of course, if someone does the | ||
| 579 | * expedited grace period for us, just leave. | ||
| 580 | */ | ||
| 581 | while (!mutex_trylock(&sync_rcu_preempt_exp_mutex)) { | ||
| 582 | if (trycount++ < 10) | ||
| 583 | udelay(trycount * num_online_cpus()); | ||
| 584 | else { | ||
| 585 | synchronize_rcu(); | ||
| 586 | return; | ||
| 587 | } | ||
| 588 | if ((ACCESS_ONCE(sync_rcu_preempt_exp_count) - snap) > 0) | ||
| 589 | goto mb_ret; /* Others did our work for us. */ | ||
| 590 | } | ||
| 591 | if ((ACCESS_ONCE(sync_rcu_preempt_exp_count) - snap) > 0) | ||
| 592 | goto unlock_mb_ret; /* Others did our work for us. */ | ||
| 593 | |||
| 594 | /* force all RCU readers onto blocked_tasks[]. */ | ||
| 595 | synchronize_sched_expedited(); | ||
| 596 | |||
| 597 | spin_lock_irqsave(&rsp->onofflock, flags); | ||
| 598 | |||
| 599 | /* Initialize ->expmask for all non-leaf rcu_node structures. */ | ||
| 600 | rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) { | ||
| 601 | spin_lock(&rnp->lock); /* irqs already disabled. */ | ||
| 602 | rnp->expmask = rnp->qsmaskinit; | ||
| 603 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | ||
| 604 | } | ||
| 605 | |||
| 606 | /* Snapshot current state of ->blocked_tasks[] lists. */ | ||
| 607 | rcu_for_each_leaf_node(rsp, rnp) | ||
| 608 | sync_rcu_preempt_exp_init(rsp, rnp); | ||
| 609 | if (NUM_RCU_NODES > 1) | ||
| 610 | sync_rcu_preempt_exp_init(rsp, rcu_get_root(rsp)); | ||
| 611 | |||
| 612 | spin_unlock_irqrestore(&rsp->onofflock, flags); | ||
| 613 | |||
| 614 | /* Wait for snapshotted ->blocked_tasks[] lists to drain. */ | ||
| 615 | rnp = rcu_get_root(rsp); | ||
| 616 | wait_event(sync_rcu_preempt_exp_wq, | ||
| 617 | sync_rcu_preempt_exp_done(rnp)); | ||
| 618 | |||
| 619 | /* Clean up and exit. */ | ||
| 620 | smp_mb(); /* ensure expedited GP seen before counter increment. */ | ||
| 621 | ACCESS_ONCE(sync_rcu_preempt_exp_count)++; | ||
| 622 | unlock_mb_ret: | ||
| 623 | mutex_unlock(&sync_rcu_preempt_exp_mutex); | ||
| 624 | mb_ret: | ||
| 625 | smp_mb(); /* ensure subsequent action seen after grace period. */ | ||
| 409 | } | 626 | } | 
| 410 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | 627 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | 
| 411 | 628 | ||
| @@ -481,7 +698,7 @@ void exit_rcu(void) | |||
| 481 | /* | 698 | /* | 
| 482 | * Tell them what RCU they are running. | 699 | * Tell them what RCU they are running. | 
| 483 | */ | 700 | */ | 
| 484 | static inline void rcu_bootup_announce(void) | 701 | static void __init rcu_bootup_announce(void) | 
| 485 | { | 702 | { | 
| 486 | printk(KERN_INFO "Hierarchical RCU implementation.\n"); | 703 | printk(KERN_INFO "Hierarchical RCU implementation.\n"); | 
| 487 | } | 704 | } | 
| @@ -512,6 +729,16 @@ static int rcu_preempted_readers(struct rcu_node *rnp) | |||
| 512 | return 0; | 729 | return 0; | 
| 513 | } | 730 | } | 
| 514 | 731 | ||
| 732 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 733 | |||
| 734 | /* Because preemptible RCU does not exist, no quieting of tasks. */ | ||
| 735 | static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) | ||
| 736 | { | ||
| 737 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 738 | } | ||
| 739 | |||
| 740 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
| 741 | |||
| 515 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 742 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 
| 516 | 743 | ||
| 517 | /* | 744 | /* | 
| @@ -594,6 +821,20 @@ void synchronize_rcu_expedited(void) | |||
| 594 | } | 821 | } | 
| 595 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | 822 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | 
| 596 | 823 | ||
| 824 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 825 | |||
| 826 | /* | ||
| 827 | * Because preemptable RCU does not exist, there is never any need to | ||
| 828 | * report on tasks preempted in RCU read-side critical sections during | ||
| 829 | * expedited RCU grace periods. | ||
| 830 | */ | ||
| 831 | static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp) | ||
| 832 | { | ||
| 833 | return; | ||
| 834 | } | ||
| 835 | |||
| 836 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
| 837 | |||
| 597 | /* | 838 | /* | 
| 598 | * Because preemptable RCU does not exist, it never has any work to do. | 839 | * Because preemptable RCU does not exist, it never has any work to do. | 
| 599 | */ | 840 | */ | 
| diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c index 4b31c779e62e..9d2c88423b31 100644 --- a/kernel/rcutree_trace.c +++ b/kernel/rcutree_trace.c | |||
| @@ -155,12 +155,15 @@ static const struct file_operations rcudata_csv_fops = { | |||
| 155 | 155 | ||
| 156 | static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp) | 156 | static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp) | 
| 157 | { | 157 | { | 
| 158 | long gpnum; | ||
| 158 | int level = 0; | 159 | int level = 0; | 
| 160 | int phase; | ||
| 159 | struct rcu_node *rnp; | 161 | struct rcu_node *rnp; | 
| 160 | 162 | ||
| 163 | gpnum = rsp->gpnum; | ||
| 161 | seq_printf(m, "c=%ld g=%ld s=%d jfq=%ld j=%x " | 164 | seq_printf(m, "c=%ld g=%ld s=%d jfq=%ld j=%x " | 
| 162 | "nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu oqlen=%ld\n", | 165 | "nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu oqlen=%ld\n", | 
| 163 | rsp->completed, rsp->gpnum, rsp->signaled, | 166 | rsp->completed, gpnum, rsp->signaled, | 
| 164 | (long)(rsp->jiffies_force_qs - jiffies), | 167 | (long)(rsp->jiffies_force_qs - jiffies), | 
| 165 | (int)(jiffies & 0xffff), | 168 | (int)(jiffies & 0xffff), | 
| 166 | rsp->n_force_qs, rsp->n_force_qs_ngp, | 169 | rsp->n_force_qs, rsp->n_force_qs_ngp, | 
| @@ -171,8 +174,13 @@ static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp) | |||
| 171 | seq_puts(m, "\n"); | 174 | seq_puts(m, "\n"); | 
| 172 | level = rnp->level; | 175 | level = rnp->level; | 
| 173 | } | 176 | } | 
| 174 | seq_printf(m, "%lx/%lx %d:%d ^%d ", | 177 | phase = gpnum & 0x1; | 
| 178 | seq_printf(m, "%lx/%lx %c%c>%c%c %d:%d ^%d ", | ||
| 175 | rnp->qsmask, rnp->qsmaskinit, | 179 | rnp->qsmask, rnp->qsmaskinit, | 
| 180 | "T."[list_empty(&rnp->blocked_tasks[phase])], | ||
| 181 | "E."[list_empty(&rnp->blocked_tasks[phase + 2])], | ||
| 182 | "T."[list_empty(&rnp->blocked_tasks[!phase])], | ||
| 183 | "E."[list_empty(&rnp->blocked_tasks[!phase + 2])], | ||
| 176 | rnp->grplo, rnp->grphi, rnp->grpnum); | 184 | rnp->grplo, rnp->grphi, rnp->grpnum); | 
| 177 | } | 185 | } | 
| 178 | seq_puts(m, "\n"); | 186 | seq_puts(m, "\n"); | 
| diff --git a/kernel/sched.c b/kernel/sched.c index 3c11ae0a948d..6ae2739b8f19 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -5481,7 +5481,7 @@ need_resched_nonpreemptible: | |||
| 5481 | } | 5481 | } | 
| 5482 | EXPORT_SYMBOL(schedule); | 5482 | EXPORT_SYMBOL(schedule); | 
| 5483 | 5483 | ||
| 5484 | #ifdef CONFIG_SMP | 5484 | #ifdef CONFIG_MUTEX_SPIN_ON_OWNER | 
| 5485 | /* | 5485 | /* | 
| 5486 | * Look out! "owner" is an entirely speculative pointer | 5486 | * Look out! "owner" is an entirely speculative pointer | 
| 5487 | * access and not reliable. | 5487 | * access and not reliable. | 
| @@ -10901,6 +10901,7 @@ void synchronize_sched_expedited(void) | |||
| 10901 | spin_unlock_irqrestore(&rq->lock, flags); | 10901 | spin_unlock_irqrestore(&rq->lock, flags); | 
| 10902 | } | 10902 | } | 
| 10903 | rcu_expedited_state = RCU_EXPEDITED_STATE_IDLE; | 10903 | rcu_expedited_state = RCU_EXPEDITED_STATE_IDLE; | 
| 10904 | synchronize_sched_expedited_count++; | ||
| 10904 | mutex_unlock(&rcu_sched_expedited_mutex); | 10905 | mutex_unlock(&rcu_sched_expedited_mutex); | 
| 10905 | put_online_cpus(); | 10906 | put_online_cpus(); | 
| 10906 | if (need_full_sync) | 10907 | if (need_full_sync) | 
| diff --git a/kernel/signal.c b/kernel/signal.c index 6705320784fd..fe08008133da 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/ptrace.h> | 22 | #include <linux/ptrace.h> | 
| 23 | #include <linux/signal.h> | 23 | #include <linux/signal.h> | 
| 24 | #include <linux/signalfd.h> | 24 | #include <linux/signalfd.h> | 
| 25 | #include <linux/ratelimit.h> | ||
| 25 | #include <linux/tracehook.h> | 26 | #include <linux/tracehook.h> | 
| 26 | #include <linux/capability.h> | 27 | #include <linux/capability.h> | 
| 27 | #include <linux/freezer.h> | 28 | #include <linux/freezer.h> | 
| @@ -41,6 +42,8 @@ | |||
| 41 | 42 | ||
| 42 | static struct kmem_cache *sigqueue_cachep; | 43 | static struct kmem_cache *sigqueue_cachep; | 
| 43 | 44 | ||
| 45 | int print_fatal_signals __read_mostly; | ||
| 46 | |||
| 44 | static void __user *sig_handler(struct task_struct *t, int sig) | 47 | static void __user *sig_handler(struct task_struct *t, int sig) | 
| 45 | { | 48 | { | 
| 46 | return t->sighand->action[sig - 1].sa.sa_handler; | 49 | return t->sighand->action[sig - 1].sa.sa_handler; | 
| @@ -159,7 +162,7 @@ int next_signal(struct sigpending *pending, sigset_t *mask) | |||
| 159 | { | 162 | { | 
| 160 | unsigned long i, *s, *m, x; | 163 | unsigned long i, *s, *m, x; | 
| 161 | int sig = 0; | 164 | int sig = 0; | 
| 162 | 165 | ||
| 163 | s = pending->signal.sig; | 166 | s = pending->signal.sig; | 
| 164 | m = mask->sig; | 167 | m = mask->sig; | 
| 165 | switch (_NSIG_WORDS) { | 168 | switch (_NSIG_WORDS) { | 
| @@ -184,17 +187,31 @@ int next_signal(struct sigpending *pending, sigset_t *mask) | |||
| 184 | sig = ffz(~x) + 1; | 187 | sig = ffz(~x) + 1; | 
| 185 | break; | 188 | break; | 
| 186 | } | 189 | } | 
| 187 | 190 | ||
| 188 | return sig; | 191 | return sig; | 
| 189 | } | 192 | } | 
| 190 | 193 | ||
| 194 | static inline void print_dropped_signal(int sig) | ||
| 195 | { | ||
| 196 | static DEFINE_RATELIMIT_STATE(ratelimit_state, 5 * HZ, 10); | ||
| 197 | |||
| 198 | if (!print_fatal_signals) | ||
| 199 | return; | ||
| 200 | |||
| 201 | if (!__ratelimit(&ratelimit_state)) | ||
| 202 | return; | ||
| 203 | |||
| 204 | printk(KERN_INFO "%s/%d: reached RLIMIT_SIGPENDING, dropped signal %d\n", | ||
| 205 | current->comm, current->pid, sig); | ||
| 206 | } | ||
| 207 | |||
| 191 | /* | 208 | /* | 
| 192 | * allocate a new signal queue record | 209 | * allocate a new signal queue record | 
| 193 | * - this may be called without locks if and only if t == current, otherwise an | 210 | * - this may be called without locks if and only if t == current, otherwise an | 
| 194 | * appopriate lock must be held to stop the target task from exiting | 211 | * appopriate lock must be held to stop the target task from exiting | 
| 195 | */ | 212 | */ | 
| 196 | static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, | 213 | static struct sigqueue * | 
| 197 | int override_rlimit) | 214 | __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimit) | 
| 198 | { | 215 | { | 
| 199 | struct sigqueue *q = NULL; | 216 | struct sigqueue *q = NULL; | 
| 200 | struct user_struct *user; | 217 | struct user_struct *user; | 
| @@ -207,10 +224,15 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, | |||
| 207 | */ | 224 | */ | 
| 208 | user = get_uid(__task_cred(t)->user); | 225 | user = get_uid(__task_cred(t)->user); | 
| 209 | atomic_inc(&user->sigpending); | 226 | atomic_inc(&user->sigpending); | 
| 227 | |||
| 210 | if (override_rlimit || | 228 | if (override_rlimit || | 
| 211 | atomic_read(&user->sigpending) <= | 229 | atomic_read(&user->sigpending) <= | 
| 212 | t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur) | 230 | t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur) { | 
| 213 | q = kmem_cache_alloc(sigqueue_cachep, flags); | 231 | q = kmem_cache_alloc(sigqueue_cachep, flags); | 
| 232 | } else { | ||
| 233 | print_dropped_signal(sig); | ||
| 234 | } | ||
| 235 | |||
| 214 | if (unlikely(q == NULL)) { | 236 | if (unlikely(q == NULL)) { | 
| 215 | atomic_dec(&user->sigpending); | 237 | atomic_dec(&user->sigpending); | 
| 216 | free_uid(user); | 238 | free_uid(user); | 
| @@ -869,7 +891,7 @@ static int __send_signal(int sig, struct siginfo *info, struct task_struct *t, | |||
| 869 | else | 891 | else | 
| 870 | override_rlimit = 0; | 892 | override_rlimit = 0; | 
| 871 | 893 | ||
| 872 | q = __sigqueue_alloc(t, GFP_ATOMIC | __GFP_NOTRACK_FALSE_POSITIVE, | 894 | q = __sigqueue_alloc(sig, t, GFP_ATOMIC | __GFP_NOTRACK_FALSE_POSITIVE, | 
| 873 | override_rlimit); | 895 | override_rlimit); | 
| 874 | if (q) { | 896 | if (q) { | 
| 875 | list_add_tail(&q->list, &pending->list); | 897 | list_add_tail(&q->list, &pending->list); | 
| @@ -925,8 +947,6 @@ static int send_signal(int sig, struct siginfo *info, struct task_struct *t, | |||
| 925 | return __send_signal(sig, info, t, group, from_ancestor_ns); | 947 | return __send_signal(sig, info, t, group, from_ancestor_ns); | 
| 926 | } | 948 | } | 
| 927 | 949 | ||
| 928 | int print_fatal_signals; | ||
| 929 | |||
| 930 | static void print_fatal_signal(struct pt_regs *regs, int signr) | 950 | static void print_fatal_signal(struct pt_regs *regs, int signr) | 
| 931 | { | 951 | { | 
| 932 | printk("%s/%d: potentially unexpected fatal signal %d.\n", | 952 | printk("%s/%d: potentially unexpected fatal signal %d.\n", | 
| @@ -1293,19 +1313,19 @@ EXPORT_SYMBOL(kill_pid); | |||
| 1293 | * These functions support sending signals using preallocated sigqueue | 1313 | * These functions support sending signals using preallocated sigqueue | 
| 1294 | * structures. This is needed "because realtime applications cannot | 1314 | * structures. This is needed "because realtime applications cannot | 
| 1295 | * afford to lose notifications of asynchronous events, like timer | 1315 | * afford to lose notifications of asynchronous events, like timer | 
| 1296 | * expirations or I/O completions". In the case of Posix Timers | 1316 | * expirations or I/O completions". In the case of Posix Timers | 
| 1297 | * we allocate the sigqueue structure from the timer_create. If this | 1317 | * we allocate the sigqueue structure from the timer_create. If this | 
| 1298 | * allocation fails we are able to report the failure to the application | 1318 | * allocation fails we are able to report the failure to the application | 
| 1299 | * with an EAGAIN error. | 1319 | * with an EAGAIN error. | 
| 1300 | */ | 1320 | */ | 
| 1301 | |||
| 1302 | struct sigqueue *sigqueue_alloc(void) | 1321 | struct sigqueue *sigqueue_alloc(void) | 
| 1303 | { | 1322 | { | 
| 1304 | struct sigqueue *q; | 1323 | struct sigqueue *q = __sigqueue_alloc(-1, current, GFP_KERNEL, 0); | 
| 1305 | 1324 | ||
| 1306 | if ((q = __sigqueue_alloc(current, GFP_KERNEL, 0))) | 1325 | if (q) | 
| 1307 | q->flags |= SIGQUEUE_PREALLOC; | 1326 | q->flags |= SIGQUEUE_PREALLOC; | 
| 1308 | return(q); | 1327 | |
| 1328 | return q; | ||
| 1309 | } | 1329 | } | 
| 1310 | 1330 | ||
| 1311 | void sigqueue_free(struct sigqueue *q) | 1331 | void sigqueue_free(struct sigqueue *q) | 
| diff --git a/kernel/smp.c b/kernel/smp.c index c9d1c7835c2f..a8c76069cf50 100644 --- a/kernel/smp.c +++ b/kernel/smp.c | |||
| @@ -265,9 +265,7 @@ static DEFINE_PER_CPU(struct call_single_data, csd_data); | |||
| 265 | * @info: An arbitrary pointer to pass to the function. | 265 | * @info: An arbitrary pointer to pass to the function. | 
| 266 | * @wait: If true, wait until function has completed on other CPUs. | 266 | * @wait: If true, wait until function has completed on other CPUs. | 
| 267 | * | 267 | * | 
| 268 | * Returns 0 on success, else a negative status code. Note that @wait | 268 | * Returns 0 on success, else a negative status code. | 
| 269 | * will be implicitly turned on in case of allocation failures, since | ||
| 270 | * we fall back to on-stack allocation. | ||
| 271 | */ | 269 | */ | 
| 272 | int smp_call_function_single(int cpu, void (*func) (void *info), void *info, | 270 | int smp_call_function_single(int cpu, void (*func) (void *info), void *info, | 
| 273 | int wait) | 271 | int wait) | 
| @@ -321,6 +319,51 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, | |||
| 321 | } | 319 | } | 
| 322 | EXPORT_SYMBOL(smp_call_function_single); | 320 | EXPORT_SYMBOL(smp_call_function_single); | 
| 323 | 321 | ||
| 322 | /* | ||
| 323 | * smp_call_function_any - Run a function on any of the given cpus | ||
| 324 | * @mask: The mask of cpus it can run on. | ||
| 325 | * @func: The function to run. This must be fast and non-blocking. | ||
| 326 | * @info: An arbitrary pointer to pass to the function. | ||
| 327 | * @wait: If true, wait until function has completed. | ||
| 328 | * | ||
| 329 | * Returns 0 on success, else a negative status code (if no cpus were online). | ||
| 330 | * Note that @wait will be implicitly turned on in case of allocation failures, | ||
| 331 | * since we fall back to on-stack allocation. | ||
| 332 | * | ||
| 333 | * Selection preference: | ||
| 334 | * 1) current cpu if in @mask | ||
| 335 | * 2) any cpu of current node if in @mask | ||
| 336 | * 3) any other online cpu in @mask | ||
| 337 | */ | ||
| 338 | int smp_call_function_any(const struct cpumask *mask, | ||
| 339 | void (*func)(void *info), void *info, int wait) | ||
| 340 | { | ||
| 341 | unsigned int cpu; | ||
| 342 | const struct cpumask *nodemask; | ||
| 343 | int ret; | ||
| 344 | |||
| 345 | /* Try for same CPU (cheapest) */ | ||
| 346 | cpu = get_cpu(); | ||
| 347 | if (cpumask_test_cpu(cpu, mask)) | ||
| 348 | goto call; | ||
| 349 | |||
| 350 | /* Try for same node. */ | ||
| 351 | nodemask = cpumask_of_node(cpu); | ||
| 352 | for (cpu = cpumask_first_and(nodemask, mask); cpu < nr_cpu_ids; | ||
| 353 | cpu = cpumask_next_and(cpu, nodemask, mask)) { | ||
| 354 | if (cpu_online(cpu)) | ||
| 355 | goto call; | ||
| 356 | } | ||
| 357 | |||
| 358 | /* Any online will do: smp_call_function_single handles nr_cpu_ids. */ | ||
| 359 | cpu = cpumask_any_and(mask, cpu_online_mask); | ||
| 360 | call: | ||
| 361 | ret = smp_call_function_single(cpu, func, info, wait); | ||
| 362 | put_cpu(); | ||
| 363 | return ret; | ||
| 364 | } | ||
| 365 | EXPORT_SYMBOL_GPL(smp_call_function_any); | ||
| 366 | |||
| 324 | /** | 367 | /** | 
| 325 | * __smp_call_function_single(): Run a function on another CPU | 368 | * __smp_call_function_single(): Run a function on another CPU | 
| 326 | * @cpu: The CPU to run on. | 369 | * @cpu: The CPU to run on. | 
| @@ -355,9 +398,7 @@ void __smp_call_function_single(int cpu, struct call_single_data *data, | |||
| 355 | * @wait: If true, wait (atomically) until function has completed | 398 | * @wait: If true, wait (atomically) until function has completed | 
| 356 | * on other CPUs. | 399 | * on other CPUs. | 
| 357 | * | 400 | * | 
| 358 | * If @wait is true, then returns once @func has returned. Note that @wait | 401 | * If @wait is true, then returns once @func has returned. | 
| 359 | * will be implicitly turned on in case of allocation failures, since | ||
| 360 | * we fall back to on-stack allocation. | ||
| 361 | * | 402 | * | 
| 362 | * You must not call this function with disabled interrupts or from a | 403 | * You must not call this function with disabled interrupts or from a | 
| 363 | * hardware interrupt handler or from a bottom half handler. Preemption | 404 | * hardware interrupt handler or from a bottom half handler. Preemption | 
| @@ -443,8 +484,7 @@ EXPORT_SYMBOL(smp_call_function_many); | |||
| 443 | * Returns 0. | 484 | * Returns 0. | 
| 444 | * | 485 | * | 
| 445 | * If @wait is true, then returns once @func has returned; otherwise | 486 | * 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 | 487 | * it returns just before the target cpu calls @func. | 
| 447 | * failure, @wait will be implicitly turned on. | ||
| 448 | * | 488 | * | 
| 449 | * You must not call this function with disabled interrupts or from a | 489 | * You must not call this function with disabled interrupts or from a | 
| 450 | * hardware interrupt handler or from a bottom half handler. | 490 | * hardware interrupt handler or from a bottom half handler. | 
| diff --git a/kernel/softirq.c b/kernel/softirq.c index f8749e5216e0..21939d9e830e 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
| @@ -302,9 +302,9 @@ void irq_exit(void) | |||
| 302 | if (!in_interrupt() && local_softirq_pending()) | 302 | if (!in_interrupt() && local_softirq_pending()) | 
| 303 | invoke_softirq(); | 303 | invoke_softirq(); | 
| 304 | 304 | ||
| 305 | rcu_irq_exit(); | ||
| 305 | #ifdef CONFIG_NO_HZ | 306 | #ifdef CONFIG_NO_HZ | 
| 306 | /* Make sure that timer wheel updates are propagated */ | 307 | /* Make sure that timer wheel updates are propagated */ | 
| 307 | rcu_irq_exit(); | ||
| 308 | if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched()) | 308 | if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched()) | 
| 309 | tick_nohz_stop_sched_tick(0); | 309 | tick_nohz_stop_sched_tick(0); | 
| 310 | #endif | 310 | #endif | 
| diff --git a/kernel/spinlock.c b/kernel/spinlock.c index 5ddab730cb2f..41e042219ff6 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c | |||
| @@ -21,145 +21,28 @@ | |||
| 21 | #include <linux/debug_locks.h> | 21 | #include <linux/debug_locks.h> | 
| 22 | #include <linux/module.h> | 22 | #include <linux/module.h> | 
| 23 | 23 | ||
| 24 | #ifndef _spin_trylock | ||
| 25 | int __lockfunc _spin_trylock(spinlock_t *lock) | ||
| 26 | { | ||
| 27 | return __spin_trylock(lock); | ||
| 28 | } | ||
| 29 | EXPORT_SYMBOL(_spin_trylock); | ||
| 30 | #endif | ||
| 31 | |||
| 32 | #ifndef _read_trylock | ||
| 33 | int __lockfunc _read_trylock(rwlock_t *lock) | ||
| 34 | { | ||
| 35 | return __read_trylock(lock); | ||
| 36 | } | ||
| 37 | EXPORT_SYMBOL(_read_trylock); | ||
| 38 | #endif | ||
| 39 | |||
| 40 | #ifndef _write_trylock | ||
| 41 | int __lockfunc _write_trylock(rwlock_t *lock) | ||
| 42 | { | ||
| 43 | return __write_trylock(lock); | ||
| 44 | } | ||
| 45 | EXPORT_SYMBOL(_write_trylock); | ||
| 46 | #endif | ||
| 47 | |||
| 48 | /* | 24 | /* | 
| 49 | * If lockdep is enabled then we use the non-preemption spin-ops | 25 | * If lockdep is enabled then we use the non-preemption spin-ops | 
| 50 | * even on CONFIG_PREEMPT, because lockdep assumes that interrupts are | 26 | * even on CONFIG_PREEMPT, because lockdep assumes that interrupts are | 
| 51 | * not re-enabled during lock-acquire (which the preempt-spin-ops do): | 27 | * not re-enabled during lock-acquire (which the preempt-spin-ops do): | 
| 52 | */ | 28 | */ | 
| 53 | #if !defined(CONFIG_GENERIC_LOCKBREAK) || defined(CONFIG_DEBUG_LOCK_ALLOC) | 29 | #if !defined(CONFIG_GENERIC_LOCKBREAK) || defined(CONFIG_DEBUG_LOCK_ALLOC) | 
| 54 | |||
| 55 | #ifndef _read_lock | ||
| 56 | void __lockfunc _read_lock(rwlock_t *lock) | ||
| 57 | { | ||
| 58 | __read_lock(lock); | ||
| 59 | } | ||
| 60 | EXPORT_SYMBOL(_read_lock); | ||
| 61 | #endif | ||
| 62 | |||
| 63 | #ifndef _spin_lock_irqsave | ||
| 64 | unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) | ||
| 65 | { | ||
| 66 | return __spin_lock_irqsave(lock); | ||
| 67 | } | ||
| 68 | EXPORT_SYMBOL(_spin_lock_irqsave); | ||
| 69 | #endif | ||
| 70 | |||
| 71 | #ifndef _spin_lock_irq | ||
| 72 | void __lockfunc _spin_lock_irq(spinlock_t *lock) | ||
| 73 | { | ||
| 74 | __spin_lock_irq(lock); | ||
| 75 | } | ||
| 76 | EXPORT_SYMBOL(_spin_lock_irq); | ||
| 77 | #endif | ||
| 78 | |||
| 79 | #ifndef _spin_lock_bh | ||
| 80 | void __lockfunc _spin_lock_bh(spinlock_t *lock) | ||
| 81 | { | ||
| 82 | __spin_lock_bh(lock); | ||
| 83 | } | ||
| 84 | EXPORT_SYMBOL(_spin_lock_bh); | ||
| 85 | #endif | ||
| 86 | |||
| 87 | #ifndef _read_lock_irqsave | ||
| 88 | unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) | ||
| 89 | { | ||
| 90 | return __read_lock_irqsave(lock); | ||
| 91 | } | ||
| 92 | EXPORT_SYMBOL(_read_lock_irqsave); | ||
| 93 | #endif | ||
| 94 | |||
| 95 | #ifndef _read_lock_irq | ||
| 96 | void __lockfunc _read_lock_irq(rwlock_t *lock) | ||
| 97 | { | ||
| 98 | __read_lock_irq(lock); | ||
| 99 | } | ||
| 100 | EXPORT_SYMBOL(_read_lock_irq); | ||
| 101 | #endif | ||
| 102 | |||
| 103 | #ifndef _read_lock_bh | ||
| 104 | void __lockfunc _read_lock_bh(rwlock_t *lock) | ||
| 105 | { | ||
| 106 | __read_lock_bh(lock); | ||
| 107 | } | ||
| 108 | EXPORT_SYMBOL(_read_lock_bh); | ||
| 109 | #endif | ||
| 110 | |||
| 111 | #ifndef _write_lock_irqsave | ||
| 112 | unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) | ||
| 113 | { | ||
| 114 | return __write_lock_irqsave(lock); | ||
| 115 | } | ||
| 116 | EXPORT_SYMBOL(_write_lock_irqsave); | ||
| 117 | #endif | ||
| 118 | |||
| 119 | #ifndef _write_lock_irq | ||
| 120 | void __lockfunc _write_lock_irq(rwlock_t *lock) | ||
| 121 | { | ||
| 122 | __write_lock_irq(lock); | ||
| 123 | } | ||
| 124 | EXPORT_SYMBOL(_write_lock_irq); | ||
| 125 | #endif | ||
| 126 | |||
| 127 | #ifndef _write_lock_bh | ||
| 128 | void __lockfunc _write_lock_bh(rwlock_t *lock) | ||
| 129 | { | ||
| 130 | __write_lock_bh(lock); | ||
| 131 | } | ||
| 132 | EXPORT_SYMBOL(_write_lock_bh); | ||
| 133 | #endif | ||
| 134 | |||
| 135 | #ifndef _spin_lock | ||
| 136 | void __lockfunc _spin_lock(spinlock_t *lock) | ||
| 137 | { | ||
| 138 | __spin_lock(lock); | ||
| 139 | } | ||
| 140 | EXPORT_SYMBOL(_spin_lock); | ||
| 141 | #endif | ||
| 142 | |||
| 143 | #ifndef _write_lock | ||
| 144 | void __lockfunc _write_lock(rwlock_t *lock) | ||
| 145 | { | ||
| 146 | __write_lock(lock); | ||
| 147 | } | ||
| 148 | EXPORT_SYMBOL(_write_lock); | ||
| 149 | #endif | ||
| 150 | |||
| 151 | #else /* CONFIG_PREEMPT: */ | ||
| 152 | |||
| 153 | /* | 30 | /* | 
| 31 | * The __lock_function inlines are taken from | ||
| 32 | * include/linux/spinlock_api_smp.h | ||
| 33 | */ | ||
| 34 | #else | ||
| 35 | /* | ||
| 36 | * We build the __lock_function inlines here. They are too large for | ||
| 37 | * inlining all over the place, but here is only one user per function | ||
| 38 | * which embedds them into the calling _lock_function below. | ||
| 39 | * | ||
| 154 | * This could be a long-held lock. We both prepare to spin for a long | 40 | * This could be a long-held lock. We both prepare to spin for a long | 
| 155 | * time (making _this_ CPU preemptable if possible), and we also signal | 41 | * time (making _this_ CPU preemptable if possible), and we also signal | 
| 156 | * towards that other CPU that it should break the lock ASAP. | 42 | * towards that other CPU that it should break the lock ASAP. | 
| 157 | * | ||
| 158 | * (We do this in a function because inlining it would be excessive.) | ||
| 159 | */ | 43 | */ | 
| 160 | |||
| 161 | #define BUILD_LOCK_OPS(op, locktype) \ | 44 | #define BUILD_LOCK_OPS(op, locktype) \ | 
| 162 | void __lockfunc _##op##_lock(locktype##_t *lock) \ | 45 | void __lockfunc __##op##_lock(locktype##_t *lock) \ | 
| 163 | { \ | 46 | { \ | 
| 164 | for (;;) { \ | 47 | for (;;) { \ | 
| 165 | preempt_disable(); \ | 48 | preempt_disable(); \ | 
| @@ -175,9 +58,7 @@ void __lockfunc _##op##_lock(locktype##_t *lock) \ | |||
| 175 | (lock)->break_lock = 0; \ | 58 | (lock)->break_lock = 0; \ | 
| 176 | } \ | 59 | } \ | 
| 177 | \ | 60 | \ | 
| 178 | EXPORT_SYMBOL(_##op##_lock); \ | 61 | unsigned long __lockfunc __##op##_lock_irqsave(locktype##_t *lock) \ | 
| 179 | \ | ||
| 180 | unsigned long __lockfunc _##op##_lock_irqsave(locktype##_t *lock) \ | ||
| 181 | { \ | 62 | { \ | 
| 182 | unsigned long flags; \ | 63 | unsigned long flags; \ | 
| 183 | \ | 64 | \ | 
| @@ -198,16 +79,12 @@ unsigned long __lockfunc _##op##_lock_irqsave(locktype##_t *lock) \ | |||
| 198 | return flags; \ | 79 | return flags; \ | 
| 199 | } \ | 80 | } \ | 
| 200 | \ | 81 | \ | 
| 201 | EXPORT_SYMBOL(_##op##_lock_irqsave); \ | 82 | void __lockfunc __##op##_lock_irq(locktype##_t *lock) \ | 
| 202 | \ | ||
| 203 | void __lockfunc _##op##_lock_irq(locktype##_t *lock) \ | ||
| 204 | { \ | 83 | { \ | 
| 205 | _##op##_lock_irqsave(lock); \ | 84 | _##op##_lock_irqsave(lock); \ | 
| 206 | } \ | 85 | } \ | 
| 207 | \ | 86 | \ | 
| 208 | EXPORT_SYMBOL(_##op##_lock_irq); \ | 87 | void __lockfunc __##op##_lock_bh(locktype##_t *lock) \ | 
| 209 | \ | ||
| 210 | void __lockfunc _##op##_lock_bh(locktype##_t *lock) \ | ||
| 211 | { \ | 88 | { \ | 
| 212 | unsigned long flags; \ | 89 | unsigned long flags; \ | 
| 213 | \ | 90 | \ | 
| @@ -220,23 +97,21 @@ void __lockfunc _##op##_lock_bh(locktype##_t *lock) \ | |||
| 220 | local_bh_disable(); \ | 97 | local_bh_disable(); \ | 
| 221 | local_irq_restore(flags); \ | 98 | local_irq_restore(flags); \ | 
| 222 | } \ | 99 | } \ | 
| 223 | \ | ||
| 224 | EXPORT_SYMBOL(_##op##_lock_bh) | ||
| 225 | 100 | ||
| 226 | /* | 101 | /* | 
| 227 | * Build preemption-friendly versions of the following | 102 | * Build preemption-friendly versions of the following | 
| 228 | * lock-spinning functions: | 103 | * lock-spinning functions: | 
| 229 | * | 104 | * | 
| 230 | * _[spin|read|write]_lock() | 105 | * __[spin|read|write]_lock() | 
| 231 | * _[spin|read|write]_lock_irq() | 106 | * __[spin|read|write]_lock_irq() | 
| 232 | * _[spin|read|write]_lock_irqsave() | 107 | * __[spin|read|write]_lock_irqsave() | 
| 233 | * _[spin|read|write]_lock_bh() | 108 | * __[spin|read|write]_lock_bh() | 
| 234 | */ | 109 | */ | 
| 235 | BUILD_LOCK_OPS(spin, spinlock); | 110 | BUILD_LOCK_OPS(spin, spinlock); | 
| 236 | BUILD_LOCK_OPS(read, rwlock); | 111 | BUILD_LOCK_OPS(read, rwlock); | 
| 237 | BUILD_LOCK_OPS(write, rwlock); | 112 | BUILD_LOCK_OPS(write, rwlock); | 
| 238 | 113 | ||
| 239 | #endif /* CONFIG_PREEMPT */ | 114 | #endif | 
| 240 | 115 | ||
| 241 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 116 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 
| 242 | 117 | ||
| @@ -248,7 +123,8 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) | |||
| 248 | } | 123 | } | 
| 249 | EXPORT_SYMBOL(_spin_lock_nested); | 124 | EXPORT_SYMBOL(_spin_lock_nested); | 
| 250 | 125 | ||
| 251 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | 126 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, | 
| 127 | int subclass) | ||
| 252 | { | 128 | { | 
| 253 | unsigned long flags; | 129 | unsigned long flags; | 
| 254 | 130 | ||
| @@ -272,7 +148,127 @@ EXPORT_SYMBOL(_spin_lock_nest_lock); | |||
| 272 | 148 | ||
| 273 | #endif | 149 | #endif | 
| 274 | 150 | ||
| 275 | #ifndef _spin_unlock | 151 | #ifndef CONFIG_INLINE_SPIN_TRYLOCK | 
| 152 | int __lockfunc _spin_trylock(spinlock_t *lock) | ||
| 153 | { | ||
| 154 | return __spin_trylock(lock); | ||
| 155 | } | ||
| 156 | EXPORT_SYMBOL(_spin_trylock); | ||
| 157 | #endif | ||
| 158 | |||
| 159 | #ifndef CONFIG_INLINE_READ_TRYLOCK | ||
| 160 | int __lockfunc _read_trylock(rwlock_t *lock) | ||
| 161 | { | ||
| 162 | return __read_trylock(lock); | ||
| 163 | } | ||
| 164 | EXPORT_SYMBOL(_read_trylock); | ||
| 165 | #endif | ||
| 166 | |||
| 167 | #ifndef CONFIG_INLINE_WRITE_TRYLOCK | ||
| 168 | int __lockfunc _write_trylock(rwlock_t *lock) | ||
| 169 | { | ||
| 170 | return __write_trylock(lock); | ||
| 171 | } | ||
| 172 | EXPORT_SYMBOL(_write_trylock); | ||
| 173 | #endif | ||
| 174 | |||
| 175 | #ifndef CONFIG_INLINE_READ_LOCK | ||
| 176 | void __lockfunc _read_lock(rwlock_t *lock) | ||
| 177 | { | ||
| 178 | __read_lock(lock); | ||
| 179 | } | ||
| 180 | EXPORT_SYMBOL(_read_lock); | ||
| 181 | #endif | ||
| 182 | |||
| 183 | #ifndef CONFIG_INLINE_SPIN_LOCK_IRQSAVE | ||
| 184 | unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) | ||
| 185 | { | ||
| 186 | return __spin_lock_irqsave(lock); | ||
| 187 | } | ||
| 188 | EXPORT_SYMBOL(_spin_lock_irqsave); | ||
| 189 | #endif | ||
| 190 | |||
| 191 | #ifndef CONFIG_INLINE_SPIN_LOCK_IRQ | ||
| 192 | void __lockfunc _spin_lock_irq(spinlock_t *lock) | ||
| 193 | { | ||
| 194 | __spin_lock_irq(lock); | ||
| 195 | } | ||
| 196 | EXPORT_SYMBOL(_spin_lock_irq); | ||
| 197 | #endif | ||
| 198 | |||
| 199 | #ifndef CONFIG_INLINE_SPIN_LOCK_BH | ||
| 200 | void __lockfunc _spin_lock_bh(spinlock_t *lock) | ||
| 201 | { | ||
| 202 | __spin_lock_bh(lock); | ||
| 203 | } | ||
| 204 | EXPORT_SYMBOL(_spin_lock_bh); | ||
| 205 | #endif | ||
| 206 | |||
| 207 | #ifndef CONFIG_INLINE_READ_LOCK_IRQSAVE | ||
| 208 | unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) | ||
| 209 | { | ||
| 210 | return __read_lock_irqsave(lock); | ||
| 211 | } | ||
| 212 | EXPORT_SYMBOL(_read_lock_irqsave); | ||
| 213 | #endif | ||
| 214 | |||
| 215 | #ifndef CONFIG_INLINE_READ_LOCK_IRQ | ||
| 216 | void __lockfunc _read_lock_irq(rwlock_t *lock) | ||
| 217 | { | ||
| 218 | __read_lock_irq(lock); | ||
| 219 | } | ||
| 220 | EXPORT_SYMBOL(_read_lock_irq); | ||
| 221 | #endif | ||
| 222 | |||
| 223 | #ifndef CONFIG_INLINE_READ_LOCK_BH | ||
| 224 | void __lockfunc _read_lock_bh(rwlock_t *lock) | ||
| 225 | { | ||
| 226 | __read_lock_bh(lock); | ||
| 227 | } | ||
| 228 | EXPORT_SYMBOL(_read_lock_bh); | ||
| 229 | #endif | ||
| 230 | |||
| 231 | #ifndef CONFIG_INLINE_WRITE_LOCK_IRQSAVE | ||
| 232 | unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) | ||
| 233 | { | ||
| 234 | return __write_lock_irqsave(lock); | ||
| 235 | } | ||
| 236 | EXPORT_SYMBOL(_write_lock_irqsave); | ||
| 237 | #endif | ||
| 238 | |||
| 239 | #ifndef CONFIG_INLINE_WRITE_LOCK_IRQ | ||
| 240 | void __lockfunc _write_lock_irq(rwlock_t *lock) | ||
| 241 | { | ||
| 242 | __write_lock_irq(lock); | ||
| 243 | } | ||
| 244 | EXPORT_SYMBOL(_write_lock_irq); | ||
| 245 | #endif | ||
| 246 | |||
| 247 | #ifndef CONFIG_INLINE_WRITE_LOCK_BH | ||
| 248 | void __lockfunc _write_lock_bh(rwlock_t *lock) | ||
| 249 | { | ||
| 250 | __write_lock_bh(lock); | ||
| 251 | } | ||
| 252 | EXPORT_SYMBOL(_write_lock_bh); | ||
| 253 | #endif | ||
| 254 | |||
| 255 | #ifndef CONFIG_INLINE_SPIN_LOCK | ||
| 256 | void __lockfunc _spin_lock(spinlock_t *lock) | ||
| 257 | { | ||
| 258 | __spin_lock(lock); | ||
| 259 | } | ||
| 260 | EXPORT_SYMBOL(_spin_lock); | ||
| 261 | #endif | ||
| 262 | |||
| 263 | #ifndef CONFIG_INLINE_WRITE_LOCK | ||
| 264 | void __lockfunc _write_lock(rwlock_t *lock) | ||
| 265 | { | ||
| 266 | __write_lock(lock); | ||
| 267 | } | ||
| 268 | EXPORT_SYMBOL(_write_lock); | ||
| 269 | #endif | ||
| 270 | |||
| 271 | #ifndef CONFIG_INLINE_SPIN_UNLOCK | ||
| 276 | void __lockfunc _spin_unlock(spinlock_t *lock) | 272 | void __lockfunc _spin_unlock(spinlock_t *lock) | 
| 277 | { | 273 | { | 
| 278 | __spin_unlock(lock); | 274 | __spin_unlock(lock); | 
| @@ -280,7 +276,7 @@ void __lockfunc _spin_unlock(spinlock_t *lock) | |||
| 280 | EXPORT_SYMBOL(_spin_unlock); | 276 | EXPORT_SYMBOL(_spin_unlock); | 
| 281 | #endif | 277 | #endif | 
| 282 | 278 | ||
| 283 | #ifndef _write_unlock | 279 | #ifndef CONFIG_INLINE_WRITE_UNLOCK | 
| 284 | void __lockfunc _write_unlock(rwlock_t *lock) | 280 | void __lockfunc _write_unlock(rwlock_t *lock) | 
| 285 | { | 281 | { | 
| 286 | __write_unlock(lock); | 282 | __write_unlock(lock); | 
| @@ -288,7 +284,7 @@ void __lockfunc _write_unlock(rwlock_t *lock) | |||
| 288 | EXPORT_SYMBOL(_write_unlock); | 284 | EXPORT_SYMBOL(_write_unlock); | 
| 289 | #endif | 285 | #endif | 
| 290 | 286 | ||
| 291 | #ifndef _read_unlock | 287 | #ifndef CONFIG_INLINE_READ_UNLOCK | 
| 292 | void __lockfunc _read_unlock(rwlock_t *lock) | 288 | void __lockfunc _read_unlock(rwlock_t *lock) | 
| 293 | { | 289 | { | 
| 294 | __read_unlock(lock); | 290 | __read_unlock(lock); | 
| @@ -296,7 +292,7 @@ void __lockfunc _read_unlock(rwlock_t *lock) | |||
| 296 | EXPORT_SYMBOL(_read_unlock); | 292 | EXPORT_SYMBOL(_read_unlock); | 
| 297 | #endif | 293 | #endif | 
| 298 | 294 | ||
| 299 | #ifndef _spin_unlock_irqrestore | 295 | #ifndef CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE | 
| 300 | void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | 296 | void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | 
| 301 | { | 297 | { | 
| 302 | __spin_unlock_irqrestore(lock, flags); | 298 | __spin_unlock_irqrestore(lock, flags); | 
| @@ -304,7 +300,7 @@ void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) | |||
| 304 | EXPORT_SYMBOL(_spin_unlock_irqrestore); | 300 | EXPORT_SYMBOL(_spin_unlock_irqrestore); | 
| 305 | #endif | 301 | #endif | 
| 306 | 302 | ||
| 307 | #ifndef _spin_unlock_irq | 303 | #ifndef CONFIG_INLINE_SPIN_UNLOCK_IRQ | 
| 308 | void __lockfunc _spin_unlock_irq(spinlock_t *lock) | 304 | void __lockfunc _spin_unlock_irq(spinlock_t *lock) | 
| 309 | { | 305 | { | 
| 310 | __spin_unlock_irq(lock); | 306 | __spin_unlock_irq(lock); | 
| @@ -312,7 +308,7 @@ void __lockfunc _spin_unlock_irq(spinlock_t *lock) | |||
| 312 | EXPORT_SYMBOL(_spin_unlock_irq); | 308 | EXPORT_SYMBOL(_spin_unlock_irq); | 
| 313 | #endif | 309 | #endif | 
| 314 | 310 | ||
| 315 | #ifndef _spin_unlock_bh | 311 | #ifndef CONFIG_INLINE_SPIN_UNLOCK_BH | 
| 316 | void __lockfunc _spin_unlock_bh(spinlock_t *lock) | 312 | void __lockfunc _spin_unlock_bh(spinlock_t *lock) | 
| 317 | { | 313 | { | 
| 318 | __spin_unlock_bh(lock); | 314 | __spin_unlock_bh(lock); | 
| @@ -320,7 +316,7 @@ void __lockfunc _spin_unlock_bh(spinlock_t *lock) | |||
| 320 | EXPORT_SYMBOL(_spin_unlock_bh); | 316 | EXPORT_SYMBOL(_spin_unlock_bh); | 
| 321 | #endif | 317 | #endif | 
| 322 | 318 | ||
| 323 | #ifndef _read_unlock_irqrestore | 319 | #ifndef CONFIG_INLINE_READ_UNLOCK_IRQRESTORE | 
| 324 | void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags) | 320 | void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags) | 
| 325 | { | 321 | { | 
| 326 | __read_unlock_irqrestore(lock, flags); | 322 | __read_unlock_irqrestore(lock, flags); | 
| @@ -328,7 +324,7 @@ void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags) | |||
| 328 | EXPORT_SYMBOL(_read_unlock_irqrestore); | 324 | EXPORT_SYMBOL(_read_unlock_irqrestore); | 
| 329 | #endif | 325 | #endif | 
| 330 | 326 | ||
| 331 | #ifndef _read_unlock_irq | 327 | #ifndef CONFIG_INLINE_READ_UNLOCK_IRQ | 
| 332 | void __lockfunc _read_unlock_irq(rwlock_t *lock) | 328 | void __lockfunc _read_unlock_irq(rwlock_t *lock) | 
| 333 | { | 329 | { | 
| 334 | __read_unlock_irq(lock); | 330 | __read_unlock_irq(lock); | 
| @@ -336,7 +332,7 @@ void __lockfunc _read_unlock_irq(rwlock_t *lock) | |||
| 336 | EXPORT_SYMBOL(_read_unlock_irq); | 332 | EXPORT_SYMBOL(_read_unlock_irq); | 
| 337 | #endif | 333 | #endif | 
| 338 | 334 | ||
| 339 | #ifndef _read_unlock_bh | 335 | #ifndef CONFIG_INLINE_READ_UNLOCK_BH | 
| 340 | void __lockfunc _read_unlock_bh(rwlock_t *lock) | 336 | void __lockfunc _read_unlock_bh(rwlock_t *lock) | 
| 341 | { | 337 | { | 
| 342 | __read_unlock_bh(lock); | 338 | __read_unlock_bh(lock); | 
| @@ -344,7 +340,7 @@ void __lockfunc _read_unlock_bh(rwlock_t *lock) | |||
| 344 | EXPORT_SYMBOL(_read_unlock_bh); | 340 | EXPORT_SYMBOL(_read_unlock_bh); | 
| 345 | #endif | 341 | #endif | 
| 346 | 342 | ||
| 347 | #ifndef _write_unlock_irqrestore | 343 | #ifndef CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE | 
| 348 | void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags) | 344 | void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags) | 
| 349 | { | 345 | { | 
| 350 | __write_unlock_irqrestore(lock, flags); | 346 | __write_unlock_irqrestore(lock, flags); | 
| @@ -352,7 +348,7 @@ void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags) | |||
| 352 | EXPORT_SYMBOL(_write_unlock_irqrestore); | 348 | EXPORT_SYMBOL(_write_unlock_irqrestore); | 
| 353 | #endif | 349 | #endif | 
| 354 | 350 | ||
| 355 | #ifndef _write_unlock_irq | 351 | #ifndef CONFIG_INLINE_WRITE_UNLOCK_IRQ | 
| 356 | void __lockfunc _write_unlock_irq(rwlock_t *lock) | 352 | void __lockfunc _write_unlock_irq(rwlock_t *lock) | 
| 357 | { | 353 | { | 
| 358 | __write_unlock_irq(lock); | 354 | __write_unlock_irq(lock); | 
| @@ -360,7 +356,7 @@ void __lockfunc _write_unlock_irq(rwlock_t *lock) | |||
| 360 | EXPORT_SYMBOL(_write_unlock_irq); | 356 | EXPORT_SYMBOL(_write_unlock_irq); | 
| 361 | #endif | 357 | #endif | 
| 362 | 358 | ||
| 363 | #ifndef _write_unlock_bh | 359 | #ifndef CONFIG_INLINE_WRITE_UNLOCK_BH | 
| 364 | void __lockfunc _write_unlock_bh(rwlock_t *lock) | 360 | void __lockfunc _write_unlock_bh(rwlock_t *lock) | 
| 365 | { | 361 | { | 
| 366 | __write_unlock_bh(lock); | 362 | __write_unlock_bh(lock); | 
| @@ -368,7 +364,7 @@ void __lockfunc _write_unlock_bh(rwlock_t *lock) | |||
| 368 | EXPORT_SYMBOL(_write_unlock_bh); | 364 | EXPORT_SYMBOL(_write_unlock_bh); | 
| 369 | #endif | 365 | #endif | 
| 370 | 366 | ||
| 371 | #ifndef _spin_trylock_bh | 367 | #ifndef CONFIG_INLINE_SPIN_TRYLOCK_BH | 
| 372 | int __lockfunc _spin_trylock_bh(spinlock_t *lock) | 368 | int __lockfunc _spin_trylock_bh(spinlock_t *lock) | 
| 373 | { | 369 | { | 
| 374 | return __spin_trylock_bh(lock); | 370 | return __spin_trylock_bh(lock); | 
| diff --git a/kernel/srcu.c b/kernel/srcu.c index b0aeeaf22ce4..818d7d9aa03c 100644 --- a/kernel/srcu.c +++ b/kernel/srcu.c | |||
| @@ -49,6 +49,7 @@ int init_srcu_struct(struct srcu_struct *sp) | |||
| 49 | sp->per_cpu_ref = alloc_percpu(struct srcu_struct_array); | 49 | sp->per_cpu_ref = alloc_percpu(struct srcu_struct_array); | 
| 50 | return (sp->per_cpu_ref ? 0 : -ENOMEM); | 50 | return (sp->per_cpu_ref ? 0 : -ENOMEM); | 
| 51 | } | 51 | } | 
| 52 | EXPORT_SYMBOL_GPL(init_srcu_struct); | ||
| 52 | 53 | ||
| 53 | /* | 54 | /* | 
| 54 | * srcu_readers_active_idx -- returns approximate number of readers | 55 | * srcu_readers_active_idx -- returns approximate number of readers | 
| @@ -97,6 +98,7 @@ void cleanup_srcu_struct(struct srcu_struct *sp) | |||
| 97 | free_percpu(sp->per_cpu_ref); | 98 | free_percpu(sp->per_cpu_ref); | 
| 98 | sp->per_cpu_ref = NULL; | 99 | sp->per_cpu_ref = NULL; | 
| 99 | } | 100 | } | 
| 101 | EXPORT_SYMBOL_GPL(cleanup_srcu_struct); | ||
| 100 | 102 | ||
| 101 | /** | 103 | /** | 
| 102 | * srcu_read_lock - register a new reader for an SRCU-protected structure. | 104 | * srcu_read_lock - register a new reader for an SRCU-protected structure. | 
| @@ -118,6 +120,7 @@ int srcu_read_lock(struct srcu_struct *sp) | |||
| 118 | preempt_enable(); | 120 | preempt_enable(); | 
| 119 | return idx; | 121 | return idx; | 
| 120 | } | 122 | } | 
| 123 | EXPORT_SYMBOL_GPL(srcu_read_lock); | ||
| 121 | 124 | ||
| 122 | /** | 125 | /** | 
| 123 | * srcu_read_unlock - unregister a old reader from an SRCU-protected structure. | 126 | * srcu_read_unlock - unregister a old reader from an SRCU-protected structure. | 
| @@ -136,22 +139,12 @@ void srcu_read_unlock(struct srcu_struct *sp, int idx) | |||
| 136 | per_cpu_ptr(sp->per_cpu_ref, smp_processor_id())->c[idx]--; | 139 | per_cpu_ptr(sp->per_cpu_ref, smp_processor_id())->c[idx]--; | 
| 137 | preempt_enable(); | 140 | preempt_enable(); | 
| 138 | } | 141 | } | 
| 142 | EXPORT_SYMBOL_GPL(srcu_read_unlock); | ||
| 139 | 143 | ||
| 140 | /** | 144 | /* | 
| 141 | * synchronize_srcu - wait for prior SRCU read-side critical-section completion | 145 | * Helper function for synchronize_srcu() and synchronize_srcu_expedited(). | 
| 142 | * @sp: srcu_struct with which to synchronize. | ||
| 143 | * | ||
| 144 | * Flip the completed counter, and wait for the old count to drain to zero. | ||
| 145 | * As with classic RCU, the updater must use some separate means of | ||
| 146 | * synchronizing concurrent updates. Can block; must be called from | ||
| 147 | * process context. | ||
| 148 | * | ||
| 149 | * Note that it is illegal to call synchornize_srcu() from the corresponding | ||
| 150 | * SRCU read-side critical section; doing so will result in deadlock. | ||
| 151 | * However, it is perfectly legal to call synchronize_srcu() on one | ||
| 152 | * srcu_struct from some other srcu_struct's read-side critical section. | ||
| 153 | */ | 146 | */ | 
| 154 | void synchronize_srcu(struct srcu_struct *sp) | 147 | void __synchronize_srcu(struct srcu_struct *sp, void (*sync_func)(void)) | 
| 155 | { | 148 | { | 
| 156 | int idx; | 149 | int idx; | 
| 157 | 150 | ||
| @@ -173,7 +166,7 @@ void synchronize_srcu(struct srcu_struct *sp) | |||
| 173 | return; | 166 | return; | 
| 174 | } | 167 | } | 
| 175 | 168 | ||
| 176 | synchronize_sched(); /* Force memory barrier on all CPUs. */ | 169 | sync_func(); /* Force memory barrier on all CPUs. */ | 
| 177 | 170 | ||
| 178 | /* | 171 | /* | 
| 179 | * The preceding synchronize_sched() ensures that any CPU that | 172 | * The preceding synchronize_sched() ensures that any CPU that | 
| @@ -190,7 +183,7 @@ void synchronize_srcu(struct srcu_struct *sp) | |||
| 190 | idx = sp->completed & 0x1; | 183 | idx = sp->completed & 0x1; | 
| 191 | sp->completed++; | 184 | sp->completed++; | 
| 192 | 185 | ||
| 193 | synchronize_sched(); /* Force memory barrier on all CPUs. */ | 186 | sync_func(); /* Force memory barrier on all CPUs. */ | 
| 194 | 187 | ||
| 195 | /* | 188 | /* | 
| 196 | * At this point, because of the preceding synchronize_sched(), | 189 | * At this point, because of the preceding synchronize_sched(), | 
| @@ -203,7 +196,7 @@ void synchronize_srcu(struct srcu_struct *sp) | |||
| 203 | while (srcu_readers_active_idx(sp, idx)) | 196 | while (srcu_readers_active_idx(sp, idx)) | 
| 204 | schedule_timeout_interruptible(1); | 197 | schedule_timeout_interruptible(1); | 
| 205 | 198 | ||
| 206 | synchronize_sched(); /* Force memory barrier on all CPUs. */ | 199 | sync_func(); /* Force memory barrier on all CPUs. */ | 
| 207 | 200 | ||
| 208 | /* | 201 | /* | 
| 209 | * The preceding synchronize_sched() forces all srcu_read_unlock() | 202 | * The preceding synchronize_sched() forces all srcu_read_unlock() | 
| @@ -237,6 +230,47 @@ void synchronize_srcu(struct srcu_struct *sp) | |||
| 237 | } | 230 | } | 
| 238 | 231 | ||
| 239 | /** | 232 | /** | 
| 233 | * synchronize_srcu - wait for prior SRCU read-side critical-section completion | ||
| 234 | * @sp: srcu_struct with which to synchronize. | ||
| 235 | * | ||
| 236 | * Flip the completed counter, and wait for the old count to drain to zero. | ||
| 237 | * As with classic RCU, the updater must use some separate means of | ||
| 238 | * synchronizing concurrent updates. Can block; must be called from | ||
| 239 | * process context. | ||
| 240 | * | ||
| 241 | * Note that it is illegal to call synchronize_srcu() from the corresponding | ||
| 242 | * SRCU read-side critical section; doing so will result in deadlock. | ||
| 243 | * However, it is perfectly legal to call synchronize_srcu() on one | ||
| 244 | * srcu_struct from some other srcu_struct's read-side critical section. | ||
| 245 | */ | ||
| 246 | void synchronize_srcu(struct srcu_struct *sp) | ||
| 247 | { | ||
| 248 | __synchronize_srcu(sp, synchronize_sched); | ||
| 249 | } | ||
| 250 | EXPORT_SYMBOL_GPL(synchronize_srcu); | ||
| 251 | |||
| 252 | /** | ||
| 253 | * synchronize_srcu_expedited - like synchronize_srcu, but less patient | ||
| 254 | * @sp: srcu_struct with which to synchronize. | ||
| 255 | * | ||
| 256 | * Flip the completed counter, and wait for the old count to drain to zero. | ||
| 257 | * As with classic RCU, the updater must use some separate means of | ||
| 258 | * synchronizing concurrent updates. Can block; must be called from | ||
| 259 | * process context. | ||
| 260 | * | ||
| 261 | * Note that it is illegal to call synchronize_srcu_expedited() | ||
| 262 | * from the corresponding SRCU read-side critical section; doing so | ||
| 263 | * will result in deadlock. However, it is perfectly legal to call | ||
| 264 | * synchronize_srcu_expedited() on one srcu_struct from some other | ||
| 265 | * srcu_struct's read-side critical section. | ||
| 266 | */ | ||
| 267 | void synchronize_srcu_expedited(struct srcu_struct *sp) | ||
| 268 | { | ||
| 269 | __synchronize_srcu(sp, synchronize_sched_expedited); | ||
| 270 | } | ||
| 271 | EXPORT_SYMBOL_GPL(synchronize_srcu_expedited); | ||
| 272 | |||
| 273 | /** | ||
| 240 | * srcu_batches_completed - return batches completed. | 274 | * srcu_batches_completed - return batches completed. | 
| 241 | * @sp: srcu_struct on which to report batch completion. | 275 | * @sp: srcu_struct on which to report batch completion. | 
| 242 | * | 276 | * | 
| @@ -248,10 +282,4 @@ long srcu_batches_completed(struct srcu_struct *sp) | |||
| 248 | { | 282 | { | 
| 249 | return sp->completed; | 283 | return sp->completed; | 
| 250 | } | 284 | } | 
| 251 | |||
| 252 | EXPORT_SYMBOL_GPL(init_srcu_struct); | ||
| 253 | EXPORT_SYMBOL_GPL(cleanup_srcu_struct); | ||
| 254 | EXPORT_SYMBOL_GPL(srcu_read_lock); | ||
| 255 | EXPORT_SYMBOL_GPL(srcu_read_unlock); | ||
| 256 | EXPORT_SYMBOL_GPL(synchronize_srcu); | ||
| 257 | EXPORT_SYMBOL_GPL(srcu_batches_completed); | 285 | EXPORT_SYMBOL_GPL(srcu_batches_completed); | 
| diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 0d949c517412..4dbf93a52ee9 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/sysrq.h> | 36 | #include <linux/sysrq.h> | 
| 37 | #include <linux/highuid.h> | 37 | #include <linux/highuid.h> | 
| 38 | #include <linux/writeback.h> | 38 | #include <linux/writeback.h> | 
| 39 | #include <linux/ratelimit.h> | ||
| 39 | #include <linux/hugetlb.h> | 40 | #include <linux/hugetlb.h> | 
| 40 | #include <linux/initrd.h> | 41 | #include <linux/initrd.h> | 
| 41 | #include <linux/key.h> | 42 | #include <linux/key.h> | 
| @@ -158,6 +159,8 @@ extern int no_unaligned_warning; | |||
| 158 | extern int unaligned_dump_stack; | 159 | extern int unaligned_dump_stack; | 
| 159 | #endif | 160 | #endif | 
| 160 | 161 | ||
| 162 | extern struct ratelimit_state printk_ratelimit_state; | ||
| 163 | |||
| 161 | #ifdef CONFIG_RT_MUTEXES | 164 | #ifdef CONFIG_RT_MUTEXES | 
| 162 | extern int max_lock_depth; | 165 | extern int max_lock_depth; | 
| 163 | #endif | 166 | #endif | 
| diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 6dc4e5ef7a01..e51a1bcb7bed 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -60,6 +60,13 @@ static int last_ftrace_enabled; | |||
| 60 | /* Quick disabling of function tracer. */ | 60 | /* Quick disabling of function tracer. */ | 
| 61 | int function_trace_stop; | 61 | int function_trace_stop; | 
| 62 | 62 | ||
| 63 | /* List for set_ftrace_pid's pids. */ | ||
| 64 | LIST_HEAD(ftrace_pids); | ||
| 65 | struct ftrace_pid { | ||
| 66 | struct list_head list; | ||
| 67 | struct pid *pid; | ||
| 68 | }; | ||
| 69 | |||
| 63 | /* | 70 | /* | 
| 64 | * ftrace_disabled is set when an anomaly is discovered. | 71 | * ftrace_disabled is set when an anomaly is discovered. | 
| 65 | * ftrace_disabled is much stronger than ftrace_enabled. | 72 | * ftrace_disabled is much stronger than ftrace_enabled. | 
| @@ -78,6 +85,10 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub; | |||
| 78 | ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub; | 85 | ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub; | 
| 79 | ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub; | 86 | ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub; | 
| 80 | 87 | ||
| 88 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 89 | static int ftrace_set_func(unsigned long *array, int *idx, char *buffer); | ||
| 90 | #endif | ||
| 91 | |||
| 81 | static void ftrace_list_func(unsigned long ip, unsigned long parent_ip) | 92 | static void ftrace_list_func(unsigned long ip, unsigned long parent_ip) | 
| 82 | { | 93 | { | 
| 83 | struct ftrace_ops *op = ftrace_list; | 94 | struct ftrace_ops *op = ftrace_list; | 
| @@ -155,7 +166,7 @@ static int __register_ftrace_function(struct ftrace_ops *ops) | |||
| 155 | else | 166 | else | 
| 156 | func = ftrace_list_func; | 167 | func = ftrace_list_func; | 
| 157 | 168 | ||
| 158 | if (ftrace_pid_trace) { | 169 | if (!list_empty(&ftrace_pids)) { | 
| 159 | set_ftrace_pid_function(func); | 170 | set_ftrace_pid_function(func); | 
| 160 | func = ftrace_pid_func; | 171 | func = ftrace_pid_func; | 
| 161 | } | 172 | } | 
| @@ -203,7 +214,7 @@ static int __unregister_ftrace_function(struct ftrace_ops *ops) | |||
| 203 | if (ftrace_list->next == &ftrace_list_end) { | 214 | if (ftrace_list->next == &ftrace_list_end) { | 
| 204 | ftrace_func_t func = ftrace_list->func; | 215 | ftrace_func_t func = ftrace_list->func; | 
| 205 | 216 | ||
| 206 | if (ftrace_pid_trace) { | 217 | if (!list_empty(&ftrace_pids)) { | 
| 207 | set_ftrace_pid_function(func); | 218 | set_ftrace_pid_function(func); | 
| 208 | func = ftrace_pid_func; | 219 | func = ftrace_pid_func; | 
| 209 | } | 220 | } | 
| @@ -231,7 +242,7 @@ static void ftrace_update_pid_func(void) | |||
| 231 | func = __ftrace_trace_function; | 242 | func = __ftrace_trace_function; | 
| 232 | #endif | 243 | #endif | 
| 233 | 244 | ||
| 234 | if (ftrace_pid_trace) { | 245 | if (!list_empty(&ftrace_pids)) { | 
| 235 | set_ftrace_pid_function(func); | 246 | set_ftrace_pid_function(func); | 
| 236 | func = ftrace_pid_func; | 247 | func = ftrace_pid_func; | 
| 237 | } else { | 248 | } else { | 
| @@ -821,8 +832,6 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer) | |||
| 821 | } | 832 | } | 
| 822 | #endif /* CONFIG_FUNCTION_PROFILER */ | 833 | #endif /* CONFIG_FUNCTION_PROFILER */ | 
| 823 | 834 | ||
| 824 | /* set when tracing only a pid */ | ||
| 825 | struct pid *ftrace_pid_trace; | ||
| 826 | static struct pid * const ftrace_swapper_pid = &init_struct_pid; | 835 | static struct pid * const ftrace_swapper_pid = &init_struct_pid; | 
| 827 | 836 | ||
| 828 | #ifdef CONFIG_DYNAMIC_FTRACE | 837 | #ifdef CONFIG_DYNAMIC_FTRACE | 
| @@ -1261,12 +1270,34 @@ static int ftrace_update_code(struct module *mod) | |||
| 1261 | ftrace_new_addrs = p->newlist; | 1270 | ftrace_new_addrs = p->newlist; | 
| 1262 | p->flags = 0L; | 1271 | p->flags = 0L; | 
| 1263 | 1272 | ||
| 1264 | /* convert record (i.e, patch mcount-call with NOP) */ | 1273 | /* | 
| 1265 | if (ftrace_code_disable(mod, p)) { | 1274 | * Do the initial record convertion from mcount jump | 
| 1266 | p->flags |= FTRACE_FL_CONVERTED; | 1275 | * to the NOP instructions. | 
| 1267 | ftrace_update_cnt++; | 1276 | */ | 
| 1268 | } else | 1277 | if (!ftrace_code_disable(mod, p)) { | 
| 1269 | ftrace_free_rec(p); | 1278 | ftrace_free_rec(p); | 
| 1279 | continue; | ||
| 1280 | } | ||
| 1281 | |||
| 1282 | p->flags |= FTRACE_FL_CONVERTED; | ||
| 1283 | ftrace_update_cnt++; | ||
| 1284 | |||
| 1285 | /* | ||
| 1286 | * If the tracing is enabled, go ahead and enable the record. | ||
| 1287 | * | ||
| 1288 | * The reason not to enable the record immediatelly is the | ||
| 1289 | * inherent check of ftrace_make_nop/ftrace_make_call for | ||
| 1290 | * correct previous instructions. Making first the NOP | ||
| 1291 | * conversion puts the module to the correct state, thus | ||
| 1292 | * passing the ftrace_make_call check. | ||
| 1293 | */ | ||
| 1294 | if (ftrace_start_up) { | ||
| 1295 | int failed = __ftrace_replace_code(p, 1); | ||
| 1296 | if (failed) { | ||
| 1297 | ftrace_bug(failed, p->ip); | ||
| 1298 | ftrace_free_rec(p); | ||
| 1299 | } | ||
| 1300 | } | ||
| 1270 | } | 1301 | } | 
| 1271 | 1302 | ||
| 1272 | stop = ftrace_now(raw_smp_processor_id()); | 1303 | stop = ftrace_now(raw_smp_processor_id()); | 
| @@ -1656,60 +1687,6 @@ ftrace_regex_lseek(struct file *file, loff_t offset, int origin) | |||
| 1656 | return ret; | 1687 | return ret; | 
| 1657 | } | 1688 | } | 
| 1658 | 1689 | ||
| 1659 | enum { | ||
| 1660 | MATCH_FULL, | ||
| 1661 | MATCH_FRONT_ONLY, | ||
| 1662 | MATCH_MIDDLE_ONLY, | ||
| 1663 | MATCH_END_ONLY, | ||
| 1664 | }; | ||
| 1665 | |||
| 1666 | /* | ||
| 1667 | * (static function - no need for kernel doc) | ||
| 1668 | * | ||
| 1669 | * Pass in a buffer containing a glob and this function will | ||
| 1670 | * set search to point to the search part of the buffer and | ||
| 1671 | * return the type of search it is (see enum above). | ||
| 1672 | * This does modify buff. | ||
| 1673 | * | ||
| 1674 | * Returns enum type. | ||
| 1675 | * search returns the pointer to use for comparison. | ||
| 1676 | * not returns 1 if buff started with a '!' | ||
| 1677 | * 0 otherwise. | ||
| 1678 | */ | ||
| 1679 | static int | ||
| 1680 | ftrace_setup_glob(char *buff, int len, char **search, int *not) | ||
| 1681 | { | ||
| 1682 | int type = MATCH_FULL; | ||
| 1683 | int i; | ||
| 1684 | |||
| 1685 | if (buff[0] == '!') { | ||
| 1686 | *not = 1; | ||
| 1687 | buff++; | ||
| 1688 | len--; | ||
| 1689 | } else | ||
| 1690 | *not = 0; | ||
| 1691 | |||
| 1692 | *search = buff; | ||
| 1693 | |||
| 1694 | for (i = 0; i < len; i++) { | ||
| 1695 | if (buff[i] == '*') { | ||
| 1696 | if (!i) { | ||
| 1697 | *search = buff + 1; | ||
| 1698 | type = MATCH_END_ONLY; | ||
| 1699 | } else { | ||
| 1700 | if (type == MATCH_END_ONLY) | ||
| 1701 | type = MATCH_MIDDLE_ONLY; | ||
| 1702 | else | ||
| 1703 | type = MATCH_FRONT_ONLY; | ||
| 1704 | buff[i] = 0; | ||
| 1705 | break; | ||
| 1706 | } | ||
| 1707 | } | ||
| 1708 | } | ||
| 1709 | |||
| 1710 | return type; | ||
| 1711 | } | ||
| 1712 | |||
| 1713 | static int ftrace_match(char *str, char *regex, int len, int type) | 1690 | static int ftrace_match(char *str, char *regex, int len, int type) | 
| 1714 | { | 1691 | { | 
| 1715 | int matched = 0; | 1692 | int matched = 0; | 
| @@ -1758,7 +1735,7 @@ static void ftrace_match_records(char *buff, int len, int enable) | |||
| 1758 | int not; | 1735 | int not; | 
| 1759 | 1736 | ||
| 1760 | flag = enable ? FTRACE_FL_FILTER : FTRACE_FL_NOTRACE; | 1737 | flag = enable ? FTRACE_FL_FILTER : FTRACE_FL_NOTRACE; | 
| 1761 | type = ftrace_setup_glob(buff, len, &search, ¬); | 1738 | type = filter_parse_regex(buff, len, &search, ¬); | 
| 1762 | 1739 | ||
| 1763 | search_len = strlen(search); | 1740 | search_len = strlen(search); | 
| 1764 | 1741 | ||
| @@ -1826,7 +1803,7 @@ static void ftrace_match_module_records(char *buff, char *mod, int enable) | |||
| 1826 | } | 1803 | } | 
| 1827 | 1804 | ||
| 1828 | if (strlen(buff)) { | 1805 | if (strlen(buff)) { | 
| 1829 | type = ftrace_setup_glob(buff, strlen(buff), &search, ¬); | 1806 | type = filter_parse_regex(buff, strlen(buff), &search, ¬); | 
| 1830 | search_len = strlen(search); | 1807 | search_len = strlen(search); | 
| 1831 | } | 1808 | } | 
| 1832 | 1809 | ||
| @@ -1991,7 +1968,7 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | |||
| 1991 | int count = 0; | 1968 | int count = 0; | 
| 1992 | char *search; | 1969 | char *search; | 
| 1993 | 1970 | ||
| 1994 | type = ftrace_setup_glob(glob, strlen(glob), &search, ¬); | 1971 | type = filter_parse_regex(glob, strlen(glob), &search, ¬); | 
| 1995 | len = strlen(search); | 1972 | len = strlen(search); | 
| 1996 | 1973 | ||
| 1997 | /* we do not support '!' for function probes */ | 1974 | /* we do not support '!' for function probes */ | 
| @@ -2068,7 +2045,7 @@ __unregister_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | |||
| 2068 | else if (glob) { | 2045 | else if (glob) { | 
| 2069 | int not; | 2046 | int not; | 
| 2070 | 2047 | ||
| 2071 | type = ftrace_setup_glob(glob, strlen(glob), &search, ¬); | 2048 | type = filter_parse_regex(glob, strlen(glob), &search, ¬); | 
| 2072 | len = strlen(search); | 2049 | len = strlen(search); | 
| 2073 | 2050 | ||
| 2074 | /* we do not support '!' for function probes */ | 2051 | /* we do not support '!' for function probes */ | 
| @@ -2312,6 +2289,32 @@ static int __init set_ftrace_filter(char *str) | |||
| 2312 | } | 2289 | } | 
| 2313 | __setup("ftrace_filter=", set_ftrace_filter); | 2290 | __setup("ftrace_filter=", set_ftrace_filter); | 
| 2314 | 2291 | ||
| 2292 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 2293 | static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata; | ||
| 2294 | static int __init set_graph_function(char *str) | ||
| 2295 | { | ||
| 2296 | strlcpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE); | ||
| 2297 | return 1; | ||
| 2298 | } | ||
| 2299 | __setup("ftrace_graph_filter=", set_graph_function); | ||
| 2300 | |||
| 2301 | static void __init set_ftrace_early_graph(char *buf) | ||
| 2302 | { | ||
| 2303 | int ret; | ||
| 2304 | char *func; | ||
| 2305 | |||
| 2306 | while (buf) { | ||
| 2307 | func = strsep(&buf, ","); | ||
| 2308 | /* we allow only one expression at a time */ | ||
| 2309 | ret = ftrace_set_func(ftrace_graph_funcs, &ftrace_graph_count, | ||
| 2310 | func); | ||
| 2311 | if (ret) | ||
| 2312 | printk(KERN_DEBUG "ftrace: function %s not " | ||
| 2313 | "traceable\n", func); | ||
| 2314 | } | ||
| 2315 | } | ||
| 2316 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | ||
| 2317 | |||
| 2315 | static void __init set_ftrace_early_filter(char *buf, int enable) | 2318 | static void __init set_ftrace_early_filter(char *buf, int enable) | 
| 2316 | { | 2319 | { | 
| 2317 | char *func; | 2320 | char *func; | 
| @@ -2328,6 +2331,10 @@ static void __init set_ftrace_early_filters(void) | |||
| 2328 | set_ftrace_early_filter(ftrace_filter_buf, 1); | 2331 | set_ftrace_early_filter(ftrace_filter_buf, 1); | 
| 2329 | if (ftrace_notrace_buf[0]) | 2332 | if (ftrace_notrace_buf[0]) | 
| 2330 | set_ftrace_early_filter(ftrace_notrace_buf, 0); | 2333 | set_ftrace_early_filter(ftrace_notrace_buf, 0); | 
| 2334 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 2335 | if (ftrace_graph_buf[0]) | ||
| 2336 | set_ftrace_early_graph(ftrace_graph_buf); | ||
| 2337 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | ||
| 2331 | } | 2338 | } | 
| 2332 | 2339 | ||
| 2333 | static int | 2340 | static int | 
| @@ -2513,7 +2520,7 @@ ftrace_set_func(unsigned long *array, int *idx, char *buffer) | |||
| 2513 | return -ENODEV; | 2520 | return -ENODEV; | 
| 2514 | 2521 | ||
| 2515 | /* decode regex */ | 2522 | /* decode regex */ | 
| 2516 | type = ftrace_setup_glob(buffer, strlen(buffer), &search, ¬); | 2523 | type = filter_parse_regex(buffer, strlen(buffer), &search, ¬); | 
| 2517 | if (not) | 2524 | if (not) | 
| 2518 | return -EINVAL; | 2525 | return -EINVAL; | 
| 2519 | 2526 | ||
| @@ -2624,7 +2631,7 @@ static __init int ftrace_init_dyn_debugfs(struct dentry *d_tracer) | |||
| 2624 | return 0; | 2631 | return 0; | 
| 2625 | } | 2632 | } | 
| 2626 | 2633 | ||
| 2627 | static int ftrace_convert_nops(struct module *mod, | 2634 | static int ftrace_process_locs(struct module *mod, | 
| 2628 | unsigned long *start, | 2635 | unsigned long *start, | 
| 2629 | unsigned long *end) | 2636 | unsigned long *end) | 
| 2630 | { | 2637 | { | 
| @@ -2684,7 +2691,7 @@ static void ftrace_init_module(struct module *mod, | |||
| 2684 | { | 2691 | { | 
| 2685 | if (ftrace_disabled || start == end) | 2692 | if (ftrace_disabled || start == end) | 
| 2686 | return; | 2693 | return; | 
| 2687 | ftrace_convert_nops(mod, start, end); | 2694 | ftrace_process_locs(mod, start, end); | 
| 2688 | } | 2695 | } | 
| 2689 | 2696 | ||
| 2690 | static int ftrace_module_notify(struct notifier_block *self, | 2697 | static int ftrace_module_notify(struct notifier_block *self, | 
| @@ -2745,7 +2752,7 @@ void __init ftrace_init(void) | |||
| 2745 | 2752 | ||
| 2746 | last_ftrace_enabled = ftrace_enabled = 1; | 2753 | last_ftrace_enabled = ftrace_enabled = 1; | 
| 2747 | 2754 | ||
| 2748 | ret = ftrace_convert_nops(NULL, | 2755 | ret = ftrace_process_locs(NULL, | 
| 2749 | __start_mcount_loc, | 2756 | __start_mcount_loc, | 
| 2750 | __stop_mcount_loc); | 2757 | __stop_mcount_loc); | 
| 2751 | 2758 | ||
| @@ -2778,23 +2785,6 @@ static inline void ftrace_startup_enable(int command) { } | |||
| 2778 | # define ftrace_shutdown_sysctl() do { } while (0) | 2785 | # define ftrace_shutdown_sysctl() do { } while (0) | 
| 2779 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 2786 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 
| 2780 | 2787 | ||
| 2781 | static ssize_t | ||
| 2782 | ftrace_pid_read(struct file *file, char __user *ubuf, | ||
| 2783 | size_t cnt, loff_t *ppos) | ||
| 2784 | { | ||
| 2785 | char buf[64]; | ||
| 2786 | int r; | ||
| 2787 | |||
| 2788 | if (ftrace_pid_trace == ftrace_swapper_pid) | ||
| 2789 | r = sprintf(buf, "swapper tasks\n"); | ||
| 2790 | else if (ftrace_pid_trace) | ||
| 2791 | r = sprintf(buf, "%u\n", pid_vnr(ftrace_pid_trace)); | ||
| 2792 | else | ||
| 2793 | r = sprintf(buf, "no pid\n"); | ||
| 2794 | |||
| 2795 | return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); | ||
| 2796 | } | ||
| 2797 | |||
| 2798 | static void clear_ftrace_swapper(void) | 2788 | static void clear_ftrace_swapper(void) | 
| 2799 | { | 2789 | { | 
| 2800 | struct task_struct *p; | 2790 | struct task_struct *p; | 
| @@ -2845,14 +2835,12 @@ static void set_ftrace_pid(struct pid *pid) | |||
| 2845 | rcu_read_unlock(); | 2835 | rcu_read_unlock(); | 
| 2846 | } | 2836 | } | 
| 2847 | 2837 | ||
| 2848 | static void clear_ftrace_pid_task(struct pid **pid) | 2838 | static void clear_ftrace_pid_task(struct pid *pid) | 
| 2849 | { | 2839 | { | 
| 2850 | if (*pid == ftrace_swapper_pid) | 2840 | if (pid == ftrace_swapper_pid) | 
| 2851 | clear_ftrace_swapper(); | 2841 | clear_ftrace_swapper(); | 
| 2852 | else | 2842 | else | 
| 2853 | clear_ftrace_pid(*pid); | 2843 | clear_ftrace_pid(pid); | 
| 2854 | |||
| 2855 | *pid = NULL; | ||
| 2856 | } | 2844 | } | 
| 2857 | 2845 | ||
| 2858 | static void set_ftrace_pid_task(struct pid *pid) | 2846 | static void set_ftrace_pid_task(struct pid *pid) | 
| @@ -2863,74 +2851,184 @@ static void set_ftrace_pid_task(struct pid *pid) | |||
| 2863 | set_ftrace_pid(pid); | 2851 | set_ftrace_pid(pid); | 
| 2864 | } | 2852 | } | 
| 2865 | 2853 | ||
| 2866 | static ssize_t | 2854 | static int ftrace_pid_add(int p) | 
| 2867 | ftrace_pid_write(struct file *filp, const char __user *ubuf, | ||
| 2868 | size_t cnt, loff_t *ppos) | ||
| 2869 | { | 2855 | { | 
| 2870 | struct pid *pid; | 2856 | struct pid *pid; | 
| 2871 | char buf[64]; | 2857 | struct ftrace_pid *fpid; | 
| 2872 | long val; | 2858 | int ret = -EINVAL; | 
| 2873 | int ret; | ||
| 2874 | 2859 | ||
| 2875 | if (cnt >= sizeof(buf)) | 2860 | mutex_lock(&ftrace_lock); | 
| 2876 | return -EINVAL; | ||
| 2877 | 2861 | ||
| 2878 | if (copy_from_user(&buf, ubuf, cnt)) | 2862 | if (!p) | 
| 2879 | return -EFAULT; | 2863 | pid = ftrace_swapper_pid; | 
| 2864 | else | ||
| 2865 | pid = find_get_pid(p); | ||
| 2880 | 2866 | ||
| 2881 | buf[cnt] = 0; | 2867 | if (!pid) | 
| 2868 | goto out; | ||
| 2882 | 2869 | ||
| 2883 | ret = strict_strtol(buf, 10, &val); | 2870 | ret = 0; | 
| 2884 | if (ret < 0) | ||
| 2885 | return ret; | ||
| 2886 | 2871 | ||
| 2887 | mutex_lock(&ftrace_lock); | 2872 | list_for_each_entry(fpid, &ftrace_pids, list) | 
| 2888 | if (val < 0) { | 2873 | if (fpid->pid == pid) | 
| 2889 | /* disable pid tracing */ | 2874 | goto out_put; | 
| 2890 | if (!ftrace_pid_trace) | ||
| 2891 | goto out; | ||
| 2892 | 2875 | ||
| 2893 | clear_ftrace_pid_task(&ftrace_pid_trace); | 2876 | ret = -ENOMEM; | 
| 2894 | 2877 | ||
| 2895 | } else { | 2878 | fpid = kmalloc(sizeof(*fpid), GFP_KERNEL); | 
| 2896 | /* swapper task is special */ | 2879 | if (!fpid) | 
| 2897 | if (!val) { | 2880 | goto out_put; | 
| 2898 | pid = ftrace_swapper_pid; | ||
| 2899 | if (pid == ftrace_pid_trace) | ||
| 2900 | goto out; | ||
| 2901 | } else { | ||
| 2902 | pid = find_get_pid(val); | ||
| 2903 | 2881 | ||
| 2904 | if (pid == ftrace_pid_trace) { | 2882 | list_add(&fpid->list, &ftrace_pids); | 
| 2905 | put_pid(pid); | 2883 | fpid->pid = pid; | 
| 2906 | goto out; | ||
| 2907 | } | ||
| 2908 | } | ||
| 2909 | 2884 | ||
| 2910 | if (ftrace_pid_trace) | 2885 | set_ftrace_pid_task(pid); | 
| 2911 | clear_ftrace_pid_task(&ftrace_pid_trace); | ||
| 2912 | 2886 | ||
| 2913 | if (!pid) | 2887 | ftrace_update_pid_func(); | 
| 2914 | goto out; | 2888 | ftrace_startup_enable(0); | 
| 2889 | |||
| 2890 | mutex_unlock(&ftrace_lock); | ||
| 2891 | return 0; | ||
| 2892 | |||
| 2893 | out_put: | ||
| 2894 | if (pid != ftrace_swapper_pid) | ||
| 2895 | put_pid(pid); | ||
| 2915 | 2896 | ||
| 2916 | ftrace_pid_trace = pid; | 2897 | out: | 
| 2898 | mutex_unlock(&ftrace_lock); | ||
| 2899 | return ret; | ||
| 2900 | } | ||
| 2901 | |||
| 2902 | static void ftrace_pid_reset(void) | ||
| 2903 | { | ||
| 2904 | struct ftrace_pid *fpid, *safe; | ||
| 2917 | 2905 | ||
| 2918 | set_ftrace_pid_task(ftrace_pid_trace); | 2906 | mutex_lock(&ftrace_lock); | 
| 2907 | list_for_each_entry_safe(fpid, safe, &ftrace_pids, list) { | ||
| 2908 | struct pid *pid = fpid->pid; | ||
| 2909 | |||
| 2910 | clear_ftrace_pid_task(pid); | ||
| 2911 | |||
| 2912 | list_del(&fpid->list); | ||
| 2913 | kfree(fpid); | ||
| 2919 | } | 2914 | } | 
| 2920 | 2915 | ||
| 2921 | /* update the function call */ | ||
| 2922 | ftrace_update_pid_func(); | 2916 | ftrace_update_pid_func(); | 
| 2923 | ftrace_startup_enable(0); | 2917 | ftrace_startup_enable(0); | 
| 2924 | 2918 | ||
| 2925 | out: | ||
| 2926 | mutex_unlock(&ftrace_lock); | 2919 | mutex_unlock(&ftrace_lock); | 
| 2920 | } | ||
| 2927 | 2921 | ||
| 2928 | return cnt; | 2922 | static void *fpid_start(struct seq_file *m, loff_t *pos) | 
| 2923 | { | ||
| 2924 | mutex_lock(&ftrace_lock); | ||
| 2925 | |||
| 2926 | if (list_empty(&ftrace_pids) && (!*pos)) | ||
| 2927 | return (void *) 1; | ||
| 2928 | |||
| 2929 | return seq_list_start(&ftrace_pids, *pos); | ||
| 2930 | } | ||
| 2931 | |||
| 2932 | static void *fpid_next(struct seq_file *m, void *v, loff_t *pos) | ||
| 2933 | { | ||
| 2934 | if (v == (void *)1) | ||
| 2935 | return NULL; | ||
| 2936 | |||
| 2937 | return seq_list_next(v, &ftrace_pids, pos); | ||
| 2938 | } | ||
| 2939 | |||
| 2940 | static void fpid_stop(struct seq_file *m, void *p) | ||
| 2941 | { | ||
| 2942 | mutex_unlock(&ftrace_lock); | ||
| 2943 | } | ||
| 2944 | |||
| 2945 | static int fpid_show(struct seq_file *m, void *v) | ||
| 2946 | { | ||
| 2947 | const struct ftrace_pid *fpid = list_entry(v, struct ftrace_pid, list); | ||
| 2948 | |||
| 2949 | if (v == (void *)1) { | ||
| 2950 | seq_printf(m, "no pid\n"); | ||
| 2951 | return 0; | ||
| 2952 | } | ||
| 2953 | |||
| 2954 | if (fpid->pid == ftrace_swapper_pid) | ||
| 2955 | seq_printf(m, "swapper tasks\n"); | ||
| 2956 | else | ||
| 2957 | seq_printf(m, "%u\n", pid_vnr(fpid->pid)); | ||
| 2958 | |||
| 2959 | return 0; | ||
| 2960 | } | ||
| 2961 | |||
| 2962 | static const struct seq_operations ftrace_pid_sops = { | ||
| 2963 | .start = fpid_start, | ||
| 2964 | .next = fpid_next, | ||
| 2965 | .stop = fpid_stop, | ||
| 2966 | .show = fpid_show, | ||
| 2967 | }; | ||
| 2968 | |||
| 2969 | static int | ||
| 2970 | ftrace_pid_open(struct inode *inode, struct file *file) | ||
| 2971 | { | ||
| 2972 | int ret = 0; | ||
| 2973 | |||
| 2974 | if ((file->f_mode & FMODE_WRITE) && | ||
| 2975 | (file->f_flags & O_TRUNC)) | ||
| 2976 | ftrace_pid_reset(); | ||
| 2977 | |||
| 2978 | if (file->f_mode & FMODE_READ) | ||
| 2979 | ret = seq_open(file, &ftrace_pid_sops); | ||
| 2980 | |||
| 2981 | return ret; | ||
| 2982 | } | ||
| 2983 | |||
| 2984 | static ssize_t | ||
| 2985 | ftrace_pid_write(struct file *filp, const char __user *ubuf, | ||
| 2986 | size_t cnt, loff_t *ppos) | ||
| 2987 | { | ||
| 2988 | char buf[64], *tmp; | ||
| 2989 | long val; | ||
| 2990 | int ret; | ||
| 2991 | |||
| 2992 | if (cnt >= sizeof(buf)) | ||
| 2993 | return -EINVAL; | ||
| 2994 | |||
| 2995 | if (copy_from_user(&buf, ubuf, cnt)) | ||
| 2996 | return -EFAULT; | ||
| 2997 | |||
| 2998 | buf[cnt] = 0; | ||
| 2999 | |||
| 3000 | /* | ||
| 3001 | * Allow "echo > set_ftrace_pid" or "echo -n '' > set_ftrace_pid" | ||
| 3002 | * to clean the filter quietly. | ||
| 3003 | */ | ||
| 3004 | tmp = strstrip(buf); | ||
| 3005 | if (strlen(tmp) == 0) | ||
| 3006 | return 1; | ||
| 3007 | |||
| 3008 | ret = strict_strtol(tmp, 10, &val); | ||
| 3009 | if (ret < 0) | ||
| 3010 | return ret; | ||
| 3011 | |||
| 3012 | ret = ftrace_pid_add(val); | ||
| 3013 | |||
| 3014 | return ret ? ret : cnt; | ||
| 3015 | } | ||
| 3016 | |||
| 3017 | static int | ||
| 3018 | ftrace_pid_release(struct inode *inode, struct file *file) | ||
| 3019 | { | ||
| 3020 | if (file->f_mode & FMODE_READ) | ||
| 3021 | seq_release(inode, file); | ||
| 3022 | |||
| 3023 | return 0; | ||
| 2929 | } | 3024 | } | 
| 2930 | 3025 | ||
| 2931 | static const struct file_operations ftrace_pid_fops = { | 3026 | static const struct file_operations ftrace_pid_fops = { | 
| 2932 | .read = ftrace_pid_read, | 3027 | .open = ftrace_pid_open, | 
| 2933 | .write = ftrace_pid_write, | 3028 | .write = ftrace_pid_write, | 
| 3029 | .read = seq_read, | ||
| 3030 | .llseek = seq_lseek, | ||
| 3031 | .release = ftrace_pid_release, | ||
| 2934 | }; | 3032 | }; | 
| 2935 | 3033 | ||
| 2936 | static __init int ftrace_init_debugfs(void) | 3034 | static __init int ftrace_init_debugfs(void) | 
| @@ -3293,4 +3391,3 @@ void ftrace_graph_stop(void) | |||
| 3293 | ftrace_stop(); | 3391 | ftrace_stop(); | 
| 3294 | } | 3392 | } | 
| 3295 | #endif | 3393 | #endif | 
| 3296 | |||
| diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 5dd017fea6f5..a72c6e03deec 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -1787,9 +1787,9 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, | |||
| 1787 | static struct ring_buffer_event * | 1787 | static struct ring_buffer_event * | 
| 1788 | rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, | 1788 | rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, | 
| 1789 | unsigned long length, unsigned long tail, | 1789 | unsigned long length, unsigned long tail, | 
| 1790 | struct buffer_page *commit_page, | ||
| 1791 | struct buffer_page *tail_page, u64 *ts) | 1790 | struct buffer_page *tail_page, u64 *ts) | 
| 1792 | { | 1791 | { | 
| 1792 | struct buffer_page *commit_page = cpu_buffer->commit_page; | ||
| 1793 | struct ring_buffer *buffer = cpu_buffer->buffer; | 1793 | struct ring_buffer *buffer = cpu_buffer->buffer; | 
| 1794 | struct buffer_page *next_page; | 1794 | struct buffer_page *next_page; | 
| 1795 | int ret; | 1795 | int ret; | 
| @@ -1892,13 +1892,10 @@ static struct ring_buffer_event * | |||
| 1892 | __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | 1892 | __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | 
| 1893 | unsigned type, unsigned long length, u64 *ts) | 1893 | unsigned type, unsigned long length, u64 *ts) | 
| 1894 | { | 1894 | { | 
| 1895 | struct buffer_page *tail_page, *commit_page; | 1895 | struct buffer_page *tail_page; | 
| 1896 | struct ring_buffer_event *event; | 1896 | struct ring_buffer_event *event; | 
| 1897 | unsigned long tail, write; | 1897 | unsigned long tail, write; | 
| 1898 | 1898 | ||
| 1899 | commit_page = cpu_buffer->commit_page; | ||
| 1900 | /* we just need to protect against interrupts */ | ||
| 1901 | barrier(); | ||
| 1902 | tail_page = cpu_buffer->tail_page; | 1899 | tail_page = cpu_buffer->tail_page; | 
| 1903 | write = local_add_return(length, &tail_page->write); | 1900 | write = local_add_return(length, &tail_page->write); | 
| 1904 | 1901 | ||
| @@ -1909,7 +1906,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | |||
| 1909 | /* See if we shot pass the end of this buffer page */ | 1906 | /* See if we shot pass the end of this buffer page */ | 
| 1910 | if (write > BUF_PAGE_SIZE) | 1907 | if (write > BUF_PAGE_SIZE) | 
| 1911 | return rb_move_tail(cpu_buffer, length, tail, | 1908 | return rb_move_tail(cpu_buffer, length, tail, | 
| 1912 | commit_page, tail_page, ts); | 1909 | tail_page, ts); | 
| 1913 | 1910 | ||
| 1914 | /* We reserved something on the buffer */ | 1911 | /* We reserved something on the buffer */ | 
| 1915 | 1912 | ||
| diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c index 573d3cc762c3..b2477caf09c2 100644 --- a/kernel/trace/ring_buffer_benchmark.c +++ b/kernel/trace/ring_buffer_benchmark.c | |||
| @@ -35,6 +35,28 @@ static int disable_reader; | |||
| 35 | module_param(disable_reader, uint, 0644); | 35 | module_param(disable_reader, uint, 0644); | 
| 36 | MODULE_PARM_DESC(disable_reader, "only run producer"); | 36 | MODULE_PARM_DESC(disable_reader, "only run producer"); | 
| 37 | 37 | ||
| 38 | static int write_iteration = 50; | ||
| 39 | module_param(write_iteration, uint, 0644); | ||
| 40 | MODULE_PARM_DESC(write_iteration, "# of writes between timestamp readings"); | ||
| 41 | |||
| 42 | static int producer_nice = 19; | ||
| 43 | static int consumer_nice = 19; | ||
| 44 | |||
| 45 | static int producer_fifo = -1; | ||
| 46 | static int consumer_fifo = -1; | ||
| 47 | |||
| 48 | module_param(producer_nice, uint, 0644); | ||
| 49 | MODULE_PARM_DESC(producer_nice, "nice prio for producer"); | ||
| 50 | |||
| 51 | module_param(consumer_nice, uint, 0644); | ||
| 52 | MODULE_PARM_DESC(consumer_nice, "nice prio for consumer"); | ||
| 53 | |||
| 54 | module_param(producer_fifo, uint, 0644); | ||
| 55 | MODULE_PARM_DESC(producer_fifo, "fifo prio for producer"); | ||
| 56 | |||
| 57 | module_param(consumer_fifo, uint, 0644); | ||
| 58 | MODULE_PARM_DESC(consumer_fifo, "fifo prio for consumer"); | ||
| 59 | |||
| 38 | static int read_events; | 60 | static int read_events; | 
| 39 | 61 | ||
| 40 | static int kill_test; | 62 | static int kill_test; | 
| @@ -208,15 +230,18 @@ static void ring_buffer_producer(void) | |||
| 208 | do { | 230 | do { | 
| 209 | struct ring_buffer_event *event; | 231 | struct ring_buffer_event *event; | 
| 210 | int *entry; | 232 | int *entry; | 
| 211 | 233 | int i; | |
| 212 | event = ring_buffer_lock_reserve(buffer, 10); | 234 | |
| 213 | if (!event) { | 235 | for (i = 0; i < write_iteration; i++) { | 
| 214 | missed++; | 236 | event = ring_buffer_lock_reserve(buffer, 10); | 
| 215 | } else { | 237 | if (!event) { | 
| 216 | hit++; | 238 | missed++; | 
| 217 | entry = ring_buffer_event_data(event); | 239 | } else { | 
| 218 | *entry = smp_processor_id(); | 240 | hit++; | 
| 219 | ring_buffer_unlock_commit(buffer, event); | 241 | entry = ring_buffer_event_data(event); | 
| 242 | *entry = smp_processor_id(); | ||
| 243 | ring_buffer_unlock_commit(buffer, event); | ||
| 244 | } | ||
| 220 | } | 245 | } | 
| 221 | do_gettimeofday(&end_tv); | 246 | do_gettimeofday(&end_tv); | 
| 222 | 247 | ||
| @@ -263,6 +288,27 @@ static void ring_buffer_producer(void) | |||
| 263 | 288 | ||
| 264 | if (kill_test) | 289 | if (kill_test) | 
| 265 | trace_printk("ERROR!\n"); | 290 | trace_printk("ERROR!\n"); | 
| 291 | |||
| 292 | if (!disable_reader) { | ||
| 293 | if (consumer_fifo < 0) | ||
| 294 | trace_printk("Running Consumer at nice: %d\n", | ||
| 295 | consumer_nice); | ||
| 296 | else | ||
| 297 | trace_printk("Running Consumer at SCHED_FIFO %d\n", | ||
| 298 | consumer_fifo); | ||
| 299 | } | ||
| 300 | if (producer_fifo < 0) | ||
| 301 | trace_printk("Running Producer at nice: %d\n", | ||
| 302 | producer_nice); | ||
| 303 | else | ||
| 304 | trace_printk("Running Producer at SCHED_FIFO %d\n", | ||
| 305 | producer_fifo); | ||
| 306 | |||
| 307 | /* Let the user know that the test is running at low priority */ | ||
| 308 | if (producer_fifo < 0 && consumer_fifo < 0 && | ||
| 309 | producer_nice == 19 && consumer_nice == 19) | ||
| 310 | trace_printk("WARNING!!! This test is running at lowest priority.\n"); | ||
| 311 | |||
| 266 | trace_printk("Time: %lld (usecs)\n", time); | 312 | trace_printk("Time: %lld (usecs)\n", time); | 
| 267 | trace_printk("Overruns: %lld\n", overruns); | 313 | trace_printk("Overruns: %lld\n", overruns); | 
| 268 | if (disable_reader) | 314 | if (disable_reader) | 
| @@ -392,6 +438,27 @@ static int __init ring_buffer_benchmark_init(void) | |||
| 392 | if (IS_ERR(producer)) | 438 | if (IS_ERR(producer)) | 
| 393 | goto out_kill; | 439 | goto out_kill; | 
| 394 | 440 | ||
| 441 | /* | ||
| 442 | * Run them as low-prio background tasks by default: | ||
| 443 | */ | ||
| 444 | if (!disable_reader) { | ||
| 445 | if (consumer_fifo >= 0) { | ||
| 446 | struct sched_param param = { | ||
| 447 | .sched_priority = consumer_fifo | ||
| 448 | }; | ||
| 449 | sched_setscheduler(consumer, SCHED_FIFO, ¶m); | ||
| 450 | } else | ||
| 451 | set_user_nice(consumer, consumer_nice); | ||
| 452 | } | ||
| 453 | |||
| 454 | if (producer_fifo >= 0) { | ||
| 455 | struct sched_param param = { | ||
| 456 | .sched_priority = consumer_fifo | ||
| 457 | }; | ||
| 458 | sched_setscheduler(producer, SCHED_FIFO, ¶m); | ||
| 459 | } else | ||
| 460 | set_user_nice(producer, producer_nice); | ||
| 461 | |||
| 395 | return 0; | 462 | return 0; | 
| 396 | 463 | ||
| 397 | out_kill: | 464 | out_kill: | 
| diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index b20d3ec75de9..874f2893cff0 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -129,7 +129,7 @@ static int tracing_set_tracer(const char *buf); | |||
| 129 | static char bootup_tracer_buf[MAX_TRACER_SIZE] __initdata; | 129 | static char bootup_tracer_buf[MAX_TRACER_SIZE] __initdata; | 
| 130 | static char *default_bootup_tracer; | 130 | static char *default_bootup_tracer; | 
| 131 | 131 | ||
| 132 | static int __init set_ftrace(char *str) | 132 | static int __init set_cmdline_ftrace(char *str) | 
| 133 | { | 133 | { | 
| 134 | strncpy(bootup_tracer_buf, str, MAX_TRACER_SIZE); | 134 | strncpy(bootup_tracer_buf, str, MAX_TRACER_SIZE); | 
| 135 | default_bootup_tracer = bootup_tracer_buf; | 135 | default_bootup_tracer = bootup_tracer_buf; | 
| @@ -137,7 +137,7 @@ static int __init set_ftrace(char *str) | |||
| 137 | ring_buffer_expanded = 1; | 137 | ring_buffer_expanded = 1; | 
| 138 | return 1; | 138 | return 1; | 
| 139 | } | 139 | } | 
| 140 | __setup("ftrace=", set_ftrace); | 140 | __setup("ftrace=", set_cmdline_ftrace); | 
| 141 | 141 | ||
| 142 | static int __init set_ftrace_dump_on_oops(char *str) | 142 | static int __init set_ftrace_dump_on_oops(char *str) | 
| 143 | { | 143 | { | 
| @@ -1361,10 +1361,11 @@ int trace_array_vprintk(struct trace_array *tr, | |||
| 1361 | pause_graph_tracing(); | 1361 | pause_graph_tracing(); | 
| 1362 | raw_local_irq_save(irq_flags); | 1362 | raw_local_irq_save(irq_flags); | 
| 1363 | __raw_spin_lock(&trace_buf_lock); | 1363 | __raw_spin_lock(&trace_buf_lock); | 
| 1364 | len = vsnprintf(trace_buf, TRACE_BUF_SIZE, fmt, args); | 1364 | if (args == NULL) { | 
| 1365 | 1365 | strncpy(trace_buf, fmt, TRACE_BUF_SIZE); | |
| 1366 | len = min(len, TRACE_BUF_SIZE-1); | 1366 | len = strlen(trace_buf); | 
| 1367 | trace_buf[len] = 0; | 1367 | } else | 
| 1368 | len = vsnprintf(trace_buf, TRACE_BUF_SIZE, fmt, args); | ||
| 1368 | 1369 | ||
| 1369 | size = sizeof(*entry) + len + 1; | 1370 | size = sizeof(*entry) + len + 1; | 
| 1370 | buffer = tr->buffer; | 1371 | buffer = tr->buffer; | 
| @@ -1373,10 +1374,10 @@ int trace_array_vprintk(struct trace_array *tr, | |||
| 1373 | if (!event) | 1374 | if (!event) | 
| 1374 | goto out_unlock; | 1375 | goto out_unlock; | 
| 1375 | entry = ring_buffer_event_data(event); | 1376 | entry = ring_buffer_event_data(event); | 
| 1376 | entry->ip = ip; | 1377 | entry->ip = ip; | 
| 1377 | 1378 | ||
| 1378 | memcpy(&entry->buf, trace_buf, len); | 1379 | memcpy(&entry->buf, trace_buf, len); | 
| 1379 | entry->buf[len] = 0; | 1380 | entry->buf[len] = '\0'; | 
| 1380 | if (!filter_check_discard(call, entry, buffer, event)) | 1381 | if (!filter_check_discard(call, entry, buffer, event)) | 
| 1381 | ring_buffer_unlock_commit(buffer, event); | 1382 | ring_buffer_unlock_commit(buffer, event); | 
| 1382 | 1383 | ||
| @@ -3319,22 +3320,11 @@ tracing_entries_write(struct file *filp, const char __user *ubuf, | |||
| 3319 | return cnt; | 3320 | return cnt; | 
| 3320 | } | 3321 | } | 
| 3321 | 3322 | ||
| 3322 | static int mark_printk(const char *fmt, ...) | ||
| 3323 | { | ||
| 3324 | int ret; | ||
| 3325 | va_list args; | ||
| 3326 | va_start(args, fmt); | ||
| 3327 | ret = trace_vprintk(0, fmt, args); | ||
| 3328 | va_end(args); | ||
| 3329 | return ret; | ||
| 3330 | } | ||
| 3331 | |||
| 3332 | static ssize_t | 3323 | static ssize_t | 
| 3333 | tracing_mark_write(struct file *filp, const char __user *ubuf, | 3324 | tracing_mark_write(struct file *filp, const char __user *ubuf, | 
| 3334 | size_t cnt, loff_t *fpos) | 3325 | size_t cnt, loff_t *fpos) | 
| 3335 | { | 3326 | { | 
| 3336 | char *buf; | 3327 | char *buf; | 
| 3337 | char *end; | ||
| 3338 | 3328 | ||
| 3339 | if (tracing_disabled) | 3329 | if (tracing_disabled) | 
| 3340 | return -EINVAL; | 3330 | return -EINVAL; | 
| @@ -3342,7 +3332,7 @@ tracing_mark_write(struct file *filp, const char __user *ubuf, | |||
| 3342 | if (cnt > TRACE_BUF_SIZE) | 3332 | if (cnt > TRACE_BUF_SIZE) | 
| 3343 | cnt = TRACE_BUF_SIZE; | 3333 | cnt = TRACE_BUF_SIZE; | 
| 3344 | 3334 | ||
| 3345 | buf = kmalloc(cnt + 1, GFP_KERNEL); | 3335 | buf = kmalloc(cnt + 2, GFP_KERNEL); | 
| 3346 | if (buf == NULL) | 3336 | if (buf == NULL) | 
| 3347 | return -ENOMEM; | 3337 | return -ENOMEM; | 
| 3348 | 3338 | ||
| @@ -3350,14 +3340,13 @@ tracing_mark_write(struct file *filp, const char __user *ubuf, | |||
| 3350 | kfree(buf); | 3340 | kfree(buf); | 
| 3351 | return -EFAULT; | 3341 | return -EFAULT; | 
| 3352 | } | 3342 | } | 
| 3343 | if (buf[cnt-1] != '\n') { | ||
| 3344 | buf[cnt] = '\n'; | ||
| 3345 | buf[cnt+1] = '\0'; | ||
| 3346 | } else | ||
| 3347 | buf[cnt] = '\0'; | ||
| 3353 | 3348 | ||
| 3354 | /* Cut from the first nil or newline. */ | 3349 | cnt = trace_vprintk(0, buf, NULL); | 
| 3355 | buf[cnt] = '\0'; | ||
| 3356 | end = strchr(buf, '\n'); | ||
| 3357 | if (end) | ||
| 3358 | *end = '\0'; | ||
| 3359 | |||
| 3360 | cnt = mark_printk("%s\n", buf); | ||
| 3361 | kfree(buf); | 3350 | kfree(buf); | 
| 3362 | *fpos += cnt; | 3351 | *fpos += cnt; | 
| 3363 | 3352 | ||
| @@ -3730,7 +3719,7 @@ tracing_stats_read(struct file *filp, char __user *ubuf, | |||
| 3730 | 3719 | ||
| 3731 | s = kmalloc(sizeof(*s), GFP_KERNEL); | 3720 | s = kmalloc(sizeof(*s), GFP_KERNEL); | 
| 3732 | if (!s) | 3721 | if (!s) | 
| 3733 | return ENOMEM; | 3722 | return -ENOMEM; | 
| 3734 | 3723 | ||
| 3735 | trace_seq_init(s); | 3724 | trace_seq_init(s); | 
| 3736 | 3725 | ||
| diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 405cb850b75d..acef8b4636f0 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -483,10 +483,6 @@ static inline int ftrace_graph_addr(unsigned long addr) | |||
| 483 | return 0; | 483 | return 0; | 
| 484 | } | 484 | } | 
| 485 | #else | 485 | #else | 
| 486 | static inline int ftrace_trace_addr(unsigned long addr) | ||
| 487 | { | ||
| 488 | return 1; | ||
| 489 | } | ||
| 490 | static inline int ftrace_graph_addr(unsigned long addr) | 486 | static inline int ftrace_graph_addr(unsigned long addr) | 
| 491 | { | 487 | { | 
| 492 | return 1; | 488 | return 1; | 
| @@ -500,12 +496,12 @@ print_graph_function(struct trace_iterator *iter) | |||
| 500 | } | 496 | } | 
| 501 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 497 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 
| 502 | 498 | ||
| 503 | extern struct pid *ftrace_pid_trace; | 499 | extern struct list_head ftrace_pids; | 
| 504 | 500 | ||
| 505 | #ifdef CONFIG_FUNCTION_TRACER | 501 | #ifdef CONFIG_FUNCTION_TRACER | 
| 506 | static inline int ftrace_trace_task(struct task_struct *task) | 502 | static inline int ftrace_trace_task(struct task_struct *task) | 
| 507 | { | 503 | { | 
| 508 | if (!ftrace_pid_trace) | 504 | if (list_empty(&ftrace_pids)) | 
| 509 | return 1; | 505 | return 1; | 
| 510 | 506 | ||
| 511 | return test_tsk_trace_trace(task); | 507 | return test_tsk_trace_trace(task); | 
| @@ -699,22 +695,40 @@ struct event_subsystem { | |||
| 699 | }; | 695 | }; | 
| 700 | 696 | ||
| 701 | struct filter_pred; | 697 | struct filter_pred; | 
| 698 | struct regex; | ||
| 702 | 699 | ||
| 703 | typedef int (*filter_pred_fn_t) (struct filter_pred *pred, void *event, | 700 | typedef int (*filter_pred_fn_t) (struct filter_pred *pred, void *event, | 
| 704 | int val1, int val2); | 701 | int val1, int val2); | 
| 705 | 702 | ||
| 703 | typedef int (*regex_match_func)(char *str, struct regex *r, int len); | ||
| 704 | |||
| 705 | enum regex_type { | ||
| 706 | MATCH_FULL, | ||
| 707 | MATCH_FRONT_ONLY, | ||
| 708 | MATCH_MIDDLE_ONLY, | ||
| 709 | MATCH_END_ONLY, | ||
| 710 | }; | ||
| 711 | |||
| 712 | struct regex { | ||
| 713 | char pattern[MAX_FILTER_STR_VAL]; | ||
| 714 | int len; | ||
| 715 | int field_len; | ||
| 716 | regex_match_func match; | ||
| 717 | }; | ||
| 718 | |||
| 706 | struct filter_pred { | 719 | struct filter_pred { | 
| 707 | filter_pred_fn_t fn; | 720 | filter_pred_fn_t fn; | 
| 708 | u64 val; | 721 | u64 val; | 
| 709 | char str_val[MAX_FILTER_STR_VAL]; | 722 | struct regex regex; | 
| 710 | int str_len; | 723 | char *field_name; | 
| 711 | char *field_name; | 724 | int offset; | 
| 712 | int offset; | 725 | int not; | 
| 713 | int not; | 726 | int op; | 
| 714 | int op; | 727 | int pop_n; | 
| 715 | int pop_n; | ||
| 716 | }; | 728 | }; | 
| 717 | 729 | ||
| 730 | extern enum regex_type | ||
| 731 | filter_parse_regex(char *buff, int len, char **search, int *not); | ||
| 718 | extern void print_event_filter(struct ftrace_event_call *call, | 732 | extern void print_event_filter(struct ftrace_event_call *call, | 
| 719 | struct trace_seq *s); | 733 | struct trace_seq *s); | 
| 720 | extern int apply_event_filter(struct ftrace_event_call *call, | 734 | extern int apply_event_filter(struct ftrace_event_call *call, | 
| diff --git a/kernel/trace/trace_clock.c b/kernel/trace/trace_clock.c index 20c5f92e28a8..878c03f386ba 100644 --- a/kernel/trace/trace_clock.c +++ b/kernel/trace/trace_clock.c | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | #include <linux/ktime.h> | 20 | #include <linux/ktime.h> | 
| 21 | #include <linux/trace_clock.h> | 21 | #include <linux/trace_clock.h> | 
| 22 | 22 | ||
| 23 | #include "trace.h" | ||
| 24 | |||
| 23 | /* | 25 | /* | 
| 24 | * trace_clock_local(): the simplest and least coherent tracing clock. | 26 | * trace_clock_local(): the simplest and least coherent tracing clock. | 
| 25 | * | 27 | * | 
| @@ -28,17 +30,17 @@ | |||
| 28 | */ | 30 | */ | 
| 29 | u64 notrace trace_clock_local(void) | 31 | u64 notrace trace_clock_local(void) | 
| 30 | { | 32 | { | 
| 31 | unsigned long flags; | ||
| 32 | u64 clock; | 33 | u64 clock; | 
| 34 | int resched; | ||
| 33 | 35 | ||
| 34 | /* | 36 | /* | 
| 35 | * sched_clock() is an architecture implemented, fast, scalable, | 37 | * sched_clock() is an architecture implemented, fast, scalable, | 
| 36 | * lockless clock. It is not guaranteed to be coherent across | 38 | * lockless clock. It is not guaranteed to be coherent across | 
| 37 | * CPUs, nor across CPU idle events. | 39 | * CPUs, nor across CPU idle events. | 
| 38 | */ | 40 | */ | 
| 39 | raw_local_irq_save(flags); | 41 | resched = ftrace_preempt_disable(); | 
| 40 | clock = sched_clock(); | 42 | clock = sched_clock(); | 
| 41 | raw_local_irq_restore(flags); | 43 | ftrace_preempt_enable(resched); | 
| 42 | 44 | ||
| 43 | return clock; | 45 | return clock; | 
| 44 | } | 46 | } | 
| diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index d128f65778e6..5e9ffc33f6db 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -878,9 +878,9 @@ event_subsystem_dir(const char *name, struct dentry *d_events) | |||
| 878 | "'%s/filter' entry\n", name); | 878 | "'%s/filter' entry\n", name); | 
| 879 | } | 879 | } | 
| 880 | 880 | ||
| 881 | entry = trace_create_file("enable", 0644, system->entry, | 881 | trace_create_file("enable", 0644, system->entry, | 
| 882 | (void *)system->name, | 882 | (void *)system->name, | 
| 883 | &ftrace_system_enable_fops); | 883 | &ftrace_system_enable_fops); | 
| 884 | 884 | ||
| 885 | return system->entry; | 885 | return system->entry; | 
| 886 | } | 886 | } | 
| @@ -892,7 +892,6 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, | |||
| 892 | const struct file_operations *filter, | 892 | const struct file_operations *filter, | 
| 893 | const struct file_operations *format) | 893 | const struct file_operations *format) | 
| 894 | { | 894 | { | 
| 895 | struct dentry *entry; | ||
| 896 | int ret; | 895 | int ret; | 
| 897 | 896 | ||
| 898 | /* | 897 | /* | 
| @@ -910,12 +909,12 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, | |||
| 910 | } | 909 | } | 
| 911 | 910 | ||
| 912 | if (call->regfunc) | 911 | if (call->regfunc) | 
| 913 | entry = trace_create_file("enable", 0644, call->dir, call, | 912 | trace_create_file("enable", 0644, call->dir, call, | 
| 914 | enable); | 913 | enable); | 
| 915 | 914 | ||
| 916 | if (call->id && call->profile_enable) | 915 | if (call->id && call->profile_enable) | 
| 917 | entry = trace_create_file("id", 0444, call->dir, call, | 916 | trace_create_file("id", 0444, call->dir, call, | 
| 918 | id); | 917 | id); | 
| 919 | 918 | ||
| 920 | if (call->define_fields) { | 919 | if (call->define_fields) { | 
| 921 | ret = call->define_fields(call); | 920 | ret = call->define_fields(call); | 
| @@ -924,16 +923,16 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, | |||
| 924 | " events/%s\n", call->name); | 923 | " events/%s\n", call->name); | 
| 925 | return ret; | 924 | return ret; | 
| 926 | } | 925 | } | 
| 927 | entry = trace_create_file("filter", 0644, call->dir, call, | 926 | trace_create_file("filter", 0644, call->dir, call, | 
| 928 | filter); | 927 | filter); | 
| 929 | } | 928 | } | 
| 930 | 929 | ||
| 931 | /* A trace may not want to export its format */ | 930 | /* A trace may not want to export its format */ | 
| 932 | if (!call->show_format) | 931 | if (!call->show_format) | 
| 933 | return 0; | 932 | return 0; | 
| 934 | 933 | ||
| 935 | entry = trace_create_file("format", 0444, call->dir, call, | 934 | trace_create_file("format", 0444, call->dir, call, | 
| 936 | format); | 935 | format); | 
| 937 | 936 | ||
| 938 | return 0; | 937 | return 0; | 
| 939 | } | 938 | } | 
| diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 98a6cc5c64ed..92672016da28 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
| @@ -18,8 +18,6 @@ | |||
| 18 | * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com> | 18 | * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com> | 
| 19 | */ | 19 | */ | 
| 20 | 20 | ||
| 21 | #include <linux/debugfs.h> | ||
| 22 | #include <linux/uaccess.h> | ||
| 23 | #include <linux/module.h> | 21 | #include <linux/module.h> | 
| 24 | #include <linux/ctype.h> | 22 | #include <linux/ctype.h> | 
| 25 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> | 
| @@ -197,9 +195,9 @@ static int filter_pred_string(struct filter_pred *pred, void *event, | |||
| 197 | char *addr = (char *)(event + pred->offset); | 195 | char *addr = (char *)(event + pred->offset); | 
| 198 | int cmp, match; | 196 | int cmp, match; | 
| 199 | 197 | ||
| 200 | cmp = strncmp(addr, pred->str_val, pred->str_len); | 198 | cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len); | 
| 201 | 199 | ||
| 202 | match = (!cmp) ^ pred->not; | 200 | match = cmp ^ pred->not; | 
| 203 | 201 | ||
| 204 | return match; | 202 | return match; | 
| 205 | } | 203 | } | 
| @@ -211,9 +209,9 @@ static int filter_pred_pchar(struct filter_pred *pred, void *event, | |||
| 211 | char **addr = (char **)(event + pred->offset); | 209 | char **addr = (char **)(event + pred->offset); | 
| 212 | int cmp, match; | 210 | int cmp, match; | 
| 213 | 211 | ||
| 214 | cmp = strncmp(*addr, pred->str_val, pred->str_len); | 212 | cmp = pred->regex.match(*addr, &pred->regex, pred->regex.field_len); | 
| 215 | 213 | ||
| 216 | match = (!cmp) ^ pred->not; | 214 | match = cmp ^ pred->not; | 
| 217 | 215 | ||
| 218 | return match; | 216 | return match; | 
| 219 | } | 217 | } | 
| @@ -237,9 +235,9 @@ static int filter_pred_strloc(struct filter_pred *pred, void *event, | |||
| 237 | char *addr = (char *)(event + str_loc); | 235 | char *addr = (char *)(event + str_loc); | 
| 238 | int cmp, match; | 236 | int cmp, match; | 
| 239 | 237 | ||
| 240 | cmp = strncmp(addr, pred->str_val, str_len); | 238 | cmp = pred->regex.match(addr, &pred->regex, str_len); | 
| 241 | 239 | ||
| 242 | match = (!cmp) ^ pred->not; | 240 | match = cmp ^ pred->not; | 
| 243 | 241 | ||
| 244 | return match; | 242 | return match; | 
| 245 | } | 243 | } | 
| @@ -250,6 +248,124 @@ static int filter_pred_none(struct filter_pred *pred, void *event, | |||
| 250 | return 0; | 248 | return 0; | 
| 251 | } | 249 | } | 
| 252 | 250 | ||
| 251 | /* Basic regex callbacks */ | ||
| 252 | static int regex_match_full(char *str, struct regex *r, int len) | ||
| 253 | { | ||
| 254 | if (strncmp(str, r->pattern, len) == 0) | ||
| 255 | return 1; | ||
| 256 | return 0; | ||
| 257 | } | ||
| 258 | |||
| 259 | static int regex_match_front(char *str, struct regex *r, int len) | ||
| 260 | { | ||
| 261 | if (strncmp(str, r->pattern, len) == 0) | ||
| 262 | return 1; | ||
| 263 | return 0; | ||
| 264 | } | ||
| 265 | |||
| 266 | static int regex_match_middle(char *str, struct regex *r, int len) | ||
| 267 | { | ||
| 268 | if (strstr(str, r->pattern)) | ||
| 269 | return 1; | ||
| 270 | return 0; | ||
| 271 | } | ||
| 272 | |||
| 273 | static int regex_match_end(char *str, struct regex *r, int len) | ||
| 274 | { | ||
| 275 | char *ptr = strstr(str, r->pattern); | ||
| 276 | |||
| 277 | if (ptr && (ptr[r->len] == 0)) | ||
| 278 | return 1; | ||
| 279 | return 0; | ||
| 280 | } | ||
| 281 | |||
| 282 | /** | ||
| 283 | * filter_parse_regex - parse a basic regex | ||
| 284 | * @buff: the raw regex | ||
| 285 | * @len: length of the regex | ||
| 286 | * @search: will point to the beginning of the string to compare | ||
| 287 | * @not: tell whether the match will have to be inverted | ||
| 288 | * | ||
| 289 | * This passes in a buffer containing a regex and this function will | ||
| 290 | * set search to point to the search part of the buffer and | ||
| 291 | * return the type of search it is (see enum above). | ||
| 292 | * This does modify buff. | ||
| 293 | * | ||
| 294 | * Returns enum type. | ||
| 295 | * search returns the pointer to use for comparison. | ||
| 296 | * not returns 1 if buff started with a '!' | ||
| 297 | * 0 otherwise. | ||
| 298 | */ | ||
| 299 | enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not) | ||
| 300 | { | ||
| 301 | int type = MATCH_FULL; | ||
| 302 | int i; | ||
| 303 | |||
| 304 | if (buff[0] == '!') { | ||
| 305 | *not = 1; | ||
| 306 | buff++; | ||
| 307 | len--; | ||
| 308 | } else | ||
| 309 | *not = 0; | ||
| 310 | |||
| 311 | *search = buff; | ||
| 312 | |||
| 313 | for (i = 0; i < len; i++) { | ||
| 314 | if (buff[i] == '*') { | ||
| 315 | if (!i) { | ||
| 316 | *search = buff + 1; | ||
| 317 | type = MATCH_END_ONLY; | ||
| 318 | } else { | ||
| 319 | if (type == MATCH_END_ONLY) | ||
| 320 | type = MATCH_MIDDLE_ONLY; | ||
| 321 | else | ||
| 322 | type = MATCH_FRONT_ONLY; | ||
| 323 | buff[i] = 0; | ||
| 324 | break; | ||
| 325 | } | ||
| 326 | } | ||
| 327 | } | ||
| 328 | |||
| 329 | return type; | ||
| 330 | } | ||
| 331 | |||
| 332 | static int filter_build_regex(struct filter_pred *pred) | ||
| 333 | { | ||
| 334 | struct regex *r = &pred->regex; | ||
| 335 | char *search, *dup; | ||
| 336 | enum regex_type type; | ||
| 337 | int not; | ||
| 338 | |||
| 339 | type = filter_parse_regex(r->pattern, r->len, &search, ¬); | ||
| 340 | dup = kstrdup(search, GFP_KERNEL); | ||
| 341 | if (!dup) | ||
| 342 | return -ENOMEM; | ||
| 343 | |||
| 344 | strcpy(r->pattern, dup); | ||
| 345 | kfree(dup); | ||
| 346 | |||
| 347 | r->len = strlen(r->pattern); | ||
| 348 | |||
| 349 | switch (type) { | ||
| 350 | case MATCH_FULL: | ||
| 351 | r->match = regex_match_full; | ||
| 352 | break; | ||
| 353 | case MATCH_FRONT_ONLY: | ||
| 354 | r->match = regex_match_front; | ||
| 355 | break; | ||
| 356 | case MATCH_MIDDLE_ONLY: | ||
| 357 | r->match = regex_match_middle; | ||
| 358 | break; | ||
| 359 | case MATCH_END_ONLY: | ||
| 360 | r->match = regex_match_end; | ||
| 361 | break; | ||
| 362 | } | ||
| 363 | |||
| 364 | pred->not ^= not; | ||
| 365 | |||
| 366 | return 0; | ||
| 367 | } | ||
| 368 | |||
| 253 | /* return 1 if event matches, 0 otherwise (discard) */ | 369 | /* return 1 if event matches, 0 otherwise (discard) */ | 
| 254 | int filter_match_preds(struct ftrace_event_call *call, void *rec) | 370 | int filter_match_preds(struct ftrace_event_call *call, void *rec) | 
| 255 | { | 371 | { | 
| @@ -396,7 +512,7 @@ static void filter_clear_pred(struct filter_pred *pred) | |||
| 396 | { | 512 | { | 
| 397 | kfree(pred->field_name); | 513 | kfree(pred->field_name); | 
| 398 | pred->field_name = NULL; | 514 | pred->field_name = NULL; | 
| 399 | pred->str_len = 0; | 515 | pred->regex.len = 0; | 
| 400 | } | 516 | } | 
| 401 | 517 | ||
| 402 | static int filter_set_pred(struct filter_pred *dest, | 518 | static int filter_set_pred(struct filter_pred *dest, | 
| @@ -660,21 +776,24 @@ static int filter_add_pred(struct filter_parse_state *ps, | |||
| 660 | } | 776 | } | 
| 661 | 777 | ||
| 662 | if (is_string_field(field)) { | 778 | if (is_string_field(field)) { | 
| 663 | pred->str_len = field->size; | 779 | ret = filter_build_regex(pred); | 
| 780 | if (ret) | ||
| 781 | return ret; | ||
| 664 | 782 | ||
| 665 | if (field->filter_type == FILTER_STATIC_STRING) | 783 | if (field->filter_type == FILTER_STATIC_STRING) { | 
| 666 | fn = filter_pred_string; | 784 | fn = filter_pred_string; | 
| 667 | else if (field->filter_type == FILTER_DYN_STRING) | 785 | pred->regex.field_len = field->size; | 
| 668 | fn = filter_pred_strloc; | 786 | } else if (field->filter_type == FILTER_DYN_STRING) | 
| 787 | fn = filter_pred_strloc; | ||
| 669 | else { | 788 | else { | 
| 670 | fn = filter_pred_pchar; | 789 | fn = filter_pred_pchar; | 
| 671 | pred->str_len = strlen(pred->str_val); | 790 | pred->regex.field_len = strlen(pred->regex.pattern); | 
| 672 | } | 791 | } | 
| 673 | } else { | 792 | } else { | 
| 674 | if (field->is_signed) | 793 | if (field->is_signed) | 
| 675 | ret = strict_strtoll(pred->str_val, 0, &val); | 794 | ret = strict_strtoll(pred->regex.pattern, 0, &val); | 
| 676 | else | 795 | else | 
| 677 | ret = strict_strtoull(pred->str_val, 0, &val); | 796 | ret = strict_strtoull(pred->regex.pattern, 0, &val); | 
| 678 | if (ret) { | 797 | if (ret) { | 
| 679 | parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0); | 798 | parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0); | 
| 680 | return -EINVAL; | 799 | return -EINVAL; | 
| @@ -1045,8 +1164,8 @@ static struct filter_pred *create_pred(int op, char *operand1, char *operand2) | |||
| 1045 | return NULL; | 1164 | return NULL; | 
| 1046 | } | 1165 | } | 
| 1047 | 1166 | ||
| 1048 | strcpy(pred->str_val, operand2); | 1167 | strcpy(pred->regex.pattern, operand2); | 
| 1049 | pred->str_len = strlen(operand2); | 1168 | pred->regex.len = strlen(pred->regex.pattern); | 
| 1050 | 1169 | ||
| 1051 | pred->op = op; | 1170 | pred->op = op; | 
| 1052 | 1171 | ||
| diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index 9753fcc61bc5..c74848ddb85a 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
| @@ -48,11 +48,11 @@ | |||
| 48 | struct ____ftrace_##name { \ | 48 | struct ____ftrace_##name { \ | 
| 49 | tstruct \ | 49 | tstruct \ | 
| 50 | }; \ | 50 | }; \ | 
| 51 | static void __used ____ftrace_check_##name(void) \ | 51 | static void __always_unused ____ftrace_check_##name(void) \ | 
| 52 | { \ | 52 | { \ | 
| 53 | struct ____ftrace_##name *__entry = NULL; \ | 53 | struct ____ftrace_##name *__entry = NULL; \ | 
| 54 | \ | 54 | \ | 
| 55 | /* force cmpile-time check on F_printk() */ \ | 55 | /* force compile-time check on F_printk() */ \ | 
| 56 | printk(print); \ | 56 | printk(print); \ | 
| 57 | } | 57 | } | 
| 58 | 58 | ||
| diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 527e17eae575..ddee9c593732 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -14,6 +14,69 @@ static int sys_refcount_exit; | |||
| 14 | static DECLARE_BITMAP(enabled_enter_syscalls, NR_syscalls); | 14 | static DECLARE_BITMAP(enabled_enter_syscalls, NR_syscalls); | 
| 15 | static DECLARE_BITMAP(enabled_exit_syscalls, NR_syscalls); | 15 | static DECLARE_BITMAP(enabled_exit_syscalls, NR_syscalls); | 
| 16 | 16 | ||
| 17 | extern unsigned long __start_syscalls_metadata[]; | ||
| 18 | extern unsigned long __stop_syscalls_metadata[]; | ||
| 19 | |||
| 20 | static struct syscall_metadata **syscalls_metadata; | ||
| 21 | |||
| 22 | static struct syscall_metadata *find_syscall_meta(unsigned long syscall) | ||
| 23 | { | ||
| 24 | struct syscall_metadata *start; | ||
| 25 | struct syscall_metadata *stop; | ||
| 26 | char str[KSYM_SYMBOL_LEN]; | ||
| 27 | |||
| 28 | |||
| 29 | start = (struct syscall_metadata *)__start_syscalls_metadata; | ||
| 30 | stop = (struct syscall_metadata *)__stop_syscalls_metadata; | ||
| 31 | kallsyms_lookup(syscall, NULL, NULL, NULL, str); | ||
| 32 | |||
| 33 | for ( ; start < stop; start++) { | ||
| 34 | /* | ||
| 35 | * Only compare after the "sys" prefix. Archs that use | ||
| 36 | * syscall wrappers may have syscalls symbols aliases prefixed | ||
| 37 | * with "SyS" instead of "sys", leading to an unwanted | ||
| 38 | * mismatch. | ||
| 39 | */ | ||
| 40 | if (start->name && !strcmp(start->name + 3, str + 3)) | ||
| 41 | return start; | ||
| 42 | } | ||
| 43 | return NULL; | ||
| 44 | } | ||
| 45 | |||
| 46 | static struct syscall_metadata *syscall_nr_to_meta(int nr) | ||
| 47 | { | ||
| 48 | if (!syscalls_metadata || nr >= NR_syscalls || nr < 0) | ||
| 49 | return NULL; | ||
| 50 | |||
| 51 | return syscalls_metadata[nr]; | ||
| 52 | } | ||
| 53 | |||
| 54 | int syscall_name_to_nr(char *name) | ||
| 55 | { | ||
| 56 | int i; | ||
| 57 | |||
| 58 | if (!syscalls_metadata) | ||
| 59 | return -1; | ||
| 60 | |||
| 61 | for (i = 0; i < NR_syscalls; i++) { | ||
| 62 | if (syscalls_metadata[i]) { | ||
| 63 | if (!strcmp(syscalls_metadata[i]->name, name)) | ||
| 64 | return i; | ||
| 65 | } | ||
| 66 | } | ||
| 67 | return -1; | ||
| 68 | } | ||
| 69 | |||
| 70 | void set_syscall_enter_id(int num, int id) | ||
| 71 | { | ||
| 72 | syscalls_metadata[num]->enter_id = id; | ||
| 73 | } | ||
| 74 | |||
| 75 | void set_syscall_exit_id(int num, int id) | ||
| 76 | { | ||
| 77 | syscalls_metadata[num]->exit_id = id; | ||
| 78 | } | ||
| 79 | |||
| 17 | enum print_line_t | 80 | enum print_line_t | 
| 18 | print_syscall_enter(struct trace_iterator *iter, int flags) | 81 | print_syscall_enter(struct trace_iterator *iter, int flags) | 
| 19 | { | 82 | { | 
| @@ -375,6 +438,29 @@ struct trace_event event_syscall_exit = { | |||
| 375 | .trace = print_syscall_exit, | 438 | .trace = print_syscall_exit, | 
| 376 | }; | 439 | }; | 
| 377 | 440 | ||
| 441 | int __init init_ftrace_syscalls(void) | ||
| 442 | { | ||
| 443 | struct syscall_metadata *meta; | ||
| 444 | unsigned long addr; | ||
| 445 | int i; | ||
| 446 | |||
| 447 | syscalls_metadata = kzalloc(sizeof(*syscalls_metadata) * | ||
| 448 | NR_syscalls, GFP_KERNEL); | ||
| 449 | if (!syscalls_metadata) { | ||
| 450 | WARN_ON(1); | ||
| 451 | return -ENOMEM; | ||
| 452 | } | ||
| 453 | |||
| 454 | for (i = 0; i < NR_syscalls; i++) { | ||
| 455 | addr = arch_syscall_addr(i); | ||
| 456 | meta = find_syscall_meta(addr); | ||
| 457 | syscalls_metadata[i] = meta; | ||
| 458 | } | ||
| 459 | |||
| 460 | return 0; | ||
| 461 | } | ||
| 462 | core_initcall(init_ftrace_syscalls); | ||
| 463 | |||
| 378 | #ifdef CONFIG_EVENT_PROFILE | 464 | #ifdef CONFIG_EVENT_PROFILE | 
| 379 | 465 | ||
| 380 | static DECLARE_BITMAP(enabled_prof_enter_syscalls, NR_syscalls); | 466 | static DECLARE_BITMAP(enabled_prof_enter_syscalls, NR_syscalls); | 
