Date: Wed, 12 Feb 2003 03:25:17 -0800 (PST) From: David Schultz <dschultz@uclink.Berkeley.EDU> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/48205: [PATCH] sys/$arch/include/critical.h: fix gccisms Message-ID: <200302121125.h1CBPHZ7007869@HAL9000.homeunix.com>
next in thread | raw e-mail | index | archive | help
>Number: 48205 >Category: kern >Synopsis: [PATCH] sys/$arch/include/critical.h: fix gccisms >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Feb 12 03:30:08 PST 2003 >Closed-Date: >Last-Modified: >Originator: David Schultz >Release: 5.0-CURRENT >Organization: >Environment: >Description: All of the sys/$arch/include/critical.h files have a !__GNUC__ case that is not syntactically or logically valid. This patch eliminates the need for a !__GNUC__ case by macroifying some simple inline functions. This patch has been compile tested on i386. It should introduce no functional changes. >How-To-Repeat: >Fix: Index: alpha/include/critical.h =================================================================== RCS file: /home/ncvs/src/sys/alpha/include/critical.h,v retrieving revision 1.1 diff -u -r1.1 critical.h --- alpha/include/critical.h 1 Apr 2002 23:51:22 -0000 1.1 +++ alpha/include/critical.h 10 Feb 2003 16:25:55 -0000 @@ -26,22 +26,15 @@ void cpu_critical_fork_exit(void); void cpu_thread_link(struct thread *td); -#ifdef __GNUC__ - /* * cpu_critical_enter: * * This routine is called from critical_enter() on the 0->1 transition * of td_critnest, prior to it being incremented to 1. */ -static __inline void -cpu_critical_enter(void) -{ - struct thread *td; - - td = curthread; - td->td_md.md_savecrit = intr_disable(); -} +#define cpu_critical_enter() do { \ + curthread->td_md.md_savecrit = intr_disable(); \ +} while (0) /* * cpu_critical_exit: @@ -50,21 +43,7 @@ * of td_critnest, after it has been decremented to 0. We are * exiting the last critical section. */ -static __inline void -cpu_critical_exit(void) -{ - struct thread *td; - - td = curthread; - intr_restore(td->td_md.md_savecrit); -} - -#else /* !__GNUC__ */ - -void cpu_critical_enter(void) -void cpu_critical_exit(void) - -#endif /* __GNUC__ */ +#define cpu_critical_exit() (void)intr_restore(curthread->td_md.md_savecrit) __END_DECLS Index: i386/include/critical.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/critical.h,v retrieving revision 1.2 diff -u -r1.2 critical.h --- i386/include/critical.h 10 Jul 2002 20:15:58 -0000 1.2 +++ i386/include/critical.h 10 Feb 2003 16:26:01 -0000 @@ -27,8 +27,6 @@ void cpu_critical_fork_exit(void); void cpu_thread_link(struct thread *td); -#ifdef __GNUC__ - /* * cpu_critical_enter: * @@ -51,31 +49,19 @@ * Note that the td->critnest (1->0) transition interrupt race against * our int_pending/unpend() check below is handled by the interrupt * code for us, so we do not have to do anything fancy. + * + * We may have to schedule pending interrupts. Create conditions + * similar to an interrupt context and call unpend(). + * + * note: we do this even if we are in an interrupt nesting level. + * Deep nesting is protected by critical_*() and if we + * conditionalized it then we would have to check int_pending + * again whenever we decrement td_intr_nesting_level to 0. */ -static __inline void -cpu_critical_exit(void) -{ - /* - * We may have to schedule pending interrupts. Create - * conditions similar to an interrupt context and call - * unpend(). - * - * note: we do this even if we are in an interrupt - * nesting level. Deep nesting is protected by - * critical_*() and if we conditionalized it then we - * would have to check int_pending again whenever - * we decrement td_intr_nesting_level to 0. - */ - if (PCPU_GET(int_pending)) - cpu_unpend(); -} - -#else /* !__GNUC__ */ - -void cpu_critical_enter(void) -void cpu_critical_exit(void) - -#endif /* __GNUC__ */ +#define cpu_critical_exit() do { \ + if (PCPU_GET(int_pending)) \ + cpu_unpend(); \ +} while (0) __END_DECLS Index: ia64/include/critical.h =================================================================== RCS file: /home/ncvs/src/sys/ia64/include/critical.h,v retrieving revision 1.1 diff -u -r1.1 critical.h --- ia64/include/critical.h 1 Apr 2002 23:51:22 -0000 1.1 +++ ia64/include/critical.h 10 Feb 2003 16:26:02 -0000 @@ -26,22 +26,15 @@ void cpu_critical_fork_exit(void); void cpu_thread_link(struct thread *td); -#ifdef __GNUC__ - /* * cpu_critical_enter: * * This routine is called from critical_enter() on the 0->1 transition * of td_critnest, prior to it being incremented to 1. */ -static __inline void -cpu_critical_enter(void) -{ - struct thread *td; - - td = curthread; - td->td_md.md_savecrit = intr_disable(); -} +#define cpu_critical_enter() do { \ + curthread->td_md.md_savecrit = intr_disable(); \ +} while (0) /* * cpu_critical_exit: @@ -50,22 +43,7 @@ * of td_critnest, after it has been decremented to 0. We are * exiting the last critical section. */ -static __inline void -cpu_critical_exit(void) -{ - struct thread *td; - - td = curthread; - intr_restore(td->td_md.md_savecrit); -} - - -#else /* !__GNUC__ */ - -void cpu_critical_enter(void) -void cpu_critical_exit(void) - -#endif /* __GNUC__ */ +#define cpu_critical_exit() (void)intr_restore(curthread->td_md.md_savecrit) __END_DECLS Index: powerpc/include/critical.h =================================================================== RCS file: /home/ncvs/src/sys/powerpc/include/critical.h,v retrieving revision 1.2 diff -u -r1.2 critical.h --- powerpc/include/critical.h 29 Jun 2002 09:55:57 -0000 1.2 +++ powerpc/include/critical.h 10 Feb 2003 16:26:10 -0000 @@ -26,8 +26,6 @@ void cpu_critical_fork_exit(void); void cpu_thread_link(struct thread *td); -#ifdef __GNUC__ - /* * cpu_critical_enter: * @@ -35,17 +33,12 @@ * of td_critnest, prior to it being incremented to 1. */ -static __inline void -cpu_critical_enter(void) -{ - u_int msr; - struct thread *td = curthread; - - msr = mfmsr(); - td->td_md.md_savecrit = msr; - msr &= ~PSL_EE; - mtmsr(msr); -} +#define cpu_critical_enter() do { \ + u_int _msr = mfmsr(); \ + curthread->td_md.md_savecrit = _msr; \ + _msr &= ~PSL_EE; \ + _mtmsr(_msr); \ +} while (0) /* * cpu_critical_exit: @@ -54,21 +47,7 @@ * of td_critnest, after it has been decremented to 0. We are * exiting the last critical section. */ -static __inline void -cpu_critical_exit(void) -{ - struct thread *td = curthread; - - mtmsr(td->td_md.md_savecrit); -} - - -#else /* !__GNUC__ */ - -void cpu_critical_enter(void) -void cpu_critical_exit(void) - -#endif /* __GNUC__ */ +#define cpu_critical_exit() (void)mtmsr(curthread->td_md.md_savecrit) __END_DECLS Index: sparc64/include/critical.h =================================================================== RCS file: /home/ncvs/src/sys/sparc64/include/critical.h,v retrieving revision 1.1 diff -u -r1.1 critical.h --- sparc64/include/critical.h 1 Apr 2002 23:51:23 -0000 1.1 +++ sparc64/include/critical.h 10 Feb 2003 16:26:10 -0000 @@ -26,25 +26,18 @@ void cpu_critical_fork_exit(void); void cpu_thread_link(struct thread *td); -#ifdef __GNUC__ - /* * cpu_critical_enter: * * This routine is called from critical_enter() on the 0->1 transition * of td_critnest, prior to it being incremented to 1. */ -static __inline void -cpu_critical_enter(void) -{ - struct thread *td; - critical_t pil; - - td = curthread; - pil = rdpr(pil); - wrpr(pil, 0, 14); - td->td_md.md_savecrit = pil; -} +#define cpu_critical_enter() do { \ + struct thread *_td = curthread; \ + critical_t _pil = rdpr(pil); \ + wrpr(pil, 0, 14); \ + _td->td_md.md_savecrit = _pil; \ +} while (0) /* @@ -54,21 +47,7 @@ * of td_critnest, after it has been decremented to 0. We are * exiting the last critical section. */ -static __inline void -cpu_critical_exit(void) -{ - struct thread *td; - - td = curthread; - wrpr(pil, td->td_md.md_savecrit, 0); -} - -#else /* !__GNUC__ */ - -void cpu_critical_enter(void) -void cpu_critical_exit(void) - -#endif /* __GNUC__ */ +#define cpu_critical_exit() (void)wrpr(pil, curthread->td_md.md_savecrit, 0) __END_DECLS >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200302121125.h1CBPHZ7007869>