Thread (3 messages) 3 messages, 2 authors, 2020-01-25

Re: [PATCH v8 4/5] locking/qspinlock: Introduce starvation avoidance into CNA

From: Waiman Long <longman@redhat.com>
Date: 2020-01-24 18:51:45
Also in: linux-arch, lkml

On 1/24/20 1:40 PM, Waiman Long wrote:
On 1/24/20 1:19 PM, Alex Kogan wrote:
quoted
quoted
On Jan 24, 2020, at 11:46 AM, Waiman Long <longman@redhat.com
<mailto:longman@redhat.com>> wrote:

On 1/24/20 11:29 AM, Alex Kogan wrote:
quoted
quoted
On Jan 24, 2020, at 10:19 AM, Waiman Long <longman@redhat.com
<mailto:longman@redhat.com>> wrote:

On 1/24/20 9:42 AM, Waiman Long wrote:
quoted
On 1/24/20 2:52 AM, Peter Zijlstra wrote:
quoted
On Thu, Jan 23, 2020 at 04:33:54PM -0500, Alex Kogan wrote:
quoted
Let me put this question to you. What do you think the number
should be?
I think it would be very good to keep the inter-node latency
below 1ms.
It is hard to guarantee that given that lock hold times can vary
quite a
lot depending on the workload. What we can control is just how many
later lock waiters can jump ahead before a given waiter.
I totally agree. I do not think you can guarantee that latency even
today.
With the existing spinlock, you join the queue and wait for as long
as it takes
for each and every thread in front of you to execute its critical
section.
quoted
quoted
quoted
But to realize that we need data on the lock hold times.
Specifically
for the heavily contended locks that make CNA worth it in the first
place.

I don't see that data, so I don't see how we can argue about
this let
alone call something reasonable.
In essence, CNA lock is for improving throughput on NUMA machines
at the
expense of increasing worst case latency. If low latency is
important,
it should be disabled. If CONFIG_PREEMPT_RT is on,
CONFIG_NUMA_AWARE_SPINLOCKS should be off.
Actually, what we are worrying about is the additional latency
that can
be added to important tasks or execution contexts that are waiting
for a
lock. Maybe we can make CNA lock behaves somewhat like qrwlock is that
requests from interrupt context are giving priority. We could add a
priority flag in the CNA node. If the flag is set, we will never
put it
into the secondary queue. In fact, we can transfer control next to it
even if it is not on the same node. We may also set the priority
flag if
it is a RT task that is trying to acquire the lock.
I think this is possible, and in fact, we have been thinking along
those lines
about ways to better support RT tasks with CNA. However, this will
_probably
require changes to API and will _certainly complicate the code
quite a bit.
What you need to do is to modify cna_init_node() to check the
current locking context and set the priority flag accordingly.
Is there a lightweight way to identify such a “prioritized” thread?
You can use the in_task() macro in include/linux/preempt.h. This is
just a percpu preempt_count read and test. If in_task() is false, it
is in a {soft|hard}irq or nmi context. If it is true, you can check
the rt_task() macro to see if it is an RT task. That will access to
the current task structure. So it may cost a little bit more if you
want to handle the RT task the same way.
We may not need to do that for softIRQ context. If that is the case, you
can use in_irq() which checks for hardirq and nmi only. Peter, what is
your thought on that?

Cheers,
Longman



_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help