Hi Mathieu,

> +static int do_cpu_opv(struct cpu_op *cpuop, int cpuopcnt,
> +                   struct cpu_opv_vaddr *vaddr_ptrs, int cpu)
> +{
> +     struct mm_struct *mm = current->mm;
> +     int ret;
> +
> +retry:
> +     if (cpu != raw_smp_processor_id()) {
> +             ret = push_task_to_cpu(current, cpu);
> +             if (ret)
> +                     goto check_online;
> +     }
> +     down_read(&mm->mmap_sem);
> +     ret = vaddr_ptrs_check(vaddr_ptrs);
> +     if (ret)
> +             goto end;
> +     preempt_disable();
> +     if (cpu != smp_processor_id()) {
> +             preempt_enable();
> +             up_read(&mm->mmap_sem);
> +             goto retry;
> +     }

If we have a higher priority task/s either pinned to the cpu, dont we end up
in busy-looping till the task exits/sleeps?

> +     ret = __do_cpu_opv(cpuop, cpuopcnt);
> +     preempt_enable();
> +end:
> +     up_read(&mm->mmap_sem);
> +     return ret;
> +
> +check_online:
> +     /*
> +      * push_task_to_cpu() returns -EINVAL if the requested cpu is not part
> +      * of the current thread's cpus_allowed mask.
> +      */
> +     if (ret == -EINVAL)
> +             return ret;
> +     get_online_cpus();
> +     if (cpu_online(cpu)) {
> +             put_online_cpus();
> +             goto retry;
> +     }

Reply via email to