Thread (39 messages) read the whole thread 39 messages, 5 authors, 2h ago

Re: [PATCH v4 1/1] powerpc: enable dynamic preemption

From: Shrikanth Hegde <hidden>
Date: 2026-07-27 11:04:23
Also in: lkml


On 7/27/26 4:29 PM, Jirka Hladky wrote:
On Mon, Jul 27, 2026 at 12:29 PM Shrikanth Hegde [off-list ref] wrote:
quoted
That means comparison is between preempt=voluntary vs preempt=lazy.

If you make it full preemption in 6.15 you will likely see similar
data as 7.1+. Only on 7.0/7.1 there is force switch to lazy/full.
Can you give that a try?

If it shows same data, that implies the regression is mainly due to
change of preemption modes, rather than the static key stuff.
Tested on 7.1 by switching the runtime mode via
/sys/kernel/debug/sched/preempt:

Mode       kill bogo-ops/sec
----       -----------------
full       57,476
lazy       56,892
Delta      ~1% (noise)
What I asked you was to do voluntary vs lazy comparison without
CONFIG_PREEMPT_DYNAMIC.
The preemption mode (full vs lazy) makes no difference. The regression
is from CONFIG_PREEMPT_RCU being enabled, not from the choice of
preemption mode.

And as Christophe pointed out, it's CONFIG_PREEMPT_DYNAMIC that pulls
in CONFIG_PREEMPT_RCU, not CONFIG_PREEMPT_LAZY:

   config PREEMPT_RCU
         default y if (PREEMPT || PREEMPT_RT || PREEMPT_DYNAMIC)

So the chain is: your patch enables HAVE_PREEMPT_DYNAMIC_KEY ->
CONFIG_PREEMPT_DYNAMIC takes effect -> CONFIG_PREEMPT_RCU=y ->
expensive rcu_read_lock/unlock on ppc64le.
quoted
Plus, it may call schedule in lazy/pull preemption.
The full vs lazy results above suggest extra scheduling is not a
significant factor here.
quoted
This seems strange. How come rcu lock/unlock depends on SELinux
policy? One should call rcu lock/unlock if they are working with
rcu updated fields.

Does the policy change itself protected with rcu lock/unlock?
The rcu_read_lock/unlock calls don't depend on SELinux policy -- they
are in the SELinux *code path* itself. SELinux uses RCU to protect
its AVC (Access Vector Cache) lookups. Every call to avc_has_perm()
takes rcu_read_lock() around the avc_lookup() hash table access.

When you boot with selinux=0, the SELinux LSM hooks are never called,
so the AVC code path (and its rcu_read_lock/unlock pairs) is never
reached. That's why disabling SELinux removes those call sites from
the hot path.

The call chain is:
   sys_kill -> check_kill_permission -> security_task_kill
     -> selinux_task_kill -> avc_has_perm
       -> rcu_read_lock()
       -> avc_lookup()    <-- hash table lookup under RCU protection
       -> rcu_read_unlock()

With selinux=0, security_task_kill() is essentially a no-op and none
of the avc/rcu code runs.

Jirka
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help