Magellan Linux

Contents of /trunk/kernel-lts/patches-3.4/0151-3.4.52-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2238 - (show annotations) (download)
Mon Jul 15 12:13:41 2013 UTC (10 years, 9 months ago) by niro
File size: 22670 byte(s)
-linux-3.4.52
1 diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
2 index 42dec04..0a5e8a5 100644
3 --- a/arch/arm/include/asm/cacheflush.h
4 +++ b/arch/arm/include/asm/cacheflush.h
5 @@ -305,9 +305,7 @@ static inline void flush_anon_page(struct vm_area_struct *vma,
6 }
7
8 #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
9 -static inline void flush_kernel_dcache_page(struct page *page)
10 -{
11 -}
12 +extern void flush_kernel_dcache_page(struct page *);
13
14 #define flush_dcache_mmap_lock(mapping) \
15 spin_lock_irq(&(mapping)->tree_lock)
16 diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
17 index 40ca11e..8f0d285 100644
18 --- a/arch/arm/mm/flush.c
19 +++ b/arch/arm/mm/flush.c
20 @@ -299,6 +299,39 @@ void flush_dcache_page(struct page *page)
21 EXPORT_SYMBOL(flush_dcache_page);
22
23 /*
24 + * Ensure cache coherency for the kernel mapping of this page. We can
25 + * assume that the page is pinned via kmap.
26 + *
27 + * If the page only exists in the page cache and there are no user
28 + * space mappings, this is a no-op since the page was already marked
29 + * dirty at creation. Otherwise, we need to flush the dirty kernel
30 + * cache lines directly.
31 + */
32 +void flush_kernel_dcache_page(struct page *page)
33 +{
34 + if (cache_is_vivt() || cache_is_vipt_aliasing()) {
35 + struct address_space *mapping;
36 +
37 + mapping = page_mapping(page);
38 +
39 + if (!mapping || mapping_mapped(mapping)) {
40 + void *addr;
41 +
42 + addr = page_address(page);
43 + /*
44 + * kmap_atomic() doesn't set the page virtual
45 + * address for highmem pages, and
46 + * kunmap_atomic() takes care of cache
47 + * flushing already.
48 + */
49 + if (!IS_ENABLED(CONFIG_HIGHMEM) || addr)
50 + __cpuc_flush_dcache_area(addr, PAGE_SIZE);
51 + }
52 + }
53 +}
54 +EXPORT_SYMBOL(flush_kernel_dcache_page);
55 +
56 +/*
57 * Flush an anonymous page so that users of get_user_pages()
58 * can safely access the data. The expected sequence is:
59 *
60 diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c
61 index d51225f..eb5293a 100644
62 --- a/arch/arm/mm/nommu.c
63 +++ b/arch/arm/mm/nommu.c
64 @@ -57,6 +57,12 @@ void flush_dcache_page(struct page *page)
65 }
66 EXPORT_SYMBOL(flush_dcache_page);
67
68 +void flush_kernel_dcache_page(struct page *page)
69 +{
70 + __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
71 +}
72 +EXPORT_SYMBOL(flush_kernel_dcache_page);
73 +
74 void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
75 unsigned long uaddr, void *dst, const void *src,
76 unsigned long len)
77 diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c
78 index 147614e..6a8a382 100644
79 --- a/drivers/net/wan/dlci.c
80 +++ b/drivers/net/wan/dlci.c
81 @@ -384,21 +384,37 @@ static int dlci_del(struct dlci_add *dlci)
82 struct frad_local *flp;
83 struct net_device *master, *slave;
84 int err;
85 + bool found = false;
86 +
87 + rtnl_lock();
88
89 /* validate slave device */
90 master = __dev_get_by_name(&init_net, dlci->devname);
91 - if (!master)
92 - return -ENODEV;
93 + if (!master) {
94 + err = -ENODEV;
95 + goto out;
96 + }
97 +
98 + list_for_each_entry(dlp, &dlci_devs, list) {
99 + if (dlp->master == master) {
100 + found = true;
101 + break;
102 + }
103 + }
104 + if (!found) {
105 + err = -ENODEV;
106 + goto out;
107 + }
108
109 if (netif_running(master)) {
110 - return -EBUSY;
111 + err = -EBUSY;
112 + goto out;
113 }
114
115 dlp = netdev_priv(master);
116 slave = dlp->slave;
117 flp = netdev_priv(slave);
118
119 - rtnl_lock();
120 err = (*flp->deassoc)(slave, master);
121 if (!err) {
122 list_del(&dlp->list);
123 @@ -407,8 +423,8 @@ static int dlci_del(struct dlci_add *dlci)
124
125 dev_put(slave);
126 }
127 +out:
128 rtnl_unlock();
129 -
130 return err;
131 }
132
133 diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
134 index 7d47514..2e99f79 100644
135 --- a/drivers/tty/serial/pch_uart.c
136 +++ b/drivers/tty/serial/pch_uart.c
137 @@ -1034,22 +1034,37 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv)
138 static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr)
139 {
140 u8 fcr = ioread8(priv->membase + UART_FCR);
141 + struct uart_port *port = &priv->port;
142 + struct tty_struct *tty = tty_port_tty_get(&port->state->port);
143 + char *error_msg[5] = {};
144 + int i = 0;
145
146 /* Reset FIFO */
147 fcr |= UART_FCR_CLEAR_RCVR;
148 iowrite8(fcr, priv->membase + UART_FCR);
149
150 if (lsr & PCH_UART_LSR_ERR)
151 - dev_err(&priv->pdev->dev, "Error data in FIFO\n");
152 + error_msg[i++] = "Error data in FIFO\n";
153
154 - if (lsr & UART_LSR_FE)
155 - dev_err(&priv->pdev->dev, "Framing Error\n");
156 + if (lsr & UART_LSR_FE) {
157 + port->icount.frame++;
158 + error_msg[i++] = " Framing Error\n";
159 + }
160
161 - if (lsr & UART_LSR_PE)
162 - dev_err(&priv->pdev->dev, "Parity Error\n");
163 + if (lsr & UART_LSR_PE) {
164 + port->icount.parity++;
165 + error_msg[i++] = " Parity Error\n";
166 + }
167
168 - if (lsr & UART_LSR_OE)
169 - dev_err(&priv->pdev->dev, "Overrun Error\n");
170 + if (lsr & UART_LSR_OE) {
171 + port->icount.overrun++;
172 + error_msg[i++] = " Overrun Error\n";
173 + }
174 +
175 + if (tty == NULL) {
176 + for (i = 0; error_msg[i] != NULL; i++)
177 + dev_err(&priv->pdev->dev, error_msg[i]);
178 + }
179 }
180
181 static irqreturn_t pch_uart_interrupt(int irq, void *dev_id)
182 diff --git a/fs/exec.c b/fs/exec.c
183 index 2b7f5ff..0ea0b4c 100644
184 --- a/fs/exec.c
185 +++ b/fs/exec.c
186 @@ -1163,13 +1163,6 @@ void setup_new_exec(struct linux_binprm * bprm)
187 set_dumpable(current->mm, suid_dumpable);
188 }
189
190 - /*
191 - * Flush performance counters when crossing a
192 - * security domain:
193 - */
194 - if (!get_dumpable(current->mm))
195 - perf_event_exit_task(current);
196 -
197 /* An exec changes our domain. We are no longer part of the thread
198 group */
199
200 @@ -1233,6 +1226,15 @@ void install_exec_creds(struct linux_binprm *bprm)
201
202 commit_creds(bprm->cred);
203 bprm->cred = NULL;
204 +
205 + /*
206 + * Disable monitoring for regular users
207 + * when executing setuid binaries. Must
208 + * wait until new credentials are committed
209 + * by commit_creds() above
210 + */
211 + if (get_dumpable(current->mm) != SUID_DUMP_USER)
212 + perf_event_exit_task(current);
213 /*
214 * cred_guard_mutex must be held at least to this point to prevent
215 * ptrace_attach() from altering our determination of the task's
216 diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
217 index 8640a12..25c472b 100644
218 --- a/fs/ubifs/dir.c
219 +++ b/fs/ubifs/dir.c
220 @@ -357,31 +357,50 @@ static unsigned int vfs_dent_type(uint8_t type)
221 static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
222 {
223 int err, over = 0;
224 + loff_t pos = file->f_pos;
225 struct qstr nm;
226 union ubifs_key key;
227 struct ubifs_dent_node *dent;
228 struct inode *dir = file->f_path.dentry->d_inode;
229 struct ubifs_info *c = dir->i_sb->s_fs_info;
230
231 - dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, file->f_pos);
232 + dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, pos);
233
234 - if (file->f_pos > UBIFS_S_KEY_HASH_MASK || file->f_pos == 2)
235 + if (pos > UBIFS_S_KEY_HASH_MASK || pos == 2)
236 /*
237 * The directory was seek'ed to a senseless position or there
238 * are no more entries.
239 */
240 return 0;
241
242 + if (file->f_version == 0) {
243 + /*
244 + * The file was seek'ed, which means that @file->private_data
245 + * is now invalid. This may also be just the first
246 + * 'ubifs_readdir()' invocation, in which case
247 + * @file->private_data is NULL, and the below code is
248 + * basically a no-op.
249 + */
250 + kfree(file->private_data);
251 + file->private_data = NULL;
252 + }
253 +
254 + /*
255 + * 'generic_file_llseek()' unconditionally sets @file->f_version to
256 + * zero, and we use this for detecting whether the file was seek'ed.
257 + */
258 + file->f_version = 1;
259 +
260 /* File positions 0 and 1 correspond to "." and ".." */
261 - if (file->f_pos == 0) {
262 + if (pos == 0) {
263 ubifs_assert(!file->private_data);
264 over = filldir(dirent, ".", 1, 0, dir->i_ino, DT_DIR);
265 if (over)
266 return 0;
267 - file->f_pos = 1;
268 + file->f_pos = pos = 1;
269 }
270
271 - if (file->f_pos == 1) {
272 + if (pos == 1) {
273 ubifs_assert(!file->private_data);
274 over = filldir(dirent, "..", 2, 1,
275 parent_ino(file->f_path.dentry), DT_DIR);
276 @@ -397,7 +416,7 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
277 goto out;
278 }
279
280 - file->f_pos = key_hash_flash(c, &dent->key);
281 + file->f_pos = pos = key_hash_flash(c, &dent->key);
282 file->private_data = dent;
283 }
284
285 @@ -405,17 +424,16 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
286 if (!dent) {
287 /*
288 * The directory was seek'ed to and is now readdir'ed.
289 - * Find the entry corresponding to @file->f_pos or the
290 - * closest one.
291 + * Find the entry corresponding to @pos or the closest one.
292 */
293 - dent_key_init_hash(c, &key, dir->i_ino, file->f_pos);
294 + dent_key_init_hash(c, &key, dir->i_ino, pos);
295 nm.name = NULL;
296 dent = ubifs_tnc_next_ent(c, &key, &nm);
297 if (IS_ERR(dent)) {
298 err = PTR_ERR(dent);
299 goto out;
300 }
301 - file->f_pos = key_hash_flash(c, &dent->key);
302 + file->f_pos = pos = key_hash_flash(c, &dent->key);
303 file->private_data = dent;
304 }
305
306 @@ -427,7 +445,7 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
307 ubifs_inode(dir)->creat_sqnum);
308
309 nm.len = le16_to_cpu(dent->nlen);
310 - over = filldir(dirent, dent->name, nm.len, file->f_pos,
311 + over = filldir(dirent, dent->name, nm.len, pos,
312 le64_to_cpu(dent->inum),
313 vfs_dent_type(dent->type));
314 if (over)
315 @@ -443,9 +461,17 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
316 }
317
318 kfree(file->private_data);
319 - file->f_pos = key_hash_flash(c, &dent->key);
320 + file->f_pos = pos = key_hash_flash(c, &dent->key);
321 file->private_data = dent;
322 cond_resched();
323 +
324 + if (file->f_version == 0)
325 + /*
326 + * The file was seek'ed meanwhile, lets return and start
327 + * reading direntries from the new position on the next
328 + * invocation.
329 + */
330 + return 0;
331 }
332
333 out:
334 @@ -456,15 +482,13 @@ out:
335
336 kfree(file->private_data);
337 file->private_data = NULL;
338 + /* 2 is a special value indicating that there are no more direntries */
339 file->f_pos = 2;
340 return 0;
341 }
342
343 -/* If a directory is seeked, we have to free saved readdir() state */
344 static loff_t ubifs_dir_llseek(struct file *file, loff_t offset, int origin)
345 {
346 - kfree(file->private_data);
347 - file->private_data = NULL;
348 return generic_file_llseek(file, offset, origin);
349 }
350
351 diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
352 index 8e9a069..89fb74e 100644
353 --- a/include/linux/perf_event.h
354 +++ b/include/linux/perf_event.h
355 @@ -950,8 +950,7 @@ struct perf_event {
356 /* mmap bits */
357 struct mutex mmap_mutex;
358 atomic_t mmap_count;
359 - int mmap_locked;
360 - struct user_struct *mmap_user;
361 +
362 struct ring_buffer *rb;
363 struct list_head rb_entry;
364
365 diff --git a/kernel/events/core.c b/kernel/events/core.c
366 index 839a24f..7ceb270 100644
367 --- a/kernel/events/core.c
368 +++ b/kernel/events/core.c
369 @@ -193,9 +193,6 @@ static void cpu_ctx_sched_in(struct perf_cpu_context *cpuctx,
370 static void update_context_time(struct perf_event_context *ctx);
371 static u64 perf_event_time(struct perf_event *event);
372
373 -static void ring_buffer_attach(struct perf_event *event,
374 - struct ring_buffer *rb);
375 -
376 void __weak perf_event_print_debug(void) { }
377
378 extern __weak const char *perf_pmu_name(void)
379 @@ -2849,6 +2846,7 @@ static void free_event_rcu(struct rcu_head *head)
380 }
381
382 static void ring_buffer_put(struct ring_buffer *rb);
383 +static void ring_buffer_detach(struct perf_event *event, struct ring_buffer *rb);
384
385 static void free_event(struct perf_event *event)
386 {
387 @@ -2873,15 +2871,30 @@ static void free_event(struct perf_event *event)
388 if (has_branch_stack(event)) {
389 static_key_slow_dec_deferred(&perf_sched_events);
390 /* is system-wide event */
391 - if (!(event->attach_state & PERF_ATTACH_TASK))
392 + if (!(event->attach_state & PERF_ATTACH_TASK)) {
393 atomic_dec(&per_cpu(perf_branch_stack_events,
394 event->cpu));
395 + }
396 }
397 }
398
399 if (event->rb) {
400 - ring_buffer_put(event->rb);
401 - event->rb = NULL;
402 + struct ring_buffer *rb;
403 +
404 + /*
405 + * Can happen when we close an event with re-directed output.
406 + *
407 + * Since we have a 0 refcount, perf_mmap_close() will skip
408 + * over us; possibly making our ring_buffer_put() the last.
409 + */
410 + mutex_lock(&event->mmap_mutex);
411 + rb = event->rb;
412 + if (rb) {
413 + rcu_assign_pointer(event->rb, NULL);
414 + ring_buffer_detach(event, rb);
415 + ring_buffer_put(rb); /* could be last */
416 + }
417 + mutex_unlock(&event->mmap_mutex);
418 }
419
420 if (is_cgroup_event(event))
421 @@ -3119,30 +3132,13 @@ static unsigned int perf_poll(struct file *file, poll_table *wait)
422 unsigned int events = POLL_HUP;
423
424 /*
425 - * Race between perf_event_set_output() and perf_poll(): perf_poll()
426 - * grabs the rb reference but perf_event_set_output() overrides it.
427 - * Here is the timeline for two threads T1, T2:
428 - * t0: T1, rb = rcu_dereference(event->rb)
429 - * t1: T2, old_rb = event->rb
430 - * t2: T2, event->rb = new rb
431 - * t3: T2, ring_buffer_detach(old_rb)
432 - * t4: T1, ring_buffer_attach(rb1)
433 - * t5: T1, poll_wait(event->waitq)
434 - *
435 - * To avoid this problem, we grab mmap_mutex in perf_poll()
436 - * thereby ensuring that the assignment of the new ring buffer
437 - * and the detachment of the old buffer appear atomic to perf_poll()
438 + * Pin the event->rb by taking event->mmap_mutex; otherwise
439 + * perf_event_set_output() can swizzle our rb and make us miss wakeups.
440 */
441 mutex_lock(&event->mmap_mutex);
442 -
443 - rcu_read_lock();
444 - rb = rcu_dereference(event->rb);
445 - if (rb) {
446 - ring_buffer_attach(event, rb);
447 + rb = event->rb;
448 + if (rb)
449 events = atomic_xchg(&rb->poll, 0);
450 - }
451 - rcu_read_unlock();
452 -
453 mutex_unlock(&event->mmap_mutex);
454
455 poll_wait(file, &event->waitq, wait);
456 @@ -3459,16 +3455,12 @@ static void ring_buffer_attach(struct perf_event *event,
457 return;
458
459 spin_lock_irqsave(&rb->event_lock, flags);
460 - if (!list_empty(&event->rb_entry))
461 - goto unlock;
462 -
463 - list_add(&event->rb_entry, &rb->event_list);
464 -unlock:
465 + if (list_empty(&event->rb_entry))
466 + list_add(&event->rb_entry, &rb->event_list);
467 spin_unlock_irqrestore(&rb->event_lock, flags);
468 }
469
470 -static void ring_buffer_detach(struct perf_event *event,
471 - struct ring_buffer *rb)
472 +static void ring_buffer_detach(struct perf_event *event, struct ring_buffer *rb)
473 {
474 unsigned long flags;
475
476 @@ -3487,13 +3479,10 @@ static void ring_buffer_wakeup(struct perf_event *event)
477
478 rcu_read_lock();
479 rb = rcu_dereference(event->rb);
480 - if (!rb)
481 - goto unlock;
482 -
483 - list_for_each_entry_rcu(event, &rb->event_list, rb_entry)
484 - wake_up_all(&event->waitq);
485 -
486 -unlock:
487 + if (rb) {
488 + list_for_each_entry_rcu(event, &rb->event_list, rb_entry)
489 + wake_up_all(&event->waitq);
490 + }
491 rcu_read_unlock();
492 }
493
494 @@ -3522,18 +3511,10 @@ static struct ring_buffer *ring_buffer_get(struct perf_event *event)
495
496 static void ring_buffer_put(struct ring_buffer *rb)
497 {
498 - struct perf_event *event, *n;
499 - unsigned long flags;
500 -
501 if (!atomic_dec_and_test(&rb->refcount))
502 return;
503
504 - spin_lock_irqsave(&rb->event_lock, flags);
505 - list_for_each_entry_safe(event, n, &rb->event_list, rb_entry) {
506 - list_del_init(&event->rb_entry);
507 - wake_up_all(&event->waitq);
508 - }
509 - spin_unlock_irqrestore(&rb->event_lock, flags);
510 + WARN_ON_ONCE(!list_empty(&rb->event_list));
511
512 call_rcu(&rb->rcu_head, rb_free_rcu);
513 }
514 @@ -3543,26 +3524,100 @@ static void perf_mmap_open(struct vm_area_struct *vma)
515 struct perf_event *event = vma->vm_file->private_data;
516
517 atomic_inc(&event->mmap_count);
518 + atomic_inc(&event->rb->mmap_count);
519 }
520
521 +/*
522 + * A buffer can be mmap()ed multiple times; either directly through the same
523 + * event, or through other events by use of perf_event_set_output().
524 + *
525 + * In order to undo the VM accounting done by perf_mmap() we need to destroy
526 + * the buffer here, where we still have a VM context. This means we need
527 + * to detach all events redirecting to us.
528 + */
529 static void perf_mmap_close(struct vm_area_struct *vma)
530 {
531 struct perf_event *event = vma->vm_file->private_data;
532
533 - if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) {
534 - unsigned long size = perf_data_size(event->rb);
535 - struct user_struct *user = event->mmap_user;
536 - struct ring_buffer *rb = event->rb;
537 + struct ring_buffer *rb = event->rb;
538 + struct user_struct *mmap_user = rb->mmap_user;
539 + int mmap_locked = rb->mmap_locked;
540 + unsigned long size = perf_data_size(rb);
541 +
542 + atomic_dec(&rb->mmap_count);
543 +
544 + if (!atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex))
545 + return;
546 +
547 + /* Detach current event from the buffer. */
548 + rcu_assign_pointer(event->rb, NULL);
549 + ring_buffer_detach(event, rb);
550 + mutex_unlock(&event->mmap_mutex);
551 +
552 + /* If there's still other mmap()s of this buffer, we're done. */
553 + if (atomic_read(&rb->mmap_count)) {
554 + ring_buffer_put(rb); /* can't be last */
555 + return;
556 + }
557 +
558 + /*
559 + * No other mmap()s, detach from all other events that might redirect
560 + * into the now unreachable buffer. Somewhat complicated by the
561 + * fact that rb::event_lock otherwise nests inside mmap_mutex.
562 + */
563 +again:
564 + rcu_read_lock();
565 + list_for_each_entry_rcu(event, &rb->event_list, rb_entry) {
566 + if (!atomic_long_inc_not_zero(&event->refcount)) {
567 + /*
568 + * This event is en-route to free_event() which will
569 + * detach it and remove it from the list.
570 + */
571 + continue;
572 + }
573 + rcu_read_unlock();
574
575 - atomic_long_sub((size >> PAGE_SHIFT) + 1, &user->locked_vm);
576 - vma->vm_mm->pinned_vm -= event->mmap_locked;
577 - rcu_assign_pointer(event->rb, NULL);
578 - ring_buffer_detach(event, rb);
579 + mutex_lock(&event->mmap_mutex);
580 + /*
581 + * Check we didn't race with perf_event_set_output() which can
582 + * swizzle the rb from under us while we were waiting to
583 + * acquire mmap_mutex.
584 + *
585 + * If we find a different rb; ignore this event, a next
586 + * iteration will no longer find it on the list. We have to
587 + * still restart the iteration to make sure we're not now
588 + * iterating the wrong list.
589 + */
590 + if (event->rb == rb) {
591 + rcu_assign_pointer(event->rb, NULL);
592 + ring_buffer_detach(event, rb);
593 + ring_buffer_put(rb); /* can't be last, we still have one */
594 + }
595 mutex_unlock(&event->mmap_mutex);
596 + put_event(event);
597
598 - ring_buffer_put(rb);
599 - free_uid(user);
600 + /*
601 + * Restart the iteration; either we're on the wrong list or
602 + * destroyed its integrity by doing a deletion.
603 + */
604 + goto again;
605 }
606 + rcu_read_unlock();
607 +
608 + /*
609 + * It could be there's still a few 0-ref events on the list; they'll
610 + * get cleaned up by free_event() -- they'll also still have their
611 + * ref on the rb and will free it whenever they are done with it.
612 + *
613 + * Aside from that, this buffer is 'fully' detached and unmapped,
614 + * undo the VM accounting.
615 + */
616 +
617 + atomic_long_sub((size >> PAGE_SHIFT) + 1, &mmap_user->locked_vm);
618 + vma->vm_mm->pinned_vm -= mmap_locked;
619 + free_uid(mmap_user);
620 +
621 + ring_buffer_put(rb); /* could be last */
622 }
623
624 static const struct vm_operations_struct perf_mmap_vmops = {
625 @@ -3612,12 +3667,24 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
626 return -EINVAL;
627
628 WARN_ON_ONCE(event->ctx->parent_ctx);
629 +again:
630 mutex_lock(&event->mmap_mutex);
631 if (event->rb) {
632 - if (event->rb->nr_pages == nr_pages)
633 - atomic_inc(&event->rb->refcount);
634 - else
635 + if (event->rb->nr_pages != nr_pages) {
636 ret = -EINVAL;
637 + goto unlock;
638 + }
639 +
640 + if (!atomic_inc_not_zero(&event->rb->mmap_count)) {
641 + /*
642 + * Raced against perf_mmap_close() through
643 + * perf_event_set_output(). Try again, hope for better
644 + * luck.
645 + */
646 + mutex_unlock(&event->mmap_mutex);
647 + goto again;
648 + }
649 +
650 goto unlock;
651 }
652
653 @@ -3658,12 +3725,16 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
654 ret = -ENOMEM;
655 goto unlock;
656 }
657 - rcu_assign_pointer(event->rb, rb);
658 +
659 + atomic_set(&rb->mmap_count, 1);
660 + rb->mmap_locked = extra;
661 + rb->mmap_user = get_current_user();
662
663 atomic_long_add(user_extra, &user->locked_vm);
664 - event->mmap_locked = extra;
665 - event->mmap_user = get_current_user();
666 - vma->vm_mm->pinned_vm += event->mmap_locked;
667 + vma->vm_mm->pinned_vm += extra;
668 +
669 + ring_buffer_attach(event, rb);
670 + rcu_assign_pointer(event->rb, rb);
671
672 perf_event_update_userpage(event);
673
674 @@ -3672,7 +3743,11 @@ unlock:
675 atomic_inc(&event->mmap_count);
676 mutex_unlock(&event->mmap_mutex);
677
678 - vma->vm_flags |= VM_RESERVED;
679 + /*
680 + * Since pinned accounting is per vm we cannot allow fork() to copy our
681 + * vma.
682 + */
683 + vma->vm_flags |= VM_DONTCOPY | VM_RESERVED;
684 vma->vm_ops = &perf_mmap_vmops;
685
686 return ret;
687 @@ -6161,6 +6236,8 @@ set:
688 if (atomic_read(&event->mmap_count))
689 goto unlock;
690
691 + old_rb = event->rb;
692 +
693 if (output_event) {
694 /* get the rb we want to redirect to */
695 rb = ring_buffer_get(output_event);
696 @@ -6168,16 +6245,28 @@ set:
697 goto unlock;
698 }
699
700 - old_rb = event->rb;
701 - rcu_assign_pointer(event->rb, rb);
702 if (old_rb)
703 ring_buffer_detach(event, old_rb);
704 +
705 + if (rb)
706 + ring_buffer_attach(event, rb);
707 +
708 + rcu_assign_pointer(event->rb, rb);
709 +
710 + if (old_rb) {
711 + ring_buffer_put(old_rb);
712 + /*
713 + * Since we detached before setting the new rb, so that we
714 + * could attach the new rb, we could have missed a wakeup.
715 + * Provide it now.
716 + */
717 + wake_up_all(&event->waitq);
718 + }
719 +
720 ret = 0;
721 unlock:
722 mutex_unlock(&event->mmap_mutex);
723
724 - if (old_rb)
725 - ring_buffer_put(old_rb);
726 out:
727 return ret;
728 }
729 diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c
730 index bb38c4d..fc8bfcf 100644
731 --- a/kernel/events/hw_breakpoint.c
732 +++ b/kernel/events/hw_breakpoint.c
733 @@ -147,7 +147,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp,
734 return;
735 }
736
737 - for_each_online_cpu(cpu) {
738 + for_each_possible_cpu(cpu) {
739 unsigned int nr;
740
741 nr = per_cpu(nr_cpu_bp_pinned[type], cpu);
742 @@ -233,7 +233,7 @@ toggle_bp_slot(struct perf_event *bp, bool enable, enum bp_type_idx type,
743 if (cpu >= 0) {
744 toggle_bp_task_slot(bp, cpu, enable, type, weight);
745 } else {
746 - for_each_online_cpu(cpu)
747 + for_each_possible_cpu(cpu)
748 toggle_bp_task_slot(bp, cpu, enable, type, weight);
749 }
750
751 diff --git a/kernel/events/internal.h b/kernel/events/internal.h
752 index b0b107f..b400e64 100644
753 --- a/kernel/events/internal.h
754 +++ b/kernel/events/internal.h
755 @@ -30,6 +30,10 @@ struct ring_buffer {
756 spinlock_t event_lock;
757 struct list_head event_list;
758
759 + atomic_t mmap_count;
760 + unsigned long mmap_locked;
761 + struct user_struct *mmap_user;
762 +
763 struct perf_event_mmap_page *user_page;
764 void *data_pages[0];
765 };
766 diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
767 index fa07aed..932420d 100644
768 --- a/net/bluetooth/l2cap_core.c
769 +++ b/net/bluetooth/l2cap_core.c
770 @@ -1880,6 +1880,9 @@ static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
771 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %d",
772 conn, code, ident, dlen);
773
774 + if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
775 + return NULL;
776 +
777 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
778 count = min_t(unsigned int, conn->mtu, len);
779