diff options
Diffstat (limited to 'kernel/softirq.c')
| -rw-r--r-- | kernel/softirq.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 671f9594e368..b73e681df09e 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
| @@ -210,6 +210,14 @@ asmlinkage void __do_softirq(void) | |||
| 210 | __u32 pending; | 210 | __u32 pending; |
| 211 | int max_restart = MAX_SOFTIRQ_RESTART; | 211 | int max_restart = MAX_SOFTIRQ_RESTART; |
| 212 | int cpu; | 212 | int cpu; |
| 213 | unsigned long old_flags = current->flags; | ||
| 214 | |||
| 215 | /* | ||
| 216 | * Mask out PF_MEMALLOC s current task context is borrowed for the | ||
| 217 | * softirq. A softirq handled such as network RX might set PF_MEMALLOC | ||
| 218 | * again if the socket is related to swap | ||
| 219 | */ | ||
| 220 | current->flags &= ~PF_MEMALLOC; | ||
| 213 | 221 | ||
| 214 | pending = local_softirq_pending(); | 222 | pending = local_softirq_pending(); |
| 215 | account_system_vtime(current); | 223 | account_system_vtime(current); |
| @@ -265,6 +273,7 @@ restart: | |||
| 265 | 273 | ||
| 266 | account_system_vtime(current); | 274 | account_system_vtime(current); |
| 267 | __local_bh_enable(SOFTIRQ_OFFSET); | 275 | __local_bh_enable(SOFTIRQ_OFFSET); |
| 276 | tsk_restore_flags(current, old_flags, PF_MEMALLOC); | ||
| 268 | } | 277 | } |
| 269 | 278 | ||
| 270 | #ifndef __ARCH_HAS_DO_SOFTIRQ | 279 | #ifndef __ARCH_HAS_DO_SOFTIRQ |
