diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-11-19 12:14:57 -0500 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-11-19 12:17:38 -0500 |
| commit | 54499b2a926964b6b671fd03dcdc83c444b8f467 (patch) | |
| tree | ba57cd39218554850e4b920747b9e71f1f9842ee /kernel/trace | |
| parent | 2eb5252e2fffc52745a672152c7df597f4041045 (diff) | |
| parent | 0485c9dc24ec0939b42ca5104c0373297506b555 (diff) | |
Merge tag 'drm-intel-fixes-2014-11-19' into drm-intel-next-queued
So with all the code movement and extraction in intel_pm.c in -next
git is hopelessly confused with
commit 2208d655a91f9879bd9a39ff9df05dd668b3512c
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date: Fri Nov 14 09:25:29 2014 +0100
drm/i915: drop WaSetupGtModeTdRowDispatch:snb
from -fixes. Worse even small changes in -next move around the
conflict context so rerere is equally useless. Let's just backmerge
and be done with it.
Conflicts:
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/intel_pm.c
Except for git getting lost no tricky conflicts really.
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/ftrace.c | 54 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer.c | 81 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 33 | ||||
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 8 |
4 files changed, 110 insertions, 66 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index fb186b9ddf51..31c90fec4158 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -1925,8 +1925,16 @@ ftrace_find_tramp_ops_curr(struct dyn_ftrace *rec) | |||
| 1925 | * when we are adding another op to the rec or removing the | 1925 | * when we are adding another op to the rec or removing the |
| 1926 | * current one. Thus, if the op is being added, we can | 1926 | * current one. Thus, if the op is being added, we can |
| 1927 | * ignore it because it hasn't attached itself to the rec | 1927 | * ignore it because it hasn't attached itself to the rec |
| 1928 | * yet. That means we just need to find the op that has a | 1928 | * yet. |
| 1929 | * trampoline and is not beeing added. | 1929 | * |
| 1930 | * If an ops is being modified (hooking to different functions) | ||
| 1931 | * then we don't care about the new functions that are being | ||
| 1932 | * added, just the old ones (that are probably being removed). | ||
| 1933 | * | ||
| 1934 | * If we are adding an ops to a function that already is using | ||
| 1935 | * a trampoline, it needs to be removed (trampolines are only | ||
| 1936 | * for single ops connected), then an ops that is not being | ||
| 1937 | * modified also needs to be checked. | ||
| 1930 | */ | 1938 | */ |
| 1931 | do_for_each_ftrace_op(op, ftrace_ops_list) { | 1939 | do_for_each_ftrace_op(op, ftrace_ops_list) { |
| 1932 | 1940 | ||
| @@ -1940,17 +1948,23 @@ ftrace_find_tramp_ops_curr(struct dyn_ftrace *rec) | |||
| 1940 | if (op->flags & FTRACE_OPS_FL_ADDING) | 1948 | if (op->flags & FTRACE_OPS_FL_ADDING) |
| 1941 | continue; | 1949 | continue; |
| 1942 | 1950 | ||
| 1951 | |||
| 1943 | /* | 1952 | /* |
| 1944 | * If the ops is not being added and has a trampoline, | 1953 | * If the ops is being modified and is in the old |
| 1945 | * then it must be the one that we want! | 1954 | * hash, then it is probably being removed from this |
| 1955 | * function. | ||
| 1946 | */ | 1956 | */ |
| 1947 | if (hash_contains_ip(ip, op->func_hash)) | ||
| 1948 | return op; | ||
| 1949 | |||
| 1950 | /* If the ops is being modified, it may be in the old hash. */ | ||
| 1951 | if ((op->flags & FTRACE_OPS_FL_MODIFYING) && | 1957 | if ((op->flags & FTRACE_OPS_FL_MODIFYING) && |
| 1952 | hash_contains_ip(ip, &op->old_hash)) | 1958 | hash_contains_ip(ip, &op->old_hash)) |
| 1953 | return op; | 1959 | return op; |
| 1960 | /* | ||
| 1961 | * If the ops is not being added or modified, and it's | ||
| 1962 | * in its normal filter hash, then this must be the one | ||
| 1963 | * we want! | ||
| 1964 | */ | ||
| 1965 | if (!(op->flags & FTRACE_OPS_FL_MODIFYING) && | ||
| 1966 | hash_contains_ip(ip, op->func_hash)) | ||
| 1967 | return op; | ||
| 1954 | 1968 | ||
| 1955 | } while_for_each_ftrace_op(op); | 1969 | } while_for_each_ftrace_op(op); |
| 1956 | 1970 | ||
| @@ -2293,10 +2307,13 @@ static void ftrace_run_update_code(int command) | |||
| 2293 | FTRACE_WARN_ON(ret); | 2307 | FTRACE_WARN_ON(ret); |
| 2294 | } | 2308 | } |
| 2295 | 2309 | ||
| 2296 | static void ftrace_run_modify_code(struct ftrace_ops *ops, int command) | 2310 | static void ftrace_run_modify_code(struct ftrace_ops *ops, int command, |
| 2311 | struct ftrace_hash *old_hash) | ||
| 2297 | { | 2312 | { |
| 2298 | ops->flags |= FTRACE_OPS_FL_MODIFYING; | 2313 | ops->flags |= FTRACE_OPS_FL_MODIFYING; |
| 2314 | ops->old_hash.filter_hash = old_hash; | ||
| 2299 | ftrace_run_update_code(command); | 2315 | ftrace_run_update_code(command); |
| 2316 | ops->old_hash.filter_hash = NULL; | ||
| 2300 | ops->flags &= ~FTRACE_OPS_FL_MODIFYING; | 2317 | ops->flags &= ~FTRACE_OPS_FL_MODIFYING; |
| 2301 | } | 2318 | } |
| 2302 | 2319 | ||
| @@ -3340,7 +3357,7 @@ static struct ftrace_ops trace_probe_ops __read_mostly = | |||
| 3340 | 3357 | ||
| 3341 | static int ftrace_probe_registered; | 3358 | static int ftrace_probe_registered; |
| 3342 | 3359 | ||
| 3343 | static void __enable_ftrace_function_probe(void) | 3360 | static void __enable_ftrace_function_probe(struct ftrace_hash *old_hash) |
| 3344 | { | 3361 | { |
| 3345 | int ret; | 3362 | int ret; |
| 3346 | int i; | 3363 | int i; |
| @@ -3348,7 +3365,8 @@ static void __enable_ftrace_function_probe(void) | |||
| 3348 | if (ftrace_probe_registered) { | 3365 | if (ftrace_probe_registered) { |
| 3349 | /* still need to update the function call sites */ | 3366 | /* still need to update the function call sites */ |
| 3350 | if (ftrace_enabled) | 3367 | if (ftrace_enabled) |
| 3351 | ftrace_run_modify_code(&trace_probe_ops, FTRACE_UPDATE_CALLS); | 3368 | ftrace_run_modify_code(&trace_probe_ops, FTRACE_UPDATE_CALLS, |
| 3369 | old_hash); | ||
| 3352 | return; | 3370 | return; |
| 3353 | } | 3371 | } |
| 3354 | 3372 | ||
| @@ -3477,13 +3495,14 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | |||
| 3477 | } while_for_each_ftrace_rec(); | 3495 | } while_for_each_ftrace_rec(); |
| 3478 | 3496 | ||
| 3479 | ret = ftrace_hash_move(&trace_probe_ops, 1, orig_hash, hash); | 3497 | ret = ftrace_hash_move(&trace_probe_ops, 1, orig_hash, hash); |
| 3498 | |||
| 3499 | __enable_ftrace_function_probe(old_hash); | ||
| 3500 | |||
| 3480 | if (!ret) | 3501 | if (!ret) |
| 3481 | free_ftrace_hash_rcu(old_hash); | 3502 | free_ftrace_hash_rcu(old_hash); |
| 3482 | else | 3503 | else |
| 3483 | count = ret; | 3504 | count = ret; |
| 3484 | 3505 | ||
| 3485 | __enable_ftrace_function_probe(); | ||
| 3486 | |||
| 3487 | out_unlock: | 3506 | out_unlock: |
| 3488 | mutex_unlock(&ftrace_lock); | 3507 | mutex_unlock(&ftrace_lock); |
| 3489 | out: | 3508 | out: |
| @@ -3764,10 +3783,11 @@ ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove) | |||
| 3764 | return add_hash_entry(hash, ip); | 3783 | return add_hash_entry(hash, ip); |
| 3765 | } | 3784 | } |
| 3766 | 3785 | ||
| 3767 | static void ftrace_ops_update_code(struct ftrace_ops *ops) | 3786 | static void ftrace_ops_update_code(struct ftrace_ops *ops, |
| 3787 | struct ftrace_hash *old_hash) | ||
| 3768 | { | 3788 | { |
| 3769 | if (ops->flags & FTRACE_OPS_FL_ENABLED && ftrace_enabled) | 3789 | if (ops->flags & FTRACE_OPS_FL_ENABLED && ftrace_enabled) |
| 3770 | ftrace_run_modify_code(ops, FTRACE_UPDATE_CALLS); | 3790 | ftrace_run_modify_code(ops, FTRACE_UPDATE_CALLS, old_hash); |
| 3771 | } | 3791 | } |
| 3772 | 3792 | ||
| 3773 | static int | 3793 | static int |
| @@ -3813,7 +3833,7 @@ ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len, | |||
| 3813 | old_hash = *orig_hash; | 3833 | old_hash = *orig_hash; |
| 3814 | ret = ftrace_hash_move(ops, enable, orig_hash, hash); | 3834 | ret = ftrace_hash_move(ops, enable, orig_hash, hash); |
| 3815 | if (!ret) { | 3835 | if (!ret) { |
| 3816 | ftrace_ops_update_code(ops); | 3836 | ftrace_ops_update_code(ops, old_hash); |
| 3817 | free_ftrace_hash_rcu(old_hash); | 3837 | free_ftrace_hash_rcu(old_hash); |
| 3818 | } | 3838 | } |
| 3819 | mutex_unlock(&ftrace_lock); | 3839 | mutex_unlock(&ftrace_lock); |
| @@ -4058,7 +4078,7 @@ int ftrace_regex_release(struct inode *inode, struct file *file) | |||
| 4058 | ret = ftrace_hash_move(iter->ops, filter_hash, | 4078 | ret = ftrace_hash_move(iter->ops, filter_hash, |
| 4059 | orig_hash, iter->hash); | 4079 | orig_hash, iter->hash); |
| 4060 | if (!ret) { | 4080 | if (!ret) { |
| 4061 | ftrace_ops_update_code(iter->ops); | 4081 | ftrace_ops_update_code(iter->ops, old_hash); |
| 4062 | free_ftrace_hash_rcu(old_hash); | 4082 | free_ftrace_hash_rcu(old_hash); |
| 4063 | } | 4083 | } |
| 4064 | mutex_unlock(&ftrace_lock); | 4084 | mutex_unlock(&ftrace_lock); |
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 2d75c94ae87d..a56e07c8d15b 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -538,16 +538,18 @@ static void rb_wake_up_waiters(struct irq_work *work) | |||
| 538 | * ring_buffer_wait - wait for input to the ring buffer | 538 | * ring_buffer_wait - wait for input to the ring buffer |
| 539 | * @buffer: buffer to wait on | 539 | * @buffer: buffer to wait on |
| 540 | * @cpu: the cpu buffer to wait on | 540 | * @cpu: the cpu buffer to wait on |
| 541 | * @full: wait until a full page is available, if @cpu != RING_BUFFER_ALL_CPUS | ||
| 541 | * | 542 | * |
| 542 | * If @cpu == RING_BUFFER_ALL_CPUS then the task will wake up as soon | 543 | * If @cpu == RING_BUFFER_ALL_CPUS then the task will wake up as soon |
| 543 | * as data is added to any of the @buffer's cpu buffers. Otherwise | 544 | * as data is added to any of the @buffer's cpu buffers. Otherwise |
| 544 | * it will wait for data to be added to a specific cpu buffer. | 545 | * it will wait for data to be added to a specific cpu buffer. |
| 545 | */ | 546 | */ |
| 546 | int ring_buffer_wait(struct ring_buffer *buffer, int cpu) | 547 | int ring_buffer_wait(struct ring_buffer *buffer, int cpu, bool full) |
| 547 | { | 548 | { |
| 548 | struct ring_buffer_per_cpu *cpu_buffer; | 549 | struct ring_buffer_per_cpu *uninitialized_var(cpu_buffer); |
| 549 | DEFINE_WAIT(wait); | 550 | DEFINE_WAIT(wait); |
| 550 | struct rb_irq_work *work; | 551 | struct rb_irq_work *work; |
| 552 | int ret = 0; | ||
| 551 | 553 | ||
| 552 | /* | 554 | /* |
| 553 | * Depending on what the caller is waiting for, either any | 555 | * Depending on what the caller is waiting for, either any |
| @@ -564,36 +566,61 @@ int ring_buffer_wait(struct ring_buffer *buffer, int cpu) | |||
| 564 | } | 566 | } |
| 565 | 567 | ||
| 566 | 568 | ||
| 567 | prepare_to_wait(&work->waiters, &wait, TASK_INTERRUPTIBLE); | 569 | while (true) { |
| 570 | prepare_to_wait(&work->waiters, &wait, TASK_INTERRUPTIBLE); | ||
| 568 | 571 | ||
| 569 | /* | 572 | /* |
| 570 | * The events can happen in critical sections where | 573 | * The events can happen in critical sections where |
| 571 | * checking a work queue can cause deadlocks. | 574 | * checking a work queue can cause deadlocks. |
| 572 | * After adding a task to the queue, this flag is set | 575 | * After adding a task to the queue, this flag is set |
| 573 | * only to notify events to try to wake up the queue | 576 | * only to notify events to try to wake up the queue |
| 574 | * using irq_work. | 577 | * using irq_work. |
| 575 | * | 578 | * |
| 576 | * We don't clear it even if the buffer is no longer | 579 | * We don't clear it even if the buffer is no longer |
| 577 | * empty. The flag only causes the next event to run | 580 | * empty. The flag only causes the next event to run |
| 578 | * irq_work to do the work queue wake up. The worse | 581 | * irq_work to do the work queue wake up. The worse |
| 579 | * that can happen if we race with !trace_empty() is that | 582 | * that can happen if we race with !trace_empty() is that |
| 580 | * an event will cause an irq_work to try to wake up | 583 | * an event will cause an irq_work to try to wake up |
| 581 | * an empty queue. | 584 | * an empty queue. |
| 582 | * | 585 | * |
| 583 | * There's no reason to protect this flag either, as | 586 | * There's no reason to protect this flag either, as |
| 584 | * the work queue and irq_work logic will do the necessary | 587 | * the work queue and irq_work logic will do the necessary |
| 585 | * synchronization for the wake ups. The only thing | 588 | * synchronization for the wake ups. The only thing |
| 586 | * that is necessary is that the wake up happens after | 589 | * that is necessary is that the wake up happens after |
| 587 | * a task has been queued. It's OK for spurious wake ups. | 590 | * a task has been queued. It's OK for spurious wake ups. |
| 588 | */ | 591 | */ |
| 589 | work->waiters_pending = true; | 592 | work->waiters_pending = true; |
| 593 | |||
| 594 | if (signal_pending(current)) { | ||
| 595 | ret = -EINTR; | ||
| 596 | break; | ||
| 597 | } | ||
| 598 | |||
| 599 | if (cpu == RING_BUFFER_ALL_CPUS && !ring_buffer_empty(buffer)) | ||
| 600 | break; | ||
| 601 | |||
| 602 | if (cpu != RING_BUFFER_ALL_CPUS && | ||
| 603 | !ring_buffer_empty_cpu(buffer, cpu)) { | ||
| 604 | unsigned long flags; | ||
| 605 | bool pagebusy; | ||
| 606 | |||
| 607 | if (!full) | ||
| 608 | break; | ||
| 609 | |||
| 610 | raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); | ||
| 611 | pagebusy = cpu_buffer->reader_page == cpu_buffer->commit_page; | ||
| 612 | raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); | ||
| 613 | |||
| 614 | if (!pagebusy) | ||
| 615 | break; | ||
| 616 | } | ||
| 590 | 617 | ||
| 591 | if ((cpu == RING_BUFFER_ALL_CPUS && ring_buffer_empty(buffer)) || | ||
| 592 | (cpu != RING_BUFFER_ALL_CPUS && ring_buffer_empty_cpu(buffer, cpu))) | ||
| 593 | schedule(); | 618 | schedule(); |
| 619 | } | ||
| 594 | 620 | ||
| 595 | finish_wait(&work->waiters, &wait); | 621 | finish_wait(&work->waiters, &wait); |
| 596 | return 0; | 622 | |
| 623 | return ret; | ||
| 597 | } | 624 | } |
| 598 | 625 | ||
| 599 | /** | 626 | /** |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 8a528392b1f4..92f4a6cee172 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -1076,13 +1076,14 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
| 1076 | } | 1076 | } |
| 1077 | #endif /* CONFIG_TRACER_MAX_TRACE */ | 1077 | #endif /* CONFIG_TRACER_MAX_TRACE */ |
| 1078 | 1078 | ||
| 1079 | static int wait_on_pipe(struct trace_iterator *iter) | 1079 | static int wait_on_pipe(struct trace_iterator *iter, bool full) |
| 1080 | { | 1080 | { |
| 1081 | /* Iterators are static, they should be filled or empty */ | 1081 | /* Iterators are static, they should be filled or empty */ |
| 1082 | if (trace_buffer_iter(iter, iter->cpu_file)) | 1082 | if (trace_buffer_iter(iter, iter->cpu_file)) |
| 1083 | return 0; | 1083 | return 0; |
| 1084 | 1084 | ||
| 1085 | return ring_buffer_wait(iter->trace_buffer->buffer, iter->cpu_file); | 1085 | return ring_buffer_wait(iter->trace_buffer->buffer, iter->cpu_file, |
| 1086 | full); | ||
| 1086 | } | 1087 | } |
| 1087 | 1088 | ||
| 1088 | #ifdef CONFIG_FTRACE_STARTUP_TEST | 1089 | #ifdef CONFIG_FTRACE_STARTUP_TEST |
| @@ -4434,15 +4435,12 @@ static int tracing_wait_pipe(struct file *filp) | |||
| 4434 | 4435 | ||
| 4435 | mutex_unlock(&iter->mutex); | 4436 | mutex_unlock(&iter->mutex); |
| 4436 | 4437 | ||
| 4437 | ret = wait_on_pipe(iter); | 4438 | ret = wait_on_pipe(iter, false); |
| 4438 | 4439 | ||
| 4439 | mutex_lock(&iter->mutex); | 4440 | mutex_lock(&iter->mutex); |
| 4440 | 4441 | ||
| 4441 | if (ret) | 4442 | if (ret) |
| 4442 | return ret; | 4443 | return ret; |
| 4443 | |||
| 4444 | if (signal_pending(current)) | ||
| 4445 | return -EINTR; | ||
| 4446 | } | 4444 | } |
| 4447 | 4445 | ||
| 4448 | return 1; | 4446 | return 1; |
| @@ -5372,16 +5370,12 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, | |||
| 5372 | goto out_unlock; | 5370 | goto out_unlock; |
| 5373 | } | 5371 | } |
| 5374 | mutex_unlock(&trace_types_lock); | 5372 | mutex_unlock(&trace_types_lock); |
| 5375 | ret = wait_on_pipe(iter); | 5373 | ret = wait_on_pipe(iter, false); |
| 5376 | mutex_lock(&trace_types_lock); | 5374 | mutex_lock(&trace_types_lock); |
| 5377 | if (ret) { | 5375 | if (ret) { |
| 5378 | size = ret; | 5376 | size = ret; |
| 5379 | goto out_unlock; | 5377 | goto out_unlock; |
| 5380 | } | 5378 | } |
| 5381 | if (signal_pending(current)) { | ||
| 5382 | size = -EINTR; | ||
| 5383 | goto out_unlock; | ||
| 5384 | } | ||
| 5385 | goto again; | 5379 | goto again; |
| 5386 | } | 5380 | } |
| 5387 | size = 0; | 5381 | size = 0; |
| @@ -5500,7 +5494,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
| 5500 | }; | 5494 | }; |
| 5501 | struct buffer_ref *ref; | 5495 | struct buffer_ref *ref; |
| 5502 | int entries, size, i; | 5496 | int entries, size, i; |
| 5503 | ssize_t ret; | 5497 | ssize_t ret = 0; |
| 5504 | 5498 | ||
| 5505 | mutex_lock(&trace_types_lock); | 5499 | mutex_lock(&trace_types_lock); |
| 5506 | 5500 | ||
| @@ -5538,13 +5532,16 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
| 5538 | int r; | 5532 | int r; |
| 5539 | 5533 | ||
| 5540 | ref = kzalloc(sizeof(*ref), GFP_KERNEL); | 5534 | ref = kzalloc(sizeof(*ref), GFP_KERNEL); |
| 5541 | if (!ref) | 5535 | if (!ref) { |
| 5536 | ret = -ENOMEM; | ||
| 5542 | break; | 5537 | break; |
| 5538 | } | ||
| 5543 | 5539 | ||
| 5544 | ref->ref = 1; | 5540 | ref->ref = 1; |
| 5545 | ref->buffer = iter->trace_buffer->buffer; | 5541 | ref->buffer = iter->trace_buffer->buffer; |
| 5546 | ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file); | 5542 | ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file); |
| 5547 | if (!ref->page) { | 5543 | if (!ref->page) { |
| 5544 | ret = -ENOMEM; | ||
| 5548 | kfree(ref); | 5545 | kfree(ref); |
| 5549 | break; | 5546 | break; |
| 5550 | } | 5547 | } |
| @@ -5582,19 +5579,19 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
| 5582 | 5579 | ||
| 5583 | /* did we read anything? */ | 5580 | /* did we read anything? */ |
| 5584 | if (!spd.nr_pages) { | 5581 | if (!spd.nr_pages) { |
| 5582 | if (ret) | ||
| 5583 | goto out; | ||
| 5584 | |||
| 5585 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) { | 5585 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) { |
| 5586 | ret = -EAGAIN; | 5586 | ret = -EAGAIN; |
| 5587 | goto out; | 5587 | goto out; |
| 5588 | } | 5588 | } |
| 5589 | mutex_unlock(&trace_types_lock); | 5589 | mutex_unlock(&trace_types_lock); |
| 5590 | ret = wait_on_pipe(iter); | 5590 | ret = wait_on_pipe(iter, true); |
| 5591 | mutex_lock(&trace_types_lock); | 5591 | mutex_lock(&trace_types_lock); |
| 5592 | if (ret) | 5592 | if (ret) |
| 5593 | goto out; | 5593 | goto out; |
| 5594 | if (signal_pending(current)) { | 5594 | |
| 5595 | ret = -EINTR; | ||
| 5596 | goto out; | ||
| 5597 | } | ||
| 5598 | goto again; | 5595 | goto again; |
| 5599 | } | 5596 | } |
| 5600 | 5597 | ||
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 4dc8b79c5f75..29228c4d5696 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -313,7 +313,7 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id) | |||
| 313 | int size; | 313 | int size; |
| 314 | 314 | ||
| 315 | syscall_nr = trace_get_syscall_nr(current, regs); | 315 | syscall_nr = trace_get_syscall_nr(current, regs); |
| 316 | if (syscall_nr < 0) | 316 | if (syscall_nr < 0 || syscall_nr >= NR_syscalls) |
| 317 | return; | 317 | return; |
| 318 | 318 | ||
| 319 | /* Here we're inside tp handler's rcu_read_lock_sched (__DO_TRACE) */ | 319 | /* Here we're inside tp handler's rcu_read_lock_sched (__DO_TRACE) */ |
| @@ -360,7 +360,7 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret) | |||
| 360 | int syscall_nr; | 360 | int syscall_nr; |
| 361 | 361 | ||
| 362 | syscall_nr = trace_get_syscall_nr(current, regs); | 362 | syscall_nr = trace_get_syscall_nr(current, regs); |
| 363 | if (syscall_nr < 0) | 363 | if (syscall_nr < 0 || syscall_nr >= NR_syscalls) |
| 364 | return; | 364 | return; |
| 365 | 365 | ||
| 366 | /* Here we're inside tp handler's rcu_read_lock_sched (__DO_TRACE()) */ | 366 | /* Here we're inside tp handler's rcu_read_lock_sched (__DO_TRACE()) */ |
| @@ -567,7 +567,7 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) | |||
| 567 | int size; | 567 | int size; |
| 568 | 568 | ||
| 569 | syscall_nr = trace_get_syscall_nr(current, regs); | 569 | syscall_nr = trace_get_syscall_nr(current, regs); |
| 570 | if (syscall_nr < 0) | 570 | if (syscall_nr < 0 || syscall_nr >= NR_syscalls) |
| 571 | return; | 571 | return; |
| 572 | if (!test_bit(syscall_nr, enabled_perf_enter_syscalls)) | 572 | if (!test_bit(syscall_nr, enabled_perf_enter_syscalls)) |
| 573 | return; | 573 | return; |
| @@ -641,7 +641,7 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) | |||
| 641 | int size; | 641 | int size; |
| 642 | 642 | ||
| 643 | syscall_nr = trace_get_syscall_nr(current, regs); | 643 | syscall_nr = trace_get_syscall_nr(current, regs); |
| 644 | if (syscall_nr < 0) | 644 | if (syscall_nr < 0 || syscall_nr >= NR_syscalls) |
| 645 | return; | 645 | return; |
| 646 | if (!test_bit(syscall_nr, enabled_perf_exit_syscalls)) | 646 | if (!test_bit(syscall_nr, enabled_perf_exit_syscalls)) |
| 647 | return; | 647 | return; |
