]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] might_sleep() improvements
authorAndrew Morton <akpm@osdl.org>
Wed, 3 Sep 2003 18:12:43 +0000 (11:12 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Wed, 3 Sep 2003 18:12:43 +0000 (11:12 -0700)
From: Mitchell Blank Jr <mitch@sfgoth.com>

This patch makes the following improvements to might_sleep():

 o Add a "might_sleep_if()" macro for when we might sleep only if some
   condition is met.  It's a bit tidier, and has an unlikely() in it.

 o Add might_sleep checks to skb_share_check() and skb_unshare() which
   sometimes need to allocate memory.

 o Make all architectures call might_sleep() in both down() and
   down_interruptible().  Before only ppc, ppc64, and i386 did this check.
   (sh did the check on down() but not down_interruptible())

21 files changed:
arch/sparc64/kernel/semaphore.c
include/asm-alpha/semaphore.h
include/asm-arm/semaphore.h
include/asm-arm26/semaphore.h
include/asm-cris/semaphore.h
include/asm-h8300/semaphore.h
include/asm-ia64/semaphore.h
include/asm-m68k/semaphore.h
include/asm-m68knommu/semaphore.h
include/asm-mips/semaphore.h
include/asm-parisc/semaphore.h
include/asm-s390/semaphore.h
include/asm-sh/semaphore.h
include/asm-sparc/semaphore.h
include/asm-v850/semaphore.h
include/asm-x86_64/semaphore.h
include/linux/kernel.h
include/linux/skbuff.h
mm/page_alloc.c
mm/rmap.c
mm/slab.c

index 4ce2f9369019e0b449cc78f04e46c6892d4bd73d..a9e66d666ceb71890017ce9ae94936ada1e521f4 100644 (file)
@@ -110,6 +110,7 @@ static void __down(struct semaphore * sem)
 
 void down(struct semaphore *sem)
 {
+       might_sleep();
        /* This atomically does:
         *      old_val = sem->count;
         *      new_val = sem->count - 1;
@@ -219,6 +220,7 @@ int down_interruptible(struct semaphore *sem)
 {
        int ret = 0;
        
+       might_sleep();
        /* This atomically does:
         *      old_val = sem->count;
         *      new_val = sem->count - 1;
index ab26cfbaddbfe76facac91b2feb9abe43b4c9e93..a363f018a35f27802b4768483fb176f24a9877a8 100644 (file)
@@ -88,14 +88,18 @@ extern void __up_wakeup(struct semaphore *);
 
 static inline void __down(struct semaphore *sem)
 {
-       long count = atomic_dec_return(&sem->count);
+       long count;
+       might_sleep();
+       count = atomic_dec_return(&sem->count);
        if (unlikely(count < 0))
                __down_failed(sem);
 }
 
 static inline int __down_interruptible(struct semaphore *sem)
 {
-       long count = atomic_dec_return(&sem->count);
+       long count;
+       might_sleep();
+       count = atomic_dec_return(&sem->count);
        if (unlikely(count < 0))
                return __down_failed_interruptible(sem);
        return 0;
index 656120edc11b7d350502c96ad6344163b8fe391a..76284ff21f499569364b196a02c588b50020633a 100644 (file)
@@ -88,7 +88,7 @@ static inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        __down_op(sem, __down_failed);
 }
 
@@ -101,7 +101,7 @@ static inline int down_interruptible (struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        return __down_op_ret(sem, __down_interruptible_failed);
 }
 
index a7d94526309dedf2850df0f4f8fffec59a4023e2..49946274a67b37a0f842a45339662dcaa8e906a9 100644 (file)
@@ -84,7 +84,7 @@ static inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        __down_op(sem, __down_failed);
 }
 
@@ -97,7 +97,7 @@ static inline int down_interruptible (struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        return __down_op_ret(sem, __down_interruptible_failed);
 }
 
index 011a3bdc9ca7902cff602d6f572f05d337dd8e03..d0821f6cef7fa8e9250f906db2f3b0e5267d2373 100644 (file)
@@ -79,6 +79,7 @@ extern inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        /* atomically decrement the semaphores count, and if its negative, we wait */
        local_save_flags(flags);
@@ -104,6 +105,7 @@ extern inline int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        /* atomically decrement the semaphores count, and if its negative, we wait */
        local_save_flags(flags);
index 962f5eb32d162ced7d0af12d3c5968c2cc17f294..62e6e9ce669e6f22e9ae712cbd1a11a0eac0c04e 100644 (file)
@@ -90,6 +90,7 @@ static inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        count = &(sem->count);
        __asm__ __volatile__(
@@ -117,6 +118,7 @@ static inline int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        count = &(sem->count);
        __asm__ __volatile__(
index dd0eade35495e8b3344b6c0f4a62e19f23774418..44165a637add321e28a3e4f5051874e513341317 100644 (file)
@@ -73,6 +73,7 @@ down (struct semaphore *sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
        if (atomic_dec_return(&sem->count) < 0)
                __down(sem);
 }
@@ -89,6 +90,7 @@ down_interruptible (struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
        if (atomic_dec_return(&sem->count) < 0)
                ret = __down_interruptible(sem);
        return ret;
index 8581f361c52df508cbfa160de54a1a63c538e11f..cc844ef36a83d97661d7b9e5e64bb7033e16bbff 100644 (file)
@@ -89,7 +89,7 @@ extern inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        __asm__ __volatile__(
                "| atomic down operation\n\t"
                "subql #1,%0@\n\t"
@@ -112,7 +112,7 @@ extern inline int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        __asm__ __volatile__(
                "| atomic interruptible down operation\n\t"
                "subql #1,%1@\n\t"
index 4720a09e6191500fbe4b35ce93c1f82b5da8b61f..f85d311bc2d897cba4bd847cb872f054cd828b1f 100644 (file)
@@ -88,7 +88,7 @@ extern inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        __asm__ __volatile__(
                "| atomic down operation\n\t"
                "movel  %0, %%a1\n\t"
@@ -108,7 +108,7 @@ extern inline int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        __asm__ __volatile__(
                "| atomic down operation\n\t"
                "movel  %1, %%a1\n\t"
index 34fc00d604604020007524174372c300f070645b..a867bb1014beabf5f78e09075136a3f0b7f53f3f 100644 (file)
@@ -88,6 +88,7 @@ static inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
        if (atomic_dec_return(&sem->count) < 0)
                __down(sem);
 }
@@ -103,6 +104,7 @@ static inline int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
        if (atomic_dec_return(&sem->count) < 0)
                ret = __down_interruptible(sem);
        return ret;
index 80686a7ab2504cb4640a67080bab33cbec3698be..f01554398f1a062c37b2f66a09cc7e5616799e0e 100644 (file)
@@ -84,7 +84,7 @@ extern __inline__ void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        spin_lock_irq(&sem->sentry);
        if (sem->count > 0) {
                sem->count--;
@@ -100,7 +100,7 @@ extern __inline__ int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
-
+       might_sleep();
        spin_lock_irq(&sem->sentry);
        if (sem->count > 0) {
                sem->count--;
index 474abcd85b346411147fa77370e042a29f2e6afa..5720dea2459f7bf080b3e5ec174c2965d306c4db 100644 (file)
@@ -60,6 +60,7 @@ asmlinkage void __up(struct semaphore * sem);
 
 static inline void down(struct semaphore * sem)
 {
+       might_sleep();
        if (atomic_dec_return(&sem->count) < 0)
                __down(sem);
 }
@@ -68,6 +69,7 @@ static inline int down_interruptible(struct semaphore * sem)
 {
        int ret = 0;
 
+       might_sleep();
        if (atomic_dec_return(&sem->count) < 0)
                ret = __down_interruptible(sem);
        return ret;
index 2ba0930035f64fdfd9591fccf01eba20f88feaa5..dc8955e3448c8236618e44349352b0b116e0eb17 100644 (file)
@@ -107,6 +107,7 @@ static inline int down_interruptible(struct semaphore * sem)
        CHECK_MAGIC(sem->__magic);
 #endif
 
+       might_sleep();
        if (atomic_dec_return(&sem->count) < 0)
                ret = __down_interruptible(sem);
        return ret;
index cf3135b928a054e24be763e0644274a8cb5bd137..0e6122ae3058cb5d10fecb47f4f0304aee5ea45e 100644 (file)
@@ -71,6 +71,7 @@ static inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        ptr = &(sem->count.counter);
        increment = 1;
@@ -107,6 +108,7 @@ static inline int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        ptr = &(sem->count.counter);
        increment = 1;
index 0d6560f3ba98e7ba9d26f7dd47d7b07cdcb6041a..c514062bb69e42fd1e303e1e562204abd99c6f1b 100644 (file)
@@ -57,6 +57,7 @@ extern void __up (struct semaphore * sem);
 
 extern inline void down (struct semaphore * sem)
 {
+       might_sleep();
        if (atomic_dec_return (&sem->count) < 0)
                __down (sem);
 }
@@ -64,6 +65,7 @@ extern inline void down (struct semaphore * sem)
 extern inline int down_interruptible (struct semaphore * sem)
 {
        int ret = 0;
+       might_sleep();
        if (atomic_dec_return (&sem->count) < 0)
                ret = __down_interruptible (sem);
        return ret;
index 6f42c7af790b5fa92529ddf4232c8c54daa26b12..5fe25482faccc7a970ce12a4a649538cc828fdce 100644 (file)
@@ -118,6 +118,7 @@ static inline void down(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        __asm__ __volatile__(
                "# atomic down operation\n\t"
@@ -144,6 +145,7 @@ static inline int down_interruptible(struct semaphore * sem)
 #if WAITQUEUE_DEBUG
        CHECK_MAGIC(sem->__magic);
 #endif
+       might_sleep();
 
        __asm__ __volatile__(
                "# atomic interruptible down operation\n\t"
index b0aebfeda888cc3e1a59b864d3a2ad7a717bce6a..b2d17ea0dac08735a00f638c29e0822284928036 100644 (file)
@@ -52,8 +52,10 @@ struct completion;
 #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
 void __might_sleep(char *file, int line);
 #define might_sleep() __might_sleep(__FILE__, __LINE__)
+#define might_sleep_if(cond) do { if (unlikely(cond)) might_sleep(); } while (0)
 #else
 #define might_sleep() do {} while(0)
+#define might_sleep_if(cond) do {} while (0)
 #endif
 
 extern struct notifier_block *panic_notifier_list;
index a372186cb6d602c7b3eb12942d5d59e48be4528a..4b5f057f8bfbe7e8501ae36e877fb228d7b2ac15 100644 (file)
@@ -389,6 +389,7 @@ static inline int skb_shared(struct sk_buff *skb)
  */
 static inline struct sk_buff *skb_share_check(struct sk_buff *skb, int pri)
 {
+       might_sleep_if(pri & __GFP_WAIT);
        if (skb_shared(skb)) {
                struct sk_buff *nskb = skb_clone(skb, pri);
                kfree_skb(skb);
@@ -419,6 +420,7 @@ static inline struct sk_buff *skb_share_check(struct sk_buff *skb, int pri)
  */
 static inline struct sk_buff *skb_unshare(struct sk_buff *skb, int pri)
 {
+       might_sleep_if(pri & __GFP_WAIT);
        if (skb_cloned(skb)) {
                struct sk_buff *nskb = skb_copy(skb, pri);
                kfree_skb(skb); /* Free our shared copy */
index 2ac25b6c141f0430531865ae0543a824db22e04a..4051a19b0ab5447a96a131747bdfa0e75a97316e 100644 (file)
@@ -543,8 +543,7 @@ __alloc_pages(unsigned int gfp_mask, unsigned int order,
        int do_retry;
        struct reclaim_state reclaim_state;
 
-       if (wait)
-               might_sleep();
+       might_sleep_if(wait);
 
        cold = 0;
        if (gfp_mask & __GFP_COLD)
index 06377cb9c907ee82b5dde38a62393184c7a98bae..c4434f218e4de9688e5c314ad45c1b2a5582824f 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -503,8 +503,7 @@ struct pte_chain *pte_chain_alloc(int gfp_flags)
        struct pte_chain *ret;
        struct pte_chain **pte_chainp;
 
-       if (gfp_flags & __GFP_WAIT)
-               might_sleep();
+       might_sleep_if(gfp_flags & __GFP_WAIT);
 
        pte_chainp = &get_cpu_var(local_pte_chain);
        if (*pte_chainp) {
index f54d4e83c7f3c5b2e1cdbe101bc958397e79ecf7..34b62ca48429af5bbab1fe839cdde46d4b209435 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1814,8 +1814,7 @@ alloc_done:
 static inline void
 cache_alloc_debugcheck_before(kmem_cache_t *cachep, int flags)
 {
-       if (flags & __GFP_WAIT)
-               might_sleep();
+       might_sleep_if(flags & __GFP_WAIT);
 #if DEBUG
        kmem_flagcheck(cachep, flags);
 #endif