Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Two easy cases of overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
+21
-16
@@ -9077,26 +9077,29 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
|
||||
if (task == TASK_TOMBSTONE)
|
||||
return;
|
||||
|
||||
if (!ifh->nr_file_filters)
|
||||
return;
|
||||
if (ifh->nr_file_filters) {
|
||||
mm = get_task_mm(event->ctx->task);
|
||||
if (!mm)
|
||||
goto restart;
|
||||
|
||||
mm = get_task_mm(event->ctx->task);
|
||||
if (!mm)
|
||||
goto restart;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
down_read(&mm->mmap_sem);
|
||||
}
|
||||
|
||||
raw_spin_lock_irqsave(&ifh->lock, flags);
|
||||
list_for_each_entry(filter, &ifh->list, entry) {
|
||||
event->addr_filter_ranges[count].start = 0;
|
||||
event->addr_filter_ranges[count].size = 0;
|
||||
if (filter->path.dentry) {
|
||||
/*
|
||||
* Adjust base offset if the filter is associated to a
|
||||
* binary that needs to be mapped:
|
||||
*/
|
||||
event->addr_filter_ranges[count].start = 0;
|
||||
event->addr_filter_ranges[count].size = 0;
|
||||
|
||||
/*
|
||||
* Adjust base offset if the filter is associated to a binary
|
||||
* that needs to be mapped:
|
||||
*/
|
||||
if (filter->path.dentry)
|
||||
perf_addr_filter_apply(filter, mm, &event->addr_filter_ranges[count]);
|
||||
} else {
|
||||
event->addr_filter_ranges[count].start = filter->offset;
|
||||
event->addr_filter_ranges[count].size = filter->size;
|
||||
}
|
||||
|
||||
count++;
|
||||
}
|
||||
@@ -9104,9 +9107,11 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
|
||||
event->addr_filters_gen++;
|
||||
raw_spin_unlock_irqrestore(&ifh->lock, flags);
|
||||
|
||||
up_read(&mm->mmap_sem);
|
||||
if (ifh->nr_file_filters) {
|
||||
up_read(&mm->mmap_sem);
|
||||
|
||||
mmput(mm);
|
||||
mmput(mm);
|
||||
}
|
||||
|
||||
restart:
|
||||
perf_event_stop(event, 1);
|
||||
|
||||
+15
-18
@@ -455,24 +455,21 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size)
|
||||
rb->aux_head += size;
|
||||
}
|
||||
|
||||
if (size || handle->aux_flags) {
|
||||
/*
|
||||
* Only send RECORD_AUX if we have something useful to communicate
|
||||
*
|
||||
* Note: the OVERWRITE records by themselves are not considered
|
||||
* useful, as they don't communicate any *new* information,
|
||||
* aside from the short-lived offset, that becomes history at
|
||||
* the next event sched-in and therefore isn't useful.
|
||||
* The userspace that needs to copy out AUX data in overwrite
|
||||
* mode should know to use user_page::aux_head for the actual
|
||||
* offset. So, from now on we don't output AUX records that
|
||||
* have *only* OVERWRITE flag set.
|
||||
*/
|
||||
|
||||
if (handle->aux_flags & ~(u64)PERF_AUX_FLAG_OVERWRITE)
|
||||
perf_event_aux_event(handle->event, aux_head, size,
|
||||
handle->aux_flags);
|
||||
}
|
||||
/*
|
||||
* Only send RECORD_AUX if we have something useful to communicate
|
||||
*
|
||||
* Note: the OVERWRITE records by themselves are not considered
|
||||
* useful, as they don't communicate any *new* information,
|
||||
* aside from the short-lived offset, that becomes history at
|
||||
* the next event sched-in and therefore isn't useful.
|
||||
* The userspace that needs to copy out AUX data in overwrite
|
||||
* mode should know to use user_page::aux_head for the actual
|
||||
* offset. So, from now on we don't output AUX records that
|
||||
* have *only* OVERWRITE flag set.
|
||||
*/
|
||||
if (size || (handle->aux_flags & ~(u64)PERF_AUX_FLAG_OVERWRITE))
|
||||
perf_event_aux_event(handle->event, aux_head, size,
|
||||
handle->aux_flags);
|
||||
|
||||
rb->user_page->aux_head = rb->aux_head;
|
||||
if (rb_need_aux_wakeup(rb))
|
||||
|
||||
+2
-4
@@ -709,7 +709,6 @@ static void unoptimize_kprobe(struct kprobe *p, bool force)
|
||||
static int reuse_unused_kprobe(struct kprobe *ap)
|
||||
{
|
||||
struct optimized_kprobe *op;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Unused kprobe MUST be on the way of delayed unoptimizing (means
|
||||
@@ -720,9 +719,8 @@ static int reuse_unused_kprobe(struct kprobe *ap)
|
||||
/* Enable the probe again */
|
||||
ap->flags &= ~KPROBE_FLAG_DISABLED;
|
||||
/* Optimize it again (remove from op->list) */
|
||||
ret = kprobe_optready(ap);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!kprobe_optready(ap))
|
||||
return -EINVAL;
|
||||
|
||||
optimize_kprobe(ap);
|
||||
return 0;
|
||||
|
||||
@@ -4907,8 +4907,9 @@ void lockdep_unregister_key(struct lock_class_key *key)
|
||||
return;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
arch_spin_lock(&lockdep_lock);
|
||||
current->lockdep_recursion = 1;
|
||||
if (!graph_lock())
|
||||
goto out_irq;
|
||||
|
||||
pf = get_pending_free();
|
||||
hlist_for_each_entry_rcu(k, hash_head, hash_entry) {
|
||||
if (k == key) {
|
||||
@@ -4920,8 +4921,8 @@ void lockdep_unregister_key(struct lock_class_key *key)
|
||||
WARN_ON_ONCE(!found);
|
||||
__lockdep_free_key_range(pf, key, 1);
|
||||
call_rcu_zapped(pf);
|
||||
current->lockdep_recursion = 0;
|
||||
arch_spin_unlock(&lockdep_lock);
|
||||
graph_unlock();
|
||||
out_irq:
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
/* Wait until is_dynamic_key() has finished accessing k->hash_entry. */
|
||||
|
||||
@@ -252,7 +252,6 @@ static void task_non_contending(struct task_struct *p)
|
||||
if (dl_entity_is_special(dl_se))
|
||||
return;
|
||||
|
||||
WARN_ON(hrtimer_active(&dl_se->inactive_timer));
|
||||
WARN_ON(dl_se->dl_non_contending);
|
||||
|
||||
zerolag_time = dl_se->deadline -
|
||||
@@ -269,7 +268,7 @@ static void task_non_contending(struct task_struct *p)
|
||||
* If the "0-lag time" already passed, decrease the active
|
||||
* utilization now, instead of starting a timer
|
||||
*/
|
||||
if (zerolag_time < 0) {
|
||||
if ((zerolag_time < 0) || hrtimer_active(&dl_se->inactive_timer)) {
|
||||
if (dl_task(p))
|
||||
sub_running_bw(dl_se, dl_rq);
|
||||
if (!dl_task(p) || p->state == TASK_DEAD) {
|
||||
|
||||
@@ -4885,6 +4885,8 @@ static enum hrtimer_restart sched_cfs_slack_timer(struct hrtimer *timer)
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
extern const u64 max_cfs_quota_period;
|
||||
|
||||
static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer)
|
||||
{
|
||||
struct cfs_bandwidth *cfs_b =
|
||||
@@ -4892,6 +4894,7 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer)
|
||||
unsigned long flags;
|
||||
int overrun;
|
||||
int idle = 0;
|
||||
int count = 0;
|
||||
|
||||
raw_spin_lock_irqsave(&cfs_b->lock, flags);
|
||||
for (;;) {
|
||||
@@ -4899,6 +4902,28 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer)
|
||||
if (!overrun)
|
||||
break;
|
||||
|
||||
if (++count > 3) {
|
||||
u64 new, old = ktime_to_ns(cfs_b->period);
|
||||
|
||||
new = (old * 147) / 128; /* ~115% */
|
||||
new = min(new, max_cfs_quota_period);
|
||||
|
||||
cfs_b->period = ns_to_ktime(new);
|
||||
|
||||
/* since max is 1s, this is limited to 1e9^2, which fits in u64 */
|
||||
cfs_b->quota *= new;
|
||||
cfs_b->quota = div64_u64(cfs_b->quota, old);
|
||||
|
||||
pr_warn_ratelimited(
|
||||
"cfs_period_timer[cpu%d]: period too short, scaling up (new cfs_period_us %lld, cfs_quota_us = %lld)\n",
|
||||
smp_processor_id(),
|
||||
div_u64(new, NSEC_PER_USEC),
|
||||
div_u64(cfs_b->quota, NSEC_PER_USEC));
|
||||
|
||||
/* reset count so we don't come right back in here */
|
||||
count = 0;
|
||||
}
|
||||
|
||||
idle = do_sched_cfs_period_timer(cfs_b, overrun, flags);
|
||||
}
|
||||
if (idle)
|
||||
|
||||
+1
-1
@@ -3581,7 +3581,7 @@ SYSCALL_DEFINE4(pidfd_send_signal, int, pidfd, int, sig,
|
||||
if (flags)
|
||||
return -EINVAL;
|
||||
|
||||
f = fdget_raw(pidfd);
|
||||
f = fdget(pidfd);
|
||||
if (!f.file)
|
||||
return -EBADF;
|
||||
|
||||
|
||||
@@ -272,7 +272,7 @@ static u64 notrace suspended_sched_clock_read(void)
|
||||
return cd.read_data[seq & 1].epoch_cyc;
|
||||
}
|
||||
|
||||
static int sched_clock_suspend(void)
|
||||
int sched_clock_suspend(void)
|
||||
{
|
||||
struct clock_read_data *rd = &cd.read_data[0];
|
||||
|
||||
@@ -283,7 +283,7 @@ static int sched_clock_suspend(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sched_clock_resume(void)
|
||||
void sched_clock_resume(void)
|
||||
{
|
||||
struct clock_read_data *rd = &cd.read_data[0];
|
||||
|
||||
|
||||
@@ -487,6 +487,7 @@ void tick_freeze(void)
|
||||
trace_suspend_resume(TPS("timekeeping_freeze"),
|
||||
smp_processor_id(), true);
|
||||
system_state = SYSTEM_SUSPEND;
|
||||
sched_clock_suspend();
|
||||
timekeeping_suspend();
|
||||
} else {
|
||||
tick_suspend_local();
|
||||
@@ -510,6 +511,7 @@ void tick_unfreeze(void)
|
||||
|
||||
if (tick_freeze_depth == num_online_cpus()) {
|
||||
timekeeping_resume();
|
||||
sched_clock_resume();
|
||||
system_state = SYSTEM_RUNNING;
|
||||
trace_suspend_resume(TPS("timekeeping_freeze"),
|
||||
smp_processor_id(), false);
|
||||
|
||||
@@ -14,6 +14,13 @@ extern u64 timekeeping_max_deferment(void);
|
||||
extern void timekeeping_warp_clock(void);
|
||||
extern int timekeeping_suspend(void);
|
||||
extern void timekeeping_resume(void);
|
||||
#ifdef CONFIG_GENERIC_SCHED_CLOCK
|
||||
extern int sched_clock_suspend(void);
|
||||
extern void sched_clock_resume(void);
|
||||
#else
|
||||
static inline int sched_clock_suspend(void) { return 0; }
|
||||
static inline void sched_clock_resume(void) { }
|
||||
#endif
|
||||
|
||||
extern void do_timer(unsigned long ticks);
|
||||
extern void update_wall_time(void);
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/hash.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
#include <trace/events/sched.h>
|
||||
|
||||
@@ -6246,7 +6247,7 @@ void ftrace_reset_array_ops(struct trace_array *tr)
|
||||
tr->ops->func = ftrace_stub;
|
||||
}
|
||||
|
||||
static inline void
|
||||
static nokprobe_inline void
|
||||
__ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
|
||||
struct ftrace_ops *ignored, struct pt_regs *regs)
|
||||
{
|
||||
@@ -6306,11 +6307,13 @@ static void ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
|
||||
{
|
||||
__ftrace_ops_list_func(ip, parent_ip, NULL, regs);
|
||||
}
|
||||
NOKPROBE_SYMBOL(ftrace_ops_list_func);
|
||||
#else
|
||||
static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip)
|
||||
{
|
||||
__ftrace_ops_list_func(ip, parent_ip, NULL, NULL);
|
||||
}
|
||||
NOKPROBE_SYMBOL(ftrace_ops_no_ops);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -6337,6 +6340,7 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip,
|
||||
preempt_enable_notrace();
|
||||
trace_clear_recursion(bit);
|
||||
}
|
||||
NOKPROBE_SYMBOL(ftrace_ops_assist_func);
|
||||
|
||||
/**
|
||||
* ftrace_ops_get_func - get the function a trampoline should call
|
||||
|
||||
@@ -135,7 +135,8 @@ static void watchdog_overflow_callback(struct perf_event *event,
|
||||
if (__this_cpu_read(hard_watchdog_warn) == true)
|
||||
return;
|
||||
|
||||
pr_emerg("Watchdog detected hard LOCKUP on cpu %d", this_cpu);
|
||||
pr_emerg("Watchdog detected hard LOCKUP on cpu %d\n",
|
||||
this_cpu);
|
||||
print_modules();
|
||||
print_irqtrace_events(current);
|
||||
if (regs)
|
||||
|
||||
Reference in New Issue
Block a user