tech-kern archive

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

Re: ci_want_resched bits vs. MD ci_data.cpu_softints bits



On Thu, Jul 07, 2022 at 09:22:42PM +0200, Martin Husemann wrote:
> 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.

Even if this (currently) does not seem to cause issues, mixing bits from
different bitsets is wrong, so I'd like to commit the originaly proposed
fix (only ever clear all bits).

Additionaly I'd like to commit something like the second change below, fixing
an issue when creating new lwps (that neither should have ASTs pending nor
own the altivec psu). I am not sure if the PSL_VEC is the only bit that
should be cleared here.

Martin


Index: kern/kern_synch.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_synch.c,v
retrieving revision 1.352
diff -u -p -r1.352 kern_synch.c
--- kern/kern_synch.c	26 Oct 2022 23:23:28 -0000	1.352
+++ kern/kern_synch.c	3 Dec 2022 14:14:38 -0000
@@ -554,7 +554,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;
 }
Index: arch/powerpc/powerpc/vm_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/vm_machdep.c,v
retrieving revision 1.104
diff -u -p -r1.104 vm_machdep.c
--- arch/powerpc/powerpc/vm_machdep.c	6 Jul 2020 10:52:12 -0000	1.104
+++ arch/powerpc/powerpc/vm_machdep.c	3 Dec 2022 14:14:38 -0000
@@ -95,8 +95,13 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	struct pcb * const pcb1 = lwp_getpcb(l1);
 	struct pcb * const pcb2 = lwp_getpcb(l2);
 
-	/* Copy MD part of lwp and set up user trapframe pointer.  */
+	/*
+	 * Copy MD part of lwp, fix up for new lwp and set up user
+	 * trapframe pointer.
+	 */
 	l2->l_md = l1->l_md;
+	l2->l_md.md_flags &= ~PSL_VEC;
+	l2->l_md.md_astpending = 0;
 	l2->l_md.md_utf = trapframe(l2);
 
 	/* Copy PCB. */



Home | Main Index | Thread Index | Old Index