diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/acpi/acpi_bus.h | 1 | ||||
| -rw-r--r-- | include/linux/compiler.h | 3 | ||||
| -rw-r--r-- | include/linux/ftrace.h | 8 | ||||
| -rw-r--r-- | include/linux/hardirq.h | 2 | ||||
| -rw-r--r-- | include/linux/init_task.h | 2 | ||||
| -rw-r--r-- | include/linux/interrupt.h | 75 | ||||
| -rw-r--r-- | include/linux/irq.h | 5 | ||||
| -rw-r--r-- | include/linux/irqreturn.h | 2 | ||||
| -rw-r--r-- | include/linux/sched.h | 23 |
9 files changed, 103 insertions, 18 deletions
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index a2228511d4be..c34b11022908 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
| @@ -270,7 +270,6 @@ struct acpi_device { | |||
| 270 | struct list_head children; | 270 | struct list_head children; |
| 271 | struct list_head node; | 271 | struct list_head node; |
| 272 | struct list_head wakeup_list; | 272 | struct list_head wakeup_list; |
| 273 | struct list_head g_list; | ||
| 274 | struct acpi_device_status status; | 273 | struct acpi_device_status status; |
| 275 | struct acpi_device_flags flags; | 274 | struct acpi_device_flags flags; |
| 276 | struct acpi_device_pnp pnp; | 275 | struct acpi_device_pnp pnp; |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index cebfdcd3dbdd..37bcb50a4d7c 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -76,7 +76,8 @@ struct ftrace_branch_data { | |||
| 76 | * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code | 76 | * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code |
| 77 | * to disable branch tracing on a per file basis. | 77 | * to disable branch tracing on a per file basis. |
| 78 | */ | 78 | */ |
| 79 | #if defined(CONFIG_TRACE_BRANCH_PROFILING) && !defined(DISABLE_BRANCH_PROFILING) | 79 | #if defined(CONFIG_TRACE_BRANCH_PROFILING) \ |
| 80 | && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__) | ||
| 80 | void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); | 81 | void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); |
| 81 | 82 | ||
| 82 | #define likely_notrace(x) __builtin_expect(!!(x), 1) | 83 | #define likely_notrace(x) __builtin_expect(!!(x), 1) |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 015a3d22cf74..da5405dce347 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -356,6 +356,9 @@ struct ftrace_graph_ret { | |||
| 356 | 356 | ||
| 357 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 357 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 358 | 358 | ||
| 359 | /* for init task */ | ||
| 360 | #define INIT_FTRACE_GRAPH .ret_stack = NULL | ||
| 361 | |||
| 359 | /* | 362 | /* |
| 360 | * Stack of return addresses for functions | 363 | * Stack of return addresses for functions |
| 361 | * of a thread. | 364 | * of a thread. |
| @@ -430,10 +433,11 @@ static inline void unpause_graph_tracing(void) | |||
| 430 | { | 433 | { |
| 431 | atomic_dec(¤t->tracing_graph_pause); | 434 | atomic_dec(¤t->tracing_graph_pause); |
| 432 | } | 435 | } |
| 433 | #else | 436 | #else /* !CONFIG_FUNCTION_GRAPH_TRACER */ |
| 434 | 437 | ||
| 435 | #define __notrace_funcgraph | 438 | #define __notrace_funcgraph |
| 436 | #define __irq_entry | 439 | #define __irq_entry |
| 440 | #define INIT_FTRACE_GRAPH | ||
| 437 | 441 | ||
| 438 | static inline void ftrace_graph_init_task(struct task_struct *t) { } | 442 | static inline void ftrace_graph_init_task(struct task_struct *t) { } |
| 439 | static inline void ftrace_graph_exit_task(struct task_struct *t) { } | 443 | static inline void ftrace_graph_exit_task(struct task_struct *t) { } |
| @@ -445,7 +449,7 @@ static inline int task_curr_ret_stack(struct task_struct *tsk) | |||
| 445 | 449 | ||
| 446 | static inline void pause_graph_tracing(void) { } | 450 | static inline void pause_graph_tracing(void) { } |
| 447 | static inline void unpause_graph_tracing(void) { } | 451 | static inline void unpause_graph_tracing(void) { } |
| 448 | #endif | 452 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
| 449 | 453 | ||
| 450 | #ifdef CONFIG_TRACING | 454 | #ifdef CONFIG_TRACING |
| 451 | #include <linux/sched.h> | 455 | #include <linux/sched.h> |
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index faa1cf848bcd..45257475623c 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h | |||
| @@ -116,7 +116,7 @@ | |||
| 116 | # define IRQ_EXIT_OFFSET HARDIRQ_OFFSET | 116 | # define IRQ_EXIT_OFFSET HARDIRQ_OFFSET |
| 117 | #endif | 117 | #endif |
| 118 | 118 | ||
| 119 | #ifdef CONFIG_SMP | 119 | #if defined(CONFIG_SMP) || defined(CONFIG_GENERIC_HARDIRQS) |
| 120 | extern void synchronize_irq(unsigned int irq); | 120 | extern void synchronize_irq(unsigned int irq); |
| 121 | #else | 121 | #else |
| 122 | # define synchronize_irq(irq) barrier() | 122 | # define synchronize_irq(irq) barrier() |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index af1de95e711e..dcfb93337e9a 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <linux/irqflags.h> | 5 | #include <linux/irqflags.h> |
| 6 | #include <linux/utsname.h> | 6 | #include <linux/utsname.h> |
| 7 | #include <linux/lockdep.h> | 7 | #include <linux/lockdep.h> |
| 8 | #include <linux/ftrace.h> | ||
| 8 | #include <linux/ipc.h> | 9 | #include <linux/ipc.h> |
| 9 | #include <linux/pid_namespace.h> | 10 | #include <linux/pid_namespace.h> |
| 10 | #include <linux/user_namespace.h> | 11 | #include <linux/user_namespace.h> |
| @@ -185,6 +186,7 @@ extern struct cred init_cred; | |||
| 185 | INIT_IDS \ | 186 | INIT_IDS \ |
| 186 | INIT_TRACE_IRQFLAGS \ | 187 | INIT_TRACE_IRQFLAGS \ |
| 187 | INIT_LOCKDEP \ | 188 | INIT_LOCKDEP \ |
| 189 | INIT_FTRACE_GRAPH \ | ||
| 188 | } | 190 | } |
| 189 | 191 | ||
| 190 | 192 | ||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 8a9613d0c674..91bb76f44f14 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -59,6 +59,18 @@ | |||
| 59 | #define IRQF_NOBALANCING 0x00000800 | 59 | #define IRQF_NOBALANCING 0x00000800 |
| 60 | #define IRQF_IRQPOLL 0x00001000 | 60 | #define IRQF_IRQPOLL 0x00001000 |
| 61 | 61 | ||
| 62 | /* | ||
| 63 | * Bits used by threaded handlers: | ||
| 64 | * IRQTF_RUNTHREAD - signals that the interrupt handler thread should run | ||
| 65 | * IRQTF_DIED - handler thread died | ||
| 66 | * IRQTF_WARNED - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed | ||
| 67 | */ | ||
| 68 | enum { | ||
| 69 | IRQTF_RUNTHREAD, | ||
| 70 | IRQTF_DIED, | ||
| 71 | IRQTF_WARNED, | ||
| 72 | }; | ||
| 73 | |||
| 62 | typedef irqreturn_t (*irq_handler_t)(int, void *); | 74 | typedef irqreturn_t (*irq_handler_t)(int, void *); |
| 63 | 75 | ||
| 64 | /** | 76 | /** |
| @@ -71,6 +83,9 @@ typedef irqreturn_t (*irq_handler_t)(int, void *); | |||
| 71 | * @next: pointer to the next irqaction for shared interrupts | 83 | * @next: pointer to the next irqaction for shared interrupts |
| 72 | * @irq: interrupt number | 84 | * @irq: interrupt number |
| 73 | * @dir: pointer to the proc/irq/NN/name entry | 85 | * @dir: pointer to the proc/irq/NN/name entry |
| 86 | * @thread_fn: interupt handler function for threaded interrupts | ||
| 87 | * @thread: thread pointer for threaded interrupts | ||
| 88 | * @thread_flags: flags related to @thread | ||
| 74 | */ | 89 | */ |
| 75 | struct irqaction { | 90 | struct irqaction { |
| 76 | irq_handler_t handler; | 91 | irq_handler_t handler; |
| @@ -81,18 +96,68 @@ struct irqaction { | |||
| 81 | struct irqaction *next; | 96 | struct irqaction *next; |
| 82 | int irq; | 97 | int irq; |
| 83 | struct proc_dir_entry *dir; | 98 | struct proc_dir_entry *dir; |
| 99 | irq_handler_t thread_fn; | ||
| 100 | struct task_struct *thread; | ||
| 101 | unsigned long thread_flags; | ||
| 84 | }; | 102 | }; |
| 85 | 103 | ||
| 86 | extern irqreturn_t no_action(int cpl, void *dev_id); | 104 | extern irqreturn_t no_action(int cpl, void *dev_id); |
| 87 | extern int __must_check request_irq(unsigned int, irq_handler_t handler, | 105 | |
| 88 | unsigned long, const char *, void *); | 106 | #ifdef CONFIG_GENERIC_HARDIRQS |
| 107 | extern int __must_check | ||
| 108 | request_threaded_irq(unsigned int irq, irq_handler_t handler, | ||
| 109 | irq_handler_t thread_fn, | ||
| 110 | unsigned long flags, const char *name, void *dev); | ||
| 111 | |||
| 112 | static inline int __must_check | ||
| 113 | request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, | ||
| 114 | const char *name, void *dev) | ||
| 115 | { | ||
| 116 | return request_threaded_irq(irq, handler, NULL, flags, name, dev); | ||
| 117 | } | ||
| 118 | |||
| 119 | extern void exit_irq_thread(void); | ||
| 120 | #else | ||
| 121 | |||
| 122 | extern int __must_check | ||
| 123 | request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, | ||
| 124 | const char *name, void *dev); | ||
| 125 | |||
| 126 | /* | ||
| 127 | * Special function to avoid ifdeffery in kernel/irq/devres.c which | ||
| 128 | * gets magically built by GENERIC_HARDIRQS=n architectures (sparc, | ||
| 129 | * m68k). I really love these $@%#!* obvious Makefile references: | ||
| 130 | * ../../../kernel/irq/devres.o | ||
| 131 | */ | ||
| 132 | static inline int __must_check | ||
| 133 | request_threaded_irq(unsigned int irq, irq_handler_t handler, | ||
| 134 | irq_handler_t thread_fn, | ||
| 135 | unsigned long flags, const char *name, void *dev) | ||
| 136 | { | ||
| 137 | return request_irq(irq, handler, flags, name, dev); | ||
| 138 | } | ||
| 139 | |||
| 140 | static inline void exit_irq_thread(void) { } | ||
| 141 | #endif | ||
| 142 | |||
| 89 | extern void free_irq(unsigned int, void *); | 143 | extern void free_irq(unsigned int, void *); |
| 90 | 144 | ||
| 91 | struct device; | 145 | struct device; |
| 92 | 146 | ||
| 93 | extern int __must_check devm_request_irq(struct device *dev, unsigned int irq, | 147 | extern int __must_check |
| 94 | irq_handler_t handler, unsigned long irqflags, | 148 | devm_request_threaded_irq(struct device *dev, unsigned int irq, |
| 95 | const char *devname, void *dev_id); | 149 | irq_handler_t handler, irq_handler_t thread_fn, |
| 150 | unsigned long irqflags, const char *devname, | ||
| 151 | void *dev_id); | ||
| 152 | |||
| 153 | static inline int __must_check | ||
| 154 | devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler, | ||
| 155 | unsigned long irqflags, const char *devname, void *dev_id) | ||
| 156 | { | ||
| 157 | return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags, | ||
| 158 | devname, dev_id); | ||
| 159 | } | ||
| 160 | |||
| 96 | extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); | 161 | extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); |
| 97 | 162 | ||
| 98 | /* | 163 | /* |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 974890b3c52f..ca507c9426b0 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/irqnr.h> | 22 | #include <linux/irqnr.h> |
| 23 | #include <linux/errno.h> | 23 | #include <linux/errno.h> |
| 24 | #include <linux/topology.h> | 24 | #include <linux/topology.h> |
| 25 | #include <linux/wait.h> | ||
| 25 | 26 | ||
| 26 | #include <asm/irq.h> | 27 | #include <asm/irq.h> |
| 27 | #include <asm/ptrace.h> | 28 | #include <asm/ptrace.h> |
| @@ -158,6 +159,8 @@ struct irq_2_iommu; | |||
| 158 | * @affinity: IRQ affinity on SMP | 159 | * @affinity: IRQ affinity on SMP |
| 159 | * @cpu: cpu index useful for balancing | 160 | * @cpu: cpu index useful for balancing |
| 160 | * @pending_mask: pending rebalanced interrupts | 161 | * @pending_mask: pending rebalanced interrupts |
| 162 | * @threads_active: number of irqaction threads currently running | ||
| 163 | * @wait_for_threads: wait queue for sync_irq to wait for threaded handlers | ||
| 161 | * @dir: /proc/irq/ procfs entry | 164 | * @dir: /proc/irq/ procfs entry |
| 162 | * @name: flow handler name for /proc/interrupts output | 165 | * @name: flow handler name for /proc/interrupts output |
| 163 | */ | 166 | */ |
| @@ -189,6 +192,8 @@ struct irq_desc { | |||
| 189 | cpumask_var_t pending_mask; | 192 | cpumask_var_t pending_mask; |
| 190 | #endif | 193 | #endif |
| 191 | #endif | 194 | #endif |
| 195 | atomic_t threads_active; | ||
| 196 | wait_queue_head_t wait_for_threads; | ||
| 192 | #ifdef CONFIG_PROC_FS | 197 | #ifdef CONFIG_PROC_FS |
| 193 | struct proc_dir_entry *dir; | 198 | struct proc_dir_entry *dir; |
| 194 | #endif | 199 | #endif |
diff --git a/include/linux/irqreturn.h b/include/linux/irqreturn.h index c5584ca5b8c9..819acaaac3f5 100644 --- a/include/linux/irqreturn.h +++ b/include/linux/irqreturn.h | |||
| @@ -5,10 +5,12 @@ | |||
| 5 | * enum irqreturn | 5 | * enum irqreturn |
| 6 | * @IRQ_NONE interrupt was not from this device | 6 | * @IRQ_NONE interrupt was not from this device |
| 7 | * @IRQ_HANDLED interrupt was handled by this device | 7 | * @IRQ_HANDLED interrupt was handled by this device |
| 8 | * @IRQ_WAKE_THREAD handler requests to wake the handler thread | ||
| 8 | */ | 9 | */ |
| 9 | enum irqreturn { | 10 | enum irqreturn { |
| 10 | IRQ_NONE, | 11 | IRQ_NONE, |
| 11 | IRQ_HANDLED, | 12 | IRQ_HANDLED, |
| 13 | IRQ_WAKE_THREAD, | ||
| 12 | }; | 14 | }; |
| 13 | 15 | ||
| 14 | typedef enum irqreturn irqreturn_t; | 16 | typedef enum irqreturn irqreturn_t; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index b94f3541f67b..98e1fe51601d 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -300,17 +300,11 @@ extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write, | |||
| 300 | struct file *filp, void __user *buffer, | 300 | struct file *filp, void __user *buffer, |
| 301 | size_t *lenp, loff_t *ppos); | 301 | size_t *lenp, loff_t *ppos); |
| 302 | extern unsigned int softlockup_panic; | 302 | extern unsigned int softlockup_panic; |
| 303 | extern unsigned long sysctl_hung_task_check_count; | ||
| 304 | extern unsigned long sysctl_hung_task_timeout_secs; | ||
| 305 | extern unsigned long sysctl_hung_task_warnings; | ||
| 306 | extern int softlockup_thresh; | 303 | extern int softlockup_thresh; |
| 307 | #else | 304 | #else |
| 308 | static inline void softlockup_tick(void) | 305 | static inline void softlockup_tick(void) |
| 309 | { | 306 | { |
| 310 | } | 307 | } |
| 311 | static inline void spawn_softlockup_task(void) | ||
| 312 | { | ||
| 313 | } | ||
| 314 | static inline void touch_softlockup_watchdog(void) | 308 | static inline void touch_softlockup_watchdog(void) |
| 315 | { | 309 | { |
| 316 | } | 310 | } |
| @@ -319,6 +313,15 @@ static inline void touch_all_softlockup_watchdogs(void) | |||
| 319 | } | 313 | } |
| 320 | #endif | 314 | #endif |
| 321 | 315 | ||
| 316 | #ifdef CONFIG_DETECT_HUNG_TASK | ||
| 317 | extern unsigned int sysctl_hung_task_panic; | ||
| 318 | extern unsigned long sysctl_hung_task_check_count; | ||
| 319 | extern unsigned long sysctl_hung_task_timeout_secs; | ||
| 320 | extern unsigned long sysctl_hung_task_warnings; | ||
| 321 | extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, | ||
| 322 | struct file *filp, void __user *buffer, | ||
| 323 | size_t *lenp, loff_t *ppos); | ||
| 324 | #endif | ||
| 322 | 325 | ||
| 323 | /* Attach to any functions which should be ignored in wchan output. */ | 326 | /* Attach to any functions which should be ignored in wchan output. */ |
| 324 | #define __sched __attribute__((__section__(".sched.text"))) | 327 | #define __sched __attribute__((__section__(".sched.text"))) |
| @@ -1255,9 +1258,8 @@ struct task_struct { | |||
| 1255 | /* ipc stuff */ | 1258 | /* ipc stuff */ |
| 1256 | struct sysv_sem sysvsem; | 1259 | struct sysv_sem sysvsem; |
| 1257 | #endif | 1260 | #endif |
| 1258 | #ifdef CONFIG_DETECT_SOFTLOCKUP | 1261 | #ifdef CONFIG_DETECT_HUNG_TASK |
| 1259 | /* hung task detection */ | 1262 | /* hung task detection */ |
| 1260 | unsigned long last_switch_timestamp; | ||
| 1261 | unsigned long last_switch_count; | 1263 | unsigned long last_switch_count; |
| 1262 | #endif | 1264 | #endif |
| 1263 | /* CPU-specific state of this task */ | 1265 | /* CPU-specific state of this task */ |
| @@ -1294,6 +1296,11 @@ struct task_struct { | |||
| 1294 | /* Protection of (de-)allocation: mm, files, fs, tty, keyrings */ | 1296 | /* Protection of (de-)allocation: mm, files, fs, tty, keyrings */ |
| 1295 | spinlock_t alloc_lock; | 1297 | spinlock_t alloc_lock; |
| 1296 | 1298 | ||
| 1299 | #ifdef CONFIG_GENERIC_HARDIRQS | ||
| 1300 | /* IRQ handler threads */ | ||
| 1301 | struct irqaction *irqaction; | ||
| 1302 | #endif | ||
| 1303 | |||
| 1297 | /* Protection of the PI data structures: */ | 1304 | /* Protection of the PI data structures: */ |
| 1298 | spinlock_t pi_lock; | 1305 | spinlock_t pi_lock; |
| 1299 | 1306 | ||
