Merge branch 'sched/urgent' into sched/core
Pick up fixes before queueing up new changes. Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
+1
-1
@@ -916,7 +916,7 @@ static int audit_tree_handle_event(struct fsnotify_group *group,
|
||||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name)
|
||||
const unsigned char *file_name, u32 cookie)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -471,7 +471,7 @@ static int audit_watch_handle_event(struct fsnotify_group *group,
|
||||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *dname)
|
||||
const unsigned char *dname, u32 cookie)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct audit_parent *parent;
|
||||
|
||||
+3
-7
@@ -974,12 +974,6 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,
|
||||
* Temporarilly set tasks mems_allowed to target nodes of migration,
|
||||
* so that the migration code can allocate pages on these nodes.
|
||||
*
|
||||
* Call holding cpuset_mutex, so current's cpuset won't change
|
||||
* during this call, as manage_mutex holds off any cpuset_attach()
|
||||
* calls. Therefore we don't need to take task_lock around the
|
||||
* call to guarantee_online_mems(), as we know no one is changing
|
||||
* our task's cpuset.
|
||||
*
|
||||
* While the mm_struct we are migrating is typically from some
|
||||
* other task, the task_struct mems_allowed that we are hacking
|
||||
* is for our current task, which must allocate new pages for that
|
||||
@@ -996,8 +990,10 @@ static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from,
|
||||
|
||||
do_migrate_pages(mm, from, to, MPOL_MF_MOVE_ALL);
|
||||
|
||||
rcu_read_lock();
|
||||
mems_cs = effective_nodemask_cpuset(task_cs(tsk));
|
||||
guarantee_online_mems(mems_cs, &tsk->mems_allowed);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2486,9 +2482,9 @@ int __cpuset_node_allowed_softwall(int node, gfp_t gfp_mask)
|
||||
|
||||
task_lock(current);
|
||||
cs = nearest_hardwall_ancestor(task_cs(current));
|
||||
allowed = node_isset(node, cs->mems_allowed);
|
||||
task_unlock(current);
|
||||
|
||||
allowed = node_isset(node, cs->mems_allowed);
|
||||
mutex_unlock(&callback_mutex);
|
||||
return allowed;
|
||||
}
|
||||
|
||||
@@ -7856,14 +7856,14 @@ static void perf_pmu_rotate_stop(struct pmu *pmu)
|
||||
static void __perf_event_exit_context(void *__info)
|
||||
{
|
||||
struct perf_event_context *ctx = __info;
|
||||
struct perf_event *event, *tmp;
|
||||
struct perf_event *event;
|
||||
|
||||
perf_pmu_rotate_stop(ctx->pmu);
|
||||
|
||||
list_for_each_entry_safe(event, tmp, &ctx->pinned_groups, group_entry)
|
||||
__perf_remove_from_context(event);
|
||||
list_for_each_entry_safe(event, tmp, &ctx->flexible_groups, group_entry)
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(event, &ctx->event_list, event_entry)
|
||||
__perf_remove_from_context(event);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void perf_event_exit_cpu_context(int cpu)
|
||||
@@ -7887,11 +7887,11 @@ static void perf_event_exit_cpu(int cpu)
|
||||
{
|
||||
struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu);
|
||||
|
||||
perf_event_exit_cpu_context(cpu);
|
||||
|
||||
mutex_lock(&swhash->hlist_mutex);
|
||||
swevent_hlist_release(swhash);
|
||||
mutex_unlock(&swhash->hlist_mutex);
|
||||
|
||||
perf_event_exit_cpu_context(cpu);
|
||||
}
|
||||
#else
|
||||
static inline void perf_event_exit_cpu(int cpu) { }
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/topology.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
+1
-2
@@ -802,8 +802,7 @@ static irqreturn_t irq_thread_fn(struct irq_desc *desc,
|
||||
|
||||
static void wake_threads_waitq(struct irq_desc *desc)
|
||||
{
|
||||
if (atomic_dec_and_test(&desc->threads_active) &&
|
||||
waitqueue_active(&desc->wait_for_threads))
|
||||
if (atomic_dec_and_test(&desc->threads_active))
|
||||
wake_up(&desc->wait_for_threads);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -549,14 +549,14 @@ static int create_hash_tables(void)
|
||||
struct page *page;
|
||||
|
||||
page = alloc_pages_exact_node(node,
|
||||
GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
|
||||
GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE,
|
||||
0);
|
||||
if (!page)
|
||||
goto out_cleanup;
|
||||
per_cpu(cpu_profile_hits, cpu)[1]
|
||||
= (struct profile_hit *)page_address(page);
|
||||
page = alloc_pages_exact_node(node,
|
||||
GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
|
||||
GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE,
|
||||
0);
|
||||
if (!page)
|
||||
goto out_cleanup;
|
||||
|
||||
@@ -301,14 +301,14 @@ u64 sched_clock_cpu(int cpu)
|
||||
if (unlikely(!sched_clock_running))
|
||||
return 0ull;
|
||||
|
||||
preempt_disable();
|
||||
preempt_disable_notrace();
|
||||
scd = cpu_sdc(cpu);
|
||||
|
||||
if (cpu != smp_processor_id())
|
||||
clock = sched_clock_remote(scd);
|
||||
else
|
||||
clock = sched_clock_local(scd);
|
||||
preempt_enable();
|
||||
preempt_enable_notrace();
|
||||
|
||||
return clock;
|
||||
}
|
||||
|
||||
+25
-12
@@ -1954,7 +1954,7 @@ static int dl_overflow(struct task_struct *p, int policy,
|
||||
{
|
||||
|
||||
struct dl_bw *dl_b = dl_bw_of(task_cpu(p));
|
||||
u64 period = attr->sched_period;
|
||||
u64 period = attr->sched_period ?: attr->sched_deadline;
|
||||
u64 runtime = attr->sched_runtime;
|
||||
u64 new_bw = dl_policy(policy) ? to_ratio(period, runtime) : 0;
|
||||
int cpus, err = -1;
|
||||
@@ -3328,6 +3328,15 @@ recheck:
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
/*
|
||||
* Can't set/change SCHED_DEADLINE policy at all for now
|
||||
* (safest behavior); in the future we would like to allow
|
||||
* unprivileged DL tasks to increase their relative deadline
|
||||
* or reduce their runtime (both ways reducing utilization)
|
||||
*/
|
||||
if (dl_policy(policy))
|
||||
return -EPERM;
|
||||
|
||||
/*
|
||||
* Treat SCHED_IDLE as nice 20. Only allow a switch to
|
||||
* SCHED_NORMAL if the RLIMIT_NICE would normally permit it.
|
||||
@@ -3673,13 +3682,14 @@ SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param)
|
||||
* @pid: the pid in question.
|
||||
* @uattr: structure containing the extended parameters.
|
||||
*/
|
||||
SYSCALL_DEFINE2(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr)
|
||||
SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr,
|
||||
unsigned int, flags)
|
||||
{
|
||||
struct sched_attr attr;
|
||||
struct task_struct *p;
|
||||
int retval;
|
||||
|
||||
if (!uattr || pid < 0)
|
||||
if (!uattr || pid < 0 || flags)
|
||||
return -EINVAL;
|
||||
|
||||
if (sched_copy_attr(uattr, &attr))
|
||||
@@ -3798,7 +3808,7 @@ static int sched_read_attr(struct sched_attr __user *uattr,
|
||||
attr->size = usize;
|
||||
}
|
||||
|
||||
ret = copy_to_user(uattr, attr, usize);
|
||||
ret = copy_to_user(uattr, attr, attr->size);
|
||||
if (ret)
|
||||
return -EFAULT;
|
||||
|
||||
@@ -3816,8 +3826,8 @@ err_size:
|
||||
* @uattr: structure containing the extended parameters.
|
||||
* @size: sizeof(attr) for fwd/bwd comp.
|
||||
*/
|
||||
SYSCALL_DEFINE3(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
|
||||
unsigned int, size)
|
||||
SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
|
||||
unsigned int, size, unsigned int, flags)
|
||||
{
|
||||
struct sched_attr attr = {
|
||||
.size = sizeof(struct sched_attr),
|
||||
@@ -3826,7 +3836,7 @@ SYSCALL_DEFINE3(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
|
||||
int retval;
|
||||
|
||||
if (!uattr || pid < 0 || size > PAGE_SIZE ||
|
||||
size < SCHED_ATTR_SIZE_VER0)
|
||||
size < SCHED_ATTR_SIZE_VER0 || flags)
|
||||
return -EINVAL;
|
||||
|
||||
rcu_read_lock();
|
||||
@@ -7461,6 +7471,7 @@ static int sched_dl_global_constraints(void)
|
||||
u64 period = global_rt_period();
|
||||
u64 new_bw = to_ratio(period, runtime);
|
||||
int cpu, ret = 0;
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Here we want to check the bandwidth not being set to some
|
||||
@@ -7474,10 +7485,10 @@ static int sched_dl_global_constraints(void)
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct dl_bw *dl_b = dl_bw_of(cpu);
|
||||
|
||||
raw_spin_lock(&dl_b->lock);
|
||||
raw_spin_lock_irqsave(&dl_b->lock, flags);
|
||||
if (new_bw < dl_b->total_bw)
|
||||
ret = -EBUSY;
|
||||
raw_spin_unlock(&dl_b->lock);
|
||||
raw_spin_unlock_irqrestore(&dl_b->lock, flags);
|
||||
|
||||
if (ret)
|
||||
break;
|
||||
@@ -7490,6 +7501,7 @@ static void sched_dl_do_global(void)
|
||||
{
|
||||
u64 new_bw = -1;
|
||||
int cpu;
|
||||
unsigned long flags;
|
||||
|
||||
def_dl_bandwidth.dl_period = global_rt_period();
|
||||
def_dl_bandwidth.dl_runtime = global_rt_runtime();
|
||||
@@ -7503,9 +7515,9 @@ static void sched_dl_do_global(void)
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct dl_bw *dl_b = dl_bw_of(cpu);
|
||||
|
||||
raw_spin_lock(&dl_b->lock);
|
||||
raw_spin_lock_irqsave(&dl_b->lock, flags);
|
||||
dl_b->bw = new_bw;
|
||||
raw_spin_unlock(&dl_b->lock);
|
||||
raw_spin_unlock_irqrestore(&dl_b->lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7514,7 +7526,8 @@ static int sched_rt_global_validate(void)
|
||||
if (sysctl_sched_rt_period <= 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (sysctl_sched_rt_runtime > sysctl_sched_rt_period)
|
||||
if ((sysctl_sched_rt_runtime != RUNTIME_INF) &&
|
||||
(sysctl_sched_rt_runtime > sysctl_sched_rt_period))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -70,7 +70,7 @@ static void cpudl_heapify(struct cpudl *cp, int idx)
|
||||
|
||||
static void cpudl_change_key(struct cpudl *cp, int idx, u64 new_dl)
|
||||
{
|
||||
WARN_ON(idx > num_present_cpus() || idx == IDX_INVALID);
|
||||
WARN_ON(idx == IDX_INVALID || !cpu_present(idx));
|
||||
|
||||
if (dl_time_before(new_dl, cp->elements[idx].dl)) {
|
||||
cp->elements[idx].dl = new_dl;
|
||||
@@ -117,7 +117,7 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p,
|
||||
}
|
||||
|
||||
out:
|
||||
WARN_ON(best_cpu > num_present_cpus() && best_cpu != -1);
|
||||
WARN_ON(best_cpu != -1 && !cpu_present(best_cpu));
|
||||
|
||||
return best_cpu;
|
||||
}
|
||||
@@ -137,7 +137,7 @@ void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid)
|
||||
int old_idx, new_cpu;
|
||||
unsigned long flags;
|
||||
|
||||
WARN_ON(cpu > num_present_cpus());
|
||||
WARN_ON(!cpu_present(cpu));
|
||||
|
||||
raw_spin_lock_irqsave(&cp->lock, flags);
|
||||
old_idx = cp->cpu_to_idx[cpu];
|
||||
|
||||
+9
-11
@@ -121,7 +121,7 @@ static inline void dl_clear_overload(struct rq *rq)
|
||||
|
||||
static void update_dl_migration(struct dl_rq *dl_rq)
|
||||
{
|
||||
if (dl_rq->dl_nr_migratory && dl_rq->dl_nr_total > 1) {
|
||||
if (dl_rq->dl_nr_migratory && dl_rq->dl_nr_running > 1) {
|
||||
if (!dl_rq->overloaded) {
|
||||
dl_set_overload(rq_of_dl_rq(dl_rq));
|
||||
dl_rq->overloaded = 1;
|
||||
@@ -135,9 +135,7 @@ static void update_dl_migration(struct dl_rq *dl_rq)
|
||||
static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
|
||||
{
|
||||
struct task_struct *p = dl_task_of(dl_se);
|
||||
dl_rq = &rq_of_dl_rq(dl_rq)->dl;
|
||||
|
||||
dl_rq->dl_nr_total++;
|
||||
if (p->nr_cpus_allowed > 1)
|
||||
dl_rq->dl_nr_migratory++;
|
||||
|
||||
@@ -147,9 +145,7 @@ static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
|
||||
static void dec_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
|
||||
{
|
||||
struct task_struct *p = dl_task_of(dl_se);
|
||||
dl_rq = &rq_of_dl_rq(dl_rq)->dl;
|
||||
|
||||
dl_rq->dl_nr_total--;
|
||||
if (p->nr_cpus_allowed > 1)
|
||||
dl_rq->dl_nr_migratory--;
|
||||
|
||||
@@ -589,6 +585,8 @@ int dl_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se)
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq);
|
||||
|
||||
/*
|
||||
* Update the current task's runtime statistics (provided it is still
|
||||
* a -deadline task and has not been removed from the dl_rq).
|
||||
@@ -652,11 +650,13 @@ static void update_curr_dl(struct rq *rq)
|
||||
struct rt_rq *rt_rq = &rq->rt;
|
||||
|
||||
raw_spin_lock(&rt_rq->rt_runtime_lock);
|
||||
rt_rq->rt_time += delta_exec;
|
||||
/*
|
||||
* We'll let actual RT tasks worry about the overflow here, we
|
||||
* have our own CBS to keep us inline -- see above.
|
||||
* have our own CBS to keep us inline; only account when RT
|
||||
* bandwidth is relevant.
|
||||
*/
|
||||
if (sched_rt_bandwidth_account(rt_rq))
|
||||
rt_rq->rt_time += delta_exec;
|
||||
raw_spin_unlock(&rt_rq->rt_runtime_lock);
|
||||
}
|
||||
}
|
||||
@@ -740,6 +740,7 @@ void inc_dl_tasks(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
|
||||
|
||||
WARN_ON(!dl_prio(prio));
|
||||
dl_rq->dl_nr_running++;
|
||||
inc_nr_running(rq_of_dl_rq(dl_rq));
|
||||
|
||||
inc_dl_deadline(dl_rq, deadline);
|
||||
inc_dl_migration(dl_se, dl_rq);
|
||||
@@ -753,6 +754,7 @@ void dec_dl_tasks(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq)
|
||||
WARN_ON(!dl_prio(prio));
|
||||
WARN_ON(!dl_rq->dl_nr_running);
|
||||
dl_rq->dl_nr_running--;
|
||||
dec_nr_running(rq_of_dl_rq(dl_rq));
|
||||
|
||||
dec_dl_deadline(dl_rq, dl_se->deadline);
|
||||
dec_dl_migration(dl_se, dl_rq);
|
||||
@@ -859,8 +861,6 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags)
|
||||
|
||||
if (!task_current(rq, p) && p->nr_cpus_allowed > 1)
|
||||
enqueue_pushable_dl_task(rq, p);
|
||||
|
||||
inc_nr_running(rq);
|
||||
}
|
||||
|
||||
static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags)
|
||||
@@ -873,8 +873,6 @@ static void dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags)
|
||||
{
|
||||
update_curr_dl(rq);
|
||||
__dequeue_task_dl(rq, p, flags);
|
||||
|
||||
dec_nr_running(rq);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+6
-4
@@ -1914,6 +1914,8 @@ void task_numa_work(struct callback_head *work)
|
||||
start = end;
|
||||
if (pages <= 0)
|
||||
goto out;
|
||||
|
||||
cond_resched();
|
||||
} while (end != vma->vm_end);
|
||||
}
|
||||
|
||||
@@ -7316,15 +7318,15 @@ static void switched_from_fair(struct rq *rq, struct task_struct *p)
|
||||
struct cfs_rq *cfs_rq = cfs_rq_of(se);
|
||||
|
||||
/*
|
||||
* Ensure the task's vruntime is normalized, so that when its
|
||||
* Ensure the task's vruntime is normalized, so that when it's
|
||||
* switched back to the fair class the enqueue_entity(.flags=0) will
|
||||
* do the right thing.
|
||||
*
|
||||
* If it was on_rq, then the dequeue_entity(.flags=0) will already
|
||||
* have normalized the vruntime, if it was !on_rq, then only when
|
||||
* If it's on_rq, then the dequeue_entity(.flags=0) will already
|
||||
* have normalized the vruntime, if it's !on_rq, then only when
|
||||
* the task is sleeping will it still have non-normalized vruntime.
|
||||
*/
|
||||
if (!se->on_rq && p->state != TASK_RUNNING) {
|
||||
if (!p->on_rq && p->state != TASK_RUNNING) {
|
||||
/*
|
||||
* Fix up our vruntime so that the current sleep doesn't
|
||||
* cause 'unlimited' sleep bonus.
|
||||
|
||||
@@ -568,6 +568,14 @@ static inline struct rt_bandwidth *sched_rt_bandwidth(struct rt_rq *rt_rq)
|
||||
|
||||
#endif /* CONFIG_RT_GROUP_SCHED */
|
||||
|
||||
bool sched_rt_bandwidth_account(struct rt_rq *rt_rq)
|
||||
{
|
||||
struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq);
|
||||
|
||||
return (hrtimer_active(&rt_b->rt_period_timer) ||
|
||||
rt_rq->rt_time < rt_b->rt_runtime);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* We ran out of runtime, see if we can borrow some from our neighbours.
|
||||
|
||||
@@ -444,7 +444,6 @@ struct dl_rq {
|
||||
} earliest_dl;
|
||||
|
||||
unsigned long dl_nr_migratory;
|
||||
unsigned long dl_nr_total;
|
||||
int overloaded;
|
||||
|
||||
/*
|
||||
|
||||
@@ -293,7 +293,7 @@ int stop_two_cpus(unsigned int cpu1, unsigned int cpu2, cpu_stop_fn_t fn, void *
|
||||
*/
|
||||
smp_call_function_single(min(cpu1, cpu2),
|
||||
&irq_cpu_stop_queue_work,
|
||||
&call_args, 0);
|
||||
&call_args, 1);
|
||||
lg_local_unlock(&stop_cpus_lock);
|
||||
preempt_enable();
|
||||
|
||||
|
||||
+29
-17
@@ -116,20 +116,42 @@ static enum hrtimer_restart sched_clock_poll(struct hrtimer *hrt)
|
||||
void __init sched_clock_register(u64 (*read)(void), int bits,
|
||||
unsigned long rate)
|
||||
{
|
||||
u64 res, wrap, new_mask, new_epoch, cyc, ns;
|
||||
u32 new_mult, new_shift;
|
||||
ktime_t new_wrap_kt;
|
||||
unsigned long r;
|
||||
u64 res, wrap;
|
||||
char r_unit;
|
||||
|
||||
if (cd.rate > rate)
|
||||
return;
|
||||
|
||||
WARN_ON(!irqs_disabled());
|
||||
read_sched_clock = read;
|
||||
sched_clock_mask = CLOCKSOURCE_MASK(bits);
|
||||
cd.rate = rate;
|
||||
|
||||
/* calculate the mult/shift to convert counter ticks to ns. */
|
||||
clocks_calc_mult_shift(&cd.mult, &cd.shift, rate, NSEC_PER_SEC, 3600);
|
||||
clocks_calc_mult_shift(&new_mult, &new_shift, rate, NSEC_PER_SEC, 3600);
|
||||
|
||||
new_mask = CLOCKSOURCE_MASK(bits);
|
||||
|
||||
/* calculate how many ns until we wrap */
|
||||
wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask);
|
||||
new_wrap_kt = ns_to_ktime(wrap - (wrap >> 3));
|
||||
|
||||
/* update epoch for new counter and update epoch_ns from old counter*/
|
||||
new_epoch = read();
|
||||
cyc = read_sched_clock();
|
||||
ns = cd.epoch_ns + cyc_to_ns((cyc - cd.epoch_cyc) & sched_clock_mask,
|
||||
cd.mult, cd.shift);
|
||||
|
||||
raw_write_seqcount_begin(&cd.seq);
|
||||
read_sched_clock = read;
|
||||
sched_clock_mask = new_mask;
|
||||
cd.rate = rate;
|
||||
cd.wrap_kt = new_wrap_kt;
|
||||
cd.mult = new_mult;
|
||||
cd.shift = new_shift;
|
||||
cd.epoch_cyc = new_epoch;
|
||||
cd.epoch_ns = ns;
|
||||
raw_write_seqcount_end(&cd.seq);
|
||||
|
||||
r = rate;
|
||||
if (r >= 4000000) {
|
||||
@@ -141,22 +163,12 @@ void __init sched_clock_register(u64 (*read)(void), int bits,
|
||||
} else
|
||||
r_unit = ' ';
|
||||
|
||||
/* calculate how many ns until we wrap */
|
||||
wrap = clocks_calc_max_nsecs(cd.mult, cd.shift, 0, sched_clock_mask);
|
||||
cd.wrap_kt = ns_to_ktime(wrap - (wrap >> 3));
|
||||
|
||||
/* calculate the ns resolution of this counter */
|
||||
res = cyc_to_ns(1ULL, cd.mult, cd.shift);
|
||||
res = cyc_to_ns(1ULL, new_mult, new_shift);
|
||||
|
||||
pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps every %lluns\n",
|
||||
bits, r, r_unit, res, wrap);
|
||||
|
||||
update_sched_clock();
|
||||
|
||||
/*
|
||||
* Ensure that sched_clock() starts off at 0ns
|
||||
*/
|
||||
cd.epoch_ns = 0;
|
||||
|
||||
/* Enable IRQ time accounting if we have a fast enough sched_clock */
|
||||
if (irqtime > 0 || (irqtime == -1 && rate >= 1000000))
|
||||
enable_sched_clock_irqtime();
|
||||
|
||||
@@ -1777,6 +1777,16 @@ static void trace_module_add_events(struct module *mod)
|
||||
{
|
||||
struct ftrace_event_call **call, **start, **end;
|
||||
|
||||
if (!mod->num_trace_events)
|
||||
return;
|
||||
|
||||
/* Don't add infrastructure for mods without tracepoints */
|
||||
if (trace_module_has_bad_taint(mod)) {
|
||||
pr_err("%s: module has bad taint, not creating trace events\n",
|
||||
mod->name);
|
||||
return;
|
||||
}
|
||||
|
||||
start = mod->trace_events;
|
||||
end = mod->trace_events + mod->num_trace_events;
|
||||
|
||||
|
||||
+6
-1
@@ -631,6 +631,11 @@ void tracepoint_iter_reset(struct tracepoint_iter *iter)
|
||||
EXPORT_SYMBOL_GPL(tracepoint_iter_reset);
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
bool trace_module_has_bad_taint(struct module *mod)
|
||||
{
|
||||
return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP));
|
||||
}
|
||||
|
||||
static int tracepoint_module_coming(struct module *mod)
|
||||
{
|
||||
struct tp_module *tp_mod, *iter;
|
||||
@@ -641,7 +646,7 @@ static int tracepoint_module_coming(struct module *mod)
|
||||
* module headers (for forced load), to make sure we don't cause a crash.
|
||||
* Staging and out-of-tree GPL modules are fine.
|
||||
*/
|
||||
if (mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP)))
|
||||
if (trace_module_has_bad_taint(mod))
|
||||
return 0;
|
||||
mutex_lock(&tracepoints_mutex);
|
||||
tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL);
|
||||
|
||||
Reference in New Issue
Block a user