Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
* 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6: (94 commits) [PATCH] x86-64: Remove mk_pte_phys() [PATCH] i386: Fix broken CONFIG_COMPAT_VDSO on i386 [PATCH] i386: fix 32-bit ioctls on x64_32 [PATCH] x86: Unify pcspeaker platform device code between i386/x86-64 [PATCH] i386: Remove extern declaration from mm/discontig.c, put in header. [PATCH] i386: Rename cpu_gdt_descr and remove extern declaration from smpboot.c [PATCH] i386: Move mce_disabled to asm/mce.h [PATCH] i386: paravirt unhandled fallthrough [PATCH] x86_64: Wire up compat epoll_pwait [PATCH] x86: Don't require the vDSO for handling a.out signals [PATCH] i386: Fix Cyrix MediaGX detection [PATCH] i386: Fix warning in cpu initialization [PATCH] i386: Fix warning in microcode.c [PATCH] x86: Enable NMI watchdog for AMD Family 0x10 CPUs [PATCH] x86: Add new CPUID bits for AMD Family 10 CPUs in /proc/cpuinfo [PATCH] i386: Remove fastcall in paravirt.[ch] [PATCH] x86-64: Fix wrong gcc check in bitops.h [PATCH] x86-64: survive having no irq mapping for a vector [PATCH] i386: geode configuration fixes [PATCH] i386: add option to show more code in oops reports ...
This commit is contained in:
+30
-14
@@ -217,7 +217,10 @@ static int wait_for_helper(void *data)
|
||||
sub_info->retval = ret;
|
||||
}
|
||||
|
||||
complete(sub_info->complete);
|
||||
if (sub_info->wait < 0)
|
||||
kfree(sub_info);
|
||||
else
|
||||
complete(sub_info->complete);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -239,6 +242,9 @@ static void __call_usermodehelper(struct work_struct *work)
|
||||
pid = kernel_thread(____call_usermodehelper, sub_info,
|
||||
CLONE_VFORK | SIGCHLD);
|
||||
|
||||
if (wait < 0)
|
||||
return;
|
||||
|
||||
if (pid < 0) {
|
||||
sub_info->retval = pid;
|
||||
complete(sub_info->complete);
|
||||
@@ -253,6 +259,9 @@ static void __call_usermodehelper(struct work_struct *work)
|
||||
* @envp: null-terminated environment list
|
||||
* @session_keyring: session keyring for process (NULL for an empty keyring)
|
||||
* @wait: wait for the application to finish and return status.
|
||||
* when -1 don't wait at all, but you get no useful error back when
|
||||
* the program couldn't be exec'ed. This makes it safe to call
|
||||
* from interrupt context.
|
||||
*
|
||||
* Runs a user-space application. The application is started
|
||||
* asynchronously if wait is not set, and runs as a child of keventd.
|
||||
@@ -265,17 +274,8 @@ int call_usermodehelper_keys(char *path, char **argv, char **envp,
|
||||
struct key *session_keyring, int wait)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(done);
|
||||
struct subprocess_info sub_info = {
|
||||
.work = __WORK_INITIALIZER(sub_info.work,
|
||||
__call_usermodehelper),
|
||||
.complete = &done,
|
||||
.path = path,
|
||||
.argv = argv,
|
||||
.envp = envp,
|
||||
.ring = session_keyring,
|
||||
.wait = wait,
|
||||
.retval = 0,
|
||||
};
|
||||
struct subprocess_info *sub_info;
|
||||
int retval;
|
||||
|
||||
if (!khelper_wq)
|
||||
return -EBUSY;
|
||||
@@ -283,9 +283,25 @@ int call_usermodehelper_keys(char *path, char **argv, char **envp,
|
||||
if (path[0] == '\0')
|
||||
return 0;
|
||||
|
||||
queue_work(khelper_wq, &sub_info.work);
|
||||
sub_info = kzalloc(sizeof(struct subprocess_info), GFP_ATOMIC);
|
||||
if (!sub_info)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_WORK(&sub_info->work, __call_usermodehelper);
|
||||
sub_info->complete = &done;
|
||||
sub_info->path = path;
|
||||
sub_info->argv = argv;
|
||||
sub_info->envp = envp;
|
||||
sub_info->ring = session_keyring;
|
||||
sub_info->wait = wait;
|
||||
|
||||
queue_work(khelper_wq, &sub_info->work);
|
||||
if (wait < 0) /* task has freed sub_info */
|
||||
return 0;
|
||||
wait_for_completion(&done);
|
||||
return sub_info.retval;
|
||||
retval = sub_info->retval;
|
||||
kfree(sub_info);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(call_usermodehelper_keys);
|
||||
|
||||
|
||||
@@ -1853,6 +1853,13 @@ context_switch(struct rq *rq, struct task_struct *prev,
|
||||
struct mm_struct *mm = next->mm;
|
||||
struct mm_struct *oldmm = prev->active_mm;
|
||||
|
||||
/*
|
||||
* For paravirt, this is coupled with an exit in switch_to to
|
||||
* combine the page table reload and the switch backend into
|
||||
* one hypercall.
|
||||
*/
|
||||
arch_enter_lazy_cpu_mode();
|
||||
|
||||
if (!mm) {
|
||||
next->active_mm = oldmm;
|
||||
atomic_inc(&oldmm->mm_count);
|
||||
|
||||
+1
-3
@@ -1162,11 +1162,9 @@ static inline void calc_load(unsigned long ticks)
|
||||
* This read-write spinlock protects us from races in SMP while
|
||||
* playing with xtime and avenrun.
|
||||
*/
|
||||
#ifndef ARCH_HAVE_XTIME_LOCK
|
||||
__cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
|
||||
__attribute__((weak)) __cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
|
||||
|
||||
EXPORT_SYMBOL(xtime_lock);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This function runs timers and the timer-tq in bottom half context.
|
||||
|
||||
Reference in New Issue
Block a user