diff options
author | Chun Xu <chunx@nvidia.com> | 2013-08-05 16:55:17 +0800 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 13:40:38 -0700 |
commit | 4a8be3dbb688f754ec2474540041f7061e25f5c6 (patch) | |
tree | 1b99d35e5418db2a5a67b1a0edb4bc29c57c7df8 /net/core | |
parent | db969bbf31dbb79c0f06497f083b4bad16ad88c7 (diff) |
net: fix preempt_count non-zero schedule
Resolve "BUG: scheduling while atomic" issue when
sk_get_waiting_task is being called.
Bug 1342554
Change-Id: I1673d56751a8a95b988b325b3857c8a5fe4c78ce
Signed-off-by: Chun Xu <chunx@nvidia.com>
Reviewed-on: http://git-master/r/258545
(cherry picked from commit 4516e7c330bb4c5da5020df0d2cc1cb5e9274d9f)
Reviewed-on: http://git-master/r/260033
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/sock.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 7ba763cbf099..4ff2028245f2 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2533,6 +2533,7 @@ char *sk_get_waiting_task_cmdline(struct sock *sk, char *cmdline) struct pid *pid = NULL; struct fown_struct *fown = NULL; struct file *file; + int preempt_count; *program_name = '\0'; @@ -2598,6 +2599,11 @@ char *sk_get_waiting_task_cmdline(struct sock *sk, char *cmdline) softirq_enabled = true; local_bh_enable(); } + if (preempt_count()) { + preempt_count = preempt_count(); + preempt_count() = 0; + } + res = access_process_vm(task, mm->arg_start, cmdline, len, 0); if (res > 0 && cmdline[res-1] != '\0' && len < PAGE_SIZE) { @@ -2613,6 +2619,9 @@ char *sk_get_waiting_task_cmdline(struct sock *sk, char *cmdline) res = strnlen(cmdline, res); } } + + if (preempt_count) + preempt_count() = preempt_count; if (softirq_enabled) local_bh_disable(); |