From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Boqun Feng <boqun.feng@gmail.com>,
linux-kernel <linux-kernel@vger.kernel.org>,
linux-api <linux-api@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Andy Lutomirski <luto@amacapital.net>,
Dave Watson <davejwatson@fb.com>, Paul Turner <pjt@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
Russell King <linux@arm.linux.org.uk>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Andi Kleen <andi@firstfloor.org>, Chris Lameter <cl@linux.com>,
Ben Maurer <bmaurer@fb.com>, rostedt <rostedt@goodmis.org>,
Josh Triplett <josh@joshtriplett.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will
Subject: Re: [RFC PATCH for 4.21 06/16] cpu_opv: Provide cpu_opv system call (v8)
Date: Wed, 17 Oct 2018 12:09:51 -0400 (EDT) [thread overview]
Message-ID: <1102241735.877.1539792591430.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <1006597066.825.1539789100381.JavaMail.zimbra@efficios.com>
----- On Oct 17, 2018, at 11:11 AM, Mathieu Desnoyers mathieu.desnoyers@efficios.com wrote:
> ----- On Oct 17, 2018, at 3:19 AM, Srikar Dronamraju srikar@linux.vnet.ibm.com
> wrote:
>
>> 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?
>
> You're right!
>
> How about we ditch the thread migration altogether, and simply perform
> the cpu_opv operations in a IPI handler ?
>
> This is possible now that cpu_opv uses a temporary vmap() rather than
> try to touch the user-space page through the current thread's page table.
>
> Thoughts ?
Here is the associated implementation on top of this patchset:
commit 759c5a8860d867091e168900329f0955e5101989
Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Date: Wed Oct 17 11:32:02 2018 -0400
cpu opv: use ipi
diff --git a/kernel/cpu_opv.c b/kernel/cpu_opv.c
index db144b71d51a..30405e0cc049 100644
--- a/kernel/cpu_opv.c
+++ b/kernel/cpu_opv.c
@@ -31,6 +31,7 @@
#include <linux/mm.h>
#include <linux/vmalloc.h>
#include <linux/atomic.h>
+#include <linux/smp.h>
#include <asm/ptrace.h>
#include <asm/byteorder.h>
#include <asm/cacheflush.h>
@@ -1039,41 +1040,48 @@ static int vaddr_ptrs_check(struct cpu_opv_vaddr *vaddr_ptrs)
return 0;
}
+struct opv_ipi_args {
+ struct cpu_op *cpuop;
+ int cpuopcnt;
+ int ret;
+};
+
+static void cpu_opv_ipi(void *info)
+{
+ struct opv_ipi_args *args = info;
+
+ rseq_preempt(current);
+ args->ret = __do_cpu_opv(args->cpuop, args->cpuopcnt);
+}
+
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;
+ struct opv_ipi_args args = {
+ .cpuop = cpuop,
+ .cpuopcnt = cpuopcnt,
+ };
int ret;
retry:
- if (cpu != raw_smp_processor_id()) {
- ret = push_task_to_cpu(current, cpu);
- if (ret)
- goto check_online;
- }
+ if (!cpumask_test_cpu(cpu, ¤t->cpus_allowed))
+ return -EINVAL;
down_read(&mm->mmap_sem);
ret = vaddr_ptrs_check(vaddr_ptrs);
if (ret)
goto end;
- preempt_disable();
- if (cpu != smp_processor_id()) {
- preempt_enable();
+ ret = smp_call_function_single(cpu, cpu_opv_ipi, &args, 1);
+ if (ret) {
up_read(&mm->mmap_sem);
- goto retry;
+ goto check_online;
}
- ret = __do_cpu_opv(cpuop, cpuopcnt);
- preempt_enable();
+ ret = args.ret;
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();
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2018-10-17 16:09 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-10 19:19 [RFC PATCH for 4.21 00/16] rseq updates, new cpu_opv system call Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 01/16] rseq/selftests: Add reference counter to coexist with glibc Mathieu Desnoyers
2018-10-11 10:37 ` Szabolcs Nagy
2018-10-11 15:13 ` Mathieu Desnoyers
2018-10-11 16:20 ` Szabolcs Nagy
2018-10-11 16:37 ` Mathieu Desnoyers
2018-10-11 17:04 ` Szabolcs Nagy
2018-10-11 19:42 ` Mathieu Desnoyers
2018-10-12 9:59 ` Szabolcs Nagy
2018-10-23 14:59 ` Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 02/16] rseq/selftests: Adapt number of threads to the number of detected cpus Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 03/16] sched: Implement push_task_to_cpu (v2) Mathieu Desnoyers
2018-10-17 6:51 ` Srikar Dronamraju
2018-10-17 15:09 ` Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 04/16] mm: Introduce vm_map_user_ram, vm_unmap_user_ram Mathieu Desnoyers
2018-10-16 18:30 ` Steven Rostedt
2018-10-16 19:21 ` Mathieu Desnoyers
2018-10-16 19:40 ` Steven Rostedt
2018-10-17 0:27 ` Sergey Senozhatsky
2018-10-17 15:00 ` Mathieu Desnoyers
2018-10-17 15:04 ` Mathieu Desnoyers
2018-10-17 15:34 ` Sergey Senozhatsky
2018-10-10 19:19 ` [RFC PATCH for 4.21 05/16] mm: Provide is_vma_noncached Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 06/16] cpu_opv: Provide cpu_opv system call (v8) Mathieu Desnoyers
2018-10-16 8:10 ` Sergey Senozhatsky
2018-10-16 19:17 ` Mathieu Desnoyers
2018-10-17 1:46 ` Sergey Senozhatsky
2018-10-17 7:19 ` Srikar Dronamraju
2018-10-17 15:11 ` Mathieu Desnoyers
2018-10-17 16:09 ` Mathieu Desnoyers [this message]
2018-10-10 19:19 ` [RFC PATCH for 4.21 07/16] cpu_opv: limit amount of virtual address space used by cpu_opv Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 08/16] x86: Wire up cpu_opv system call Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 09/16] powerpc: " Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 10/16] arm: " Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 11/16] cpu-opv/selftests: Provide cpu-op library Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 12/16] cpu-opv/selftests: Provide basic test Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 13/16] cpu-opv/selftests: Provide percpu_op API Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 14/16] cpu-opv/selftests: Provide basic percpu ops test Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 15/16] cpu-opv/selftests: Provide parametrized tests Mathieu Desnoyers
2018-10-10 19:19 ` [RFC PATCH for 4.21 16/16] cpu-opv/selftests: Provide Makefile, scripts, gitignore Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1102241735.877.1539792591430.JavaMail.zimbra@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=bmaurer@fb.com \
--cc=boqun.feng@gmail.com \
--cc=catalin.marinas@arm.com \
--cc=cl@linux.com \
--cc=davejwatson@fb.com \
--cc=hpa@zytor.com \
--cc=josh@joshtriplett.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=luto@amacapital.net \
--cc=mingo@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=rostedt@goodmis.org \
--cc=srikar@linux.vnet.ibm.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).