Re: periodically-drain-non-local-pagesets-fix.patch added to -mm

Andrew Morton
2005-06-03T07:22:10Z

Keith Owens <kaos@sgi.com> wrote:
>
> Does this fix the problem? Compiled but not tested.
>
> Index: linux/include/asm-ia64/processor.h
> =================================> --- linux.orig/include/asm-ia64/processor.h 2005-06-03 13:05:48.421839027 +1000
> +++ linux/include/asm-ia64/processor.h 2005-06-03 17:10:43.911784989 +1000
> @@ -407,15 +407,18 @@ extern void ia64_setreg_unknown_kr (void
> #define ia64_is_local_fpu_owner(t) \
> ({ \
> struct task_struct *__ia64_islfo_task = (t); \
> - (__ia64_islfo_task->thread.last_fph_cpu = smp_processor_id() \
> + int ret = (__ia64_islfo_task->thread.last_fph_cpu = get_cpu() \
> && __ia64_islfo_task = (struct task_struct *) ia64_get_kr(IA64_KR_FPU_OWNER)); \
> + put_cpu(); \
> + ret; \
> })
>
> /* Mark task T as owning the fph partition of the CPU we're running on. */
> #define ia64_set_local_fpu_owner(t) do { \
> struct task_struct *__ia64_slfo_task = (t); \
> - __ia64_slfo_task->thread.last_fph_cpu = smp_processor_id(); \
> + __ia64_slfo_task->thread.last_fph_cpu = get_cpu(); \
> ia64_set_kr(IA64_KR_FPU_OWNER, (unsigned long) __ia64_slfo_task); \
> + put_cpu(); \
> } while (0)
>
> /* Mark the fph partition of task T as being invalid on all CPUs. */

Well it'll make the warning go away but I think there's a more fundamental
problem, in that:

get_cpu();
cond = something_which_uses_smp_processor_id();
put_cpu();

/* `cond' can become false at any time from here */