mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 13:27:06 +09:00
Merge tag 'v4.9.207' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidg12-4.9.y
This is the 4.9.207 stable release
This commit is contained in:
@@ -365,12 +365,12 @@ static int audit_get_nd(struct audit_watch *watch, struct path *parent)
|
||||
struct dentry *d = kern_path_locked(watch->path, parent);
|
||||
if (IS_ERR(d))
|
||||
return PTR_ERR(d);
|
||||
inode_unlock(d_backing_inode(parent->dentry));
|
||||
if (d_is_positive(d)) {
|
||||
/* update watch filter fields */
|
||||
watch->dev = d->d_sb->s_dev;
|
||||
watch->ino = d_backing_inode(d)->i_ino;
|
||||
}
|
||||
inode_unlock(d_backing_inode(parent->dentry));
|
||||
dput(d);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ struct pids_cgroup {
|
||||
* %PIDS_MAX = (%PID_MAX_LIMIT + 1).
|
||||
*/
|
||||
atomic64_t counter;
|
||||
int64_t limit;
|
||||
atomic64_t limit;
|
||||
|
||||
/* Handle for "pids.events" */
|
||||
struct cgroup_file events_file;
|
||||
@@ -76,8 +76,8 @@ pids_css_alloc(struct cgroup_subsys_state *parent)
|
||||
if (!pids)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
pids->limit = PIDS_MAX;
|
||||
atomic64_set(&pids->counter, 0);
|
||||
atomic64_set(&pids->limit, PIDS_MAX);
|
||||
atomic64_set(&pids->events_limit, 0);
|
||||
return &pids->css;
|
||||
}
|
||||
@@ -149,13 +149,14 @@ static int pids_try_charge(struct pids_cgroup *pids, int num)
|
||||
|
||||
for (p = pids; parent_pids(p); p = parent_pids(p)) {
|
||||
int64_t new = atomic64_add_return(num, &p->counter);
|
||||
int64_t limit = atomic64_read(&p->limit);
|
||||
|
||||
/*
|
||||
* Since new is capped to the maximum number of pid_t, if
|
||||
* p->limit is %PIDS_MAX then we know that this test will never
|
||||
* fail.
|
||||
*/
|
||||
if (new > p->limit)
|
||||
if (new > limit)
|
||||
goto revert;
|
||||
}
|
||||
|
||||
@@ -280,7 +281,7 @@ set_limit:
|
||||
* Limit updates don't need to be mutex'd, since it isn't
|
||||
* critical that any racing fork()s follow the new limit.
|
||||
*/
|
||||
pids->limit = limit;
|
||||
atomic64_set(&pids->limit, limit);
|
||||
return nbytes;
|
||||
}
|
||||
|
||||
@@ -288,7 +289,7 @@ static int pids_max_show(struct seq_file *sf, void *v)
|
||||
{
|
||||
struct cgroup_subsys_state *css = seq_css(sf);
|
||||
struct pids_cgroup *pids = css_pids(css);
|
||||
int64_t limit = pids->limit;
|
||||
int64_t limit = atomic64_read(&pids->limit);
|
||||
|
||||
if (limit >= PIDS_MAX)
|
||||
seq_printf(sf, "%s\n", PIDS_MAX_STR);
|
||||
|
||||
@@ -995,6 +995,8 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
|
||||
strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module));
|
||||
|
||||
free_module(mod);
|
||||
/* someone could wait for the module in add_unformed_module() */
|
||||
wake_up_all(&module_wq);
|
||||
return 0;
|
||||
out:
|
||||
mutex_unlock(&module_mutex);
|
||||
|
||||
@@ -4649,20 +4649,28 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer)
|
||||
if (++count > 3) {
|
||||
u64 new, old = ktime_to_ns(cfs_b->period);
|
||||
|
||||
new = (old * 147) / 128; /* ~115% */
|
||||
new = min(new, max_cfs_quota_period);
|
||||
/*
|
||||
* Grow period by a factor of 2 to avoid losing precision.
|
||||
* Precision loss in the quota/period ratio can cause __cfs_schedulable
|
||||
* to fail.
|
||||
*/
|
||||
new = old * 2;
|
||||
if (new < max_cfs_quota_period) {
|
||||
cfs_b->period = ns_to_ktime(new);
|
||||
cfs_b->quota *= 2;
|
||||
|
||||
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));
|
||||
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));
|
||||
} else {
|
||||
pr_warn_ratelimited(
|
||||
"cfs_period_timer[cpu%d]: period too short, but cannot scale up without losing precision (cfs_period_us = %lld, cfs_quota_us = %lld)\n",
|
||||
smp_processor_id(),
|
||||
div_u64(old, NSEC_PER_USEC),
|
||||
div_u64(cfs_b->quota, NSEC_PER_USEC));
|
||||
}
|
||||
|
||||
/* reset count so we don't come right back in here */
|
||||
count = 0;
|
||||
|
||||
@@ -2363,8 +2363,14 @@ repeat:
|
||||
*/
|
||||
if (need_to_create_worker(pool)) {
|
||||
spin_lock(&wq_mayday_lock);
|
||||
get_pwq(pwq);
|
||||
list_move_tail(&pwq->mayday_node, &wq->maydays);
|
||||
/*
|
||||
* Queue iff we aren't racing destruction
|
||||
* and somebody else hasn't queued it already.
|
||||
*/
|
||||
if (wq->rescuer && list_empty(&pwq->mayday_node)) {
|
||||
get_pwq(pwq);
|
||||
list_add_tail(&pwq->mayday_node, &wq->maydays);
|
||||
}
|
||||
spin_unlock(&wq_mayday_lock);
|
||||
}
|
||||
}
|
||||
@@ -4050,9 +4056,29 @@ void destroy_workqueue(struct workqueue_struct *wq)
|
||||
struct pool_workqueue *pwq;
|
||||
int node;
|
||||
|
||||
/*
|
||||
* Remove it from sysfs first so that sanity check failure doesn't
|
||||
* lead to sysfs name conflicts.
|
||||
*/
|
||||
workqueue_sysfs_unregister(wq);
|
||||
|
||||
/* drain it before proceeding with destruction */
|
||||
drain_workqueue(wq);
|
||||
|
||||
/* kill rescuer, if sanity checks fail, leave it w/o rescuer */
|
||||
if (wq->rescuer) {
|
||||
struct worker *rescuer = wq->rescuer;
|
||||
|
||||
/* this prevents new queueing */
|
||||
spin_lock_irq(&wq_mayday_lock);
|
||||
wq->rescuer = NULL;
|
||||
spin_unlock_irq(&wq_mayday_lock);
|
||||
|
||||
/* rescuer will empty maydays list before exiting */
|
||||
kthread_stop(rescuer->task);
|
||||
kfree(rescuer);
|
||||
}
|
||||
|
||||
/* sanity checks */
|
||||
mutex_lock(&wq->mutex);
|
||||
for_each_pwq(pwq, wq) {
|
||||
@@ -4082,11 +4108,6 @@ void destroy_workqueue(struct workqueue_struct *wq)
|
||||
list_del_rcu(&wq->list);
|
||||
mutex_unlock(&wq_pool_mutex);
|
||||
|
||||
workqueue_sysfs_unregister(wq);
|
||||
|
||||
if (wq->rescuer)
|
||||
kthread_stop(wq->rescuer->task);
|
||||
|
||||
if (!(wq->flags & WQ_UNBOUND)) {
|
||||
/*
|
||||
* The base ref is never dropped on per-cpu pwqs. Directly
|
||||
@@ -4363,7 +4384,8 @@ static void show_pwq(struct pool_workqueue *pwq)
|
||||
pr_info(" pwq %d:", pool->id);
|
||||
pr_cont_pool_info(pool);
|
||||
|
||||
pr_cont(" active=%d/%d%s\n", pwq->nr_active, pwq->max_active,
|
||||
pr_cont(" active=%d/%d refcnt=%d%s\n",
|
||||
pwq->nr_active, pwq->max_active, pwq->refcnt,
|
||||
!list_empty(&pwq->mayday_node) ? " MAYDAY" : "");
|
||||
|
||||
hash_for_each(pool->busy_hash, bkt, worker, hentry) {
|
||||
|
||||
Reference in New Issue
Block a user