mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 04:48:04 +09:00
Merge tag 'lsk-v3.10-android-15.02'
LSK Android 15.02 v3.10 Conflicts: drivers/Kconfig drivers/regulator/core.c include/linux/of.h
This commit is contained in:
@@ -100,7 +100,6 @@ EXPORT_SYMBOL_GPL(resume_device_irqs);
|
||||
int check_wakeup_irqs(void)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
char suspend_abort[MAX_SUSPEND_ABORT_LEN];
|
||||
int irq;
|
||||
|
||||
for_each_irq_desc(irq, desc) {
|
||||
|
||||
40
kernel/sys.c
40
kernel/sys.c
@@ -2383,26 +2383,6 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
|
||||
else
|
||||
return -EINVAL;
|
||||
break;
|
||||
case PR_SET_TIMERSLACK_PID:
|
||||
if (current->pid != (pid_t)arg3 &&
|
||||
!capable(CAP_SYS_NICE))
|
||||
return -EPERM;
|
||||
rcu_read_lock();
|
||||
tsk = find_task_by_pid_ns((pid_t)arg3, &init_pid_ns);
|
||||
if (tsk == NULL) {
|
||||
rcu_read_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
get_task_struct(tsk);
|
||||
rcu_read_unlock();
|
||||
if (arg2 <= 0)
|
||||
tsk->timer_slack_ns =
|
||||
tsk->default_timer_slack_ns;
|
||||
else
|
||||
tsk->timer_slack_ns = arg2;
|
||||
put_task_struct(tsk);
|
||||
error = 0;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -2422,6 +2402,26 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
|
||||
case PR_GET_TID_ADDRESS:
|
||||
error = prctl_get_tid_address(me, (int __user **)arg2);
|
||||
break;
|
||||
case PR_SET_TIMERSLACK_PID:
|
||||
if (task_pid_vnr(current) != (pid_t)arg3 &&
|
||||
!capable(CAP_SYS_NICE))
|
||||
return -EPERM;
|
||||
rcu_read_lock();
|
||||
tsk = find_task_by_vpid((pid_t)arg3);
|
||||
if (tsk == NULL) {
|
||||
rcu_read_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
get_task_struct(tsk);
|
||||
rcu_read_unlock();
|
||||
if (arg2 <= 0)
|
||||
tsk->timer_slack_ns =
|
||||
tsk->default_timer_slack_ns;
|
||||
else
|
||||
tsk->timer_slack_ns = arg2;
|
||||
put_task_struct(tsk);
|
||||
error = 0;
|
||||
break;
|
||||
case PR_SET_CHILD_SUBREAPER:
|
||||
me->signal->is_child_subreaper = !!arg2;
|
||||
break;
|
||||
|
||||
@@ -195,6 +195,10 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
|
||||
if (tv) {
|
||||
if (copy_from_user(&user_tv, tv, sizeof(*tv)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!timeval_valid(&user_tv))
|
||||
return -EINVAL;
|
||||
|
||||
new_ts.tv_sec = user_tv.tv_sec;
|
||||
new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
|
||||
}
|
||||
|
||||
@@ -631,6 +631,13 @@ int ntp_validate_timex(struct timex *txc)
|
||||
if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME)))
|
||||
return -EPERM;
|
||||
|
||||
if (txc->modes & ADJ_FREQUENCY) {
|
||||
if (LONG_MIN / PPM_SCALE > txc->freq)
|
||||
return -EINVAL;
|
||||
if (LONG_MAX / PPM_SCALE < txc->freq)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1947,17 +1947,13 @@ static void pool_mayday_timeout(unsigned long __pool)
|
||||
* spin_lock_irq(pool->lock) which may be released and regrabbed
|
||||
* multiple times. Does GFP_KERNEL allocations. Called only from
|
||||
* manager.
|
||||
*
|
||||
* RETURNS:
|
||||
* %false if no action was taken and pool->lock stayed locked, %true
|
||||
* otherwise.
|
||||
*/
|
||||
static bool maybe_create_worker(struct worker_pool *pool)
|
||||
static void maybe_create_worker(struct worker_pool *pool)
|
||||
__releases(&pool->lock)
|
||||
__acquires(&pool->lock)
|
||||
{
|
||||
if (!need_to_create_worker(pool))
|
||||
return false;
|
||||
return;
|
||||
restart:
|
||||
spin_unlock_irq(&pool->lock);
|
||||
|
||||
@@ -1974,7 +1970,7 @@ restart:
|
||||
start_worker(worker);
|
||||
if (WARN_ON_ONCE(need_to_create_worker(pool)))
|
||||
goto restart;
|
||||
return true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!need_to_create_worker(pool))
|
||||
@@ -1991,7 +1987,7 @@ restart:
|
||||
spin_lock_irq(&pool->lock);
|
||||
if (need_to_create_worker(pool))
|
||||
goto restart;
|
||||
return true;
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2004,15 +2000,9 @@ restart:
|
||||
* LOCKING:
|
||||
* spin_lock_irq(pool->lock) which may be released and regrabbed
|
||||
* multiple times. Called only from manager.
|
||||
*
|
||||
* RETURNS:
|
||||
* %false if no action was taken and pool->lock stayed locked, %true
|
||||
* otherwise.
|
||||
*/
|
||||
static bool maybe_destroy_workers(struct worker_pool *pool)
|
||||
static void maybe_destroy_workers(struct worker_pool *pool)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
while (too_many_workers(pool)) {
|
||||
struct worker *worker;
|
||||
unsigned long expires;
|
||||
@@ -2026,10 +2016,7 @@ static bool maybe_destroy_workers(struct worker_pool *pool)
|
||||
}
|
||||
|
||||
destroy_worker(worker);
|
||||
ret = true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2049,13 +2036,14 @@ static bool maybe_destroy_workers(struct worker_pool *pool)
|
||||
* multiple times. Does GFP_KERNEL allocations.
|
||||
*
|
||||
* RETURNS:
|
||||
* spin_lock_irq(pool->lock) which may be released and regrabbed
|
||||
* multiple times. Does GFP_KERNEL allocations.
|
||||
* %false if the pool doesn't need management and the caller can safely
|
||||
* start processing works, %true if management function was performed and
|
||||
* the conditions that the caller verified before calling the function may
|
||||
* no longer be true.
|
||||
*/
|
||||
static bool manage_workers(struct worker *worker)
|
||||
{
|
||||
struct worker_pool *pool = worker->pool;
|
||||
bool ret = false;
|
||||
|
||||
/*
|
||||
* Managership is governed by two mutexes - manager_arb and
|
||||
@@ -2079,7 +2067,7 @@ static bool manage_workers(struct worker *worker)
|
||||
* manager_mutex.
|
||||
*/
|
||||
if (!mutex_trylock(&pool->manager_arb))
|
||||
return ret;
|
||||
return false;
|
||||
|
||||
/*
|
||||
* With manager arbitration won, manager_mutex would be free in
|
||||
@@ -2089,7 +2077,6 @@ static bool manage_workers(struct worker *worker)
|
||||
spin_unlock_irq(&pool->lock);
|
||||
mutex_lock(&pool->manager_mutex);
|
||||
spin_lock_irq(&pool->lock);
|
||||
ret = true;
|
||||
}
|
||||
|
||||
pool->flags &= ~POOL_MANAGE_WORKERS;
|
||||
@@ -2098,12 +2085,12 @@ static bool manage_workers(struct worker *worker)
|
||||
* Destroy and then create so that may_start_working() is true
|
||||
* on return.
|
||||
*/
|
||||
ret |= maybe_destroy_workers(pool);
|
||||
ret |= maybe_create_worker(pool);
|
||||
maybe_destroy_workers(pool);
|
||||
maybe_create_worker(pool);
|
||||
|
||||
mutex_unlock(&pool->manager_mutex);
|
||||
mutex_unlock(&pool->manager_arb);
|
||||
return ret;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user