tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

ci_want_resched bits vs. MD ci_data.cpu_softints bits



Hey folks,

while staring at PR 55415 and recently having learned that powerpc fast
softints are broken, I found a strange ancient line of code that I think
is not correct in the current world order any more:

Index: kern_synch.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_synch.c,v
retrieving revision 1.351
diff -u -p -r1.351 kern_synch.c
--- kern_synch.c	29 Jun 2022 22:27:01 -0000	1.351
+++ kern_synch.c	7 Jul 2022 19:16:13 -0000
@@ -553,7 +553,8 @@ nextlwp(struct cpu_info *ci, struct sche
 	 * the update to ci_want_resched will become globally visible before
 	 * the release of spc_mutex becomes globally visible.
 	 */
-	ci->ci_want_resched = ci->ci_data.cpu_softints;
+	if (ci->ci_data.cpu_softints == 0)
+		ci->ci_want_resched = 0;
 
 	return newl;
 }


I guess in older times ci->ci_want_resched was used as a boolean flag, so only
0 or !0 did matter - but nowadays it is a flag word of various bits:

#define     RESCHED_REMOTE          0x01    /* request is for a remote CPU */
#define     RESCHED_IDLE            0x02    /* idle LWP observed */
#define     RESCHED_UPREEMPT        0x04    /* immediate user ctx switch */
#define     RESCHED_KPREEMPT        0x08    /* immediate kernel ctx switch */


The MD usage of ci_data.cpu_softints on powerpc is a bitmask of pending
softint IPLs, which could easily collide with above flags.

I don't know if this has any bad consequences, but it seems cleaner
to avoid the possibility and either clear or leave alone.

Or am I overlooking some magic?

Martin


Home | Main Index | Thread Index | Old Index