aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/include
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2006-01-06 03:18:57 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-06 11:33:46 -0500
commit165dc5911627a9c4752e909a0da661b96b6fd269 (patch)
tree7e8eb47b7e766a5296b9e15ef177f958dec16d93 /arch/um/include
parent1f80171e81ed0d08dcdb6efe239d7b929aef498f (diff)
[PATCH] uml: Simplify console opening/closing and irq registration
This patch simplifies the opening and closing of host console devices and the registration and deregistration of IRQs. The intent is to make it obvious that an IRQ can't exist without an open file descriptor. chan_enable will now open the channel, and when both opening and IRQ registration are desired, this should be used. Opening only is done for the initial console, so that interface still needs to exist. The free_irqs_later interface is now gone. It was intended to avoid freeing an IRQ while it was being processed. It did this, but it didn't eliminate the possiblity of free_irq being called from an interrupt, which is bad. In its place is a list of irqs to be freed, which is processed by the signal handler just before exiting. close_one_chan now disables irqs. When a host device disappears, it is just closed, and that disables IRQs. The device id registered with the IRQ is now the chan structure, not the tty. This is because the interrupt arrives on a descriptor associated with the channel. This caused equivalent changes in the arguments to line_timer_cb. line_disable is gone since it is not used any more. The count field in the line structure is gone. tty->count is used instead. The complicated logic in sigio_handler with freeing IRQs when necessary and making sure its idea of the next irq is correct is now much simpler. The irq list can't be rearranged underneath it, so it is now a simple list walk. Signed-off-by: Jeff Dike <jdike@addtoit.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um/include')
-rw-r--r--arch/um/include/chan_kern.h9
-rw-r--r--arch/um/include/irq_user.h13
-rw-r--r--arch/um/include/line.h6
3 files changed, 10 insertions, 18 deletions
diff --git a/arch/um/include/chan_kern.h b/arch/um/include/chan_kern.h
index 22bf3a73437c..84d1f64f9795 100644
--- a/arch/um/include/chan_kern.h
+++ b/arch/um/include/chan_kern.h
@@ -14,11 +14,14 @@
14 14
15struct chan { 15struct chan {
16 struct list_head list; 16 struct list_head list;
17 struct list_head free_list;
18 struct line *line;
17 char *dev; 19 char *dev;
18 unsigned int primary:1; 20 unsigned int primary:1;
19 unsigned int input:1; 21 unsigned int input:1;
20 unsigned int output:1; 22 unsigned int output:1;
21 unsigned int opened:1; 23 unsigned int opened:1;
24 unsigned int enabled:1;
22 int fd; 25 int fd;
23 struct chan_ops *ops; 26 struct chan_ops *ops;
24 void *data; 27 void *data;
@@ -26,7 +29,7 @@ struct chan {
26 29
27extern void chan_interrupt(struct list_head *chans, struct work_struct *task, 30extern void chan_interrupt(struct list_head *chans, struct work_struct *task,
28 struct tty_struct *tty, int irq); 31 struct tty_struct *tty, int irq);
29extern int parse_chan_pair(char *str, struct list_head *chans, int device, 32extern int parse_chan_pair(char *str, struct line *line, int device,
30 struct chan_opts *opts); 33 struct chan_opts *opts);
31extern int open_chan(struct list_head *chans); 34extern int open_chan(struct list_head *chans);
32extern int write_chan(struct list_head *chans, const char *buf, int len, 35extern int write_chan(struct list_head *chans, const char *buf, int len,
@@ -35,9 +38,9 @@ extern int console_write_chan(struct list_head *chans, const char *buf,
35 int len); 38 int len);
36extern int console_open_chan(struct line *line, struct console *co, 39extern int console_open_chan(struct line *line, struct console *co,
37 struct chan_opts *opts); 40 struct chan_opts *opts);
38extern void close_chan(struct list_head *chans);
39extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty); 41extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty);
40extern void enable_chan(struct list_head *chans, struct tty_struct *tty); 42extern void enable_chan(struct line *line);
43extern void close_chan(struct list_head *chans, int delay_free_irq);
41extern int chan_window_size(struct list_head *chans, 44extern int chan_window_size(struct list_head *chans,
42 unsigned short *rows_out, 45 unsigned short *rows_out,
43 unsigned short *cols_out); 46 unsigned short *cols_out);
diff --git a/arch/um/include/irq_user.h b/arch/um/include/irq_user.h
index f724b717213f..b61deb8b362a 100644
--- a/arch/um/include/irq_user.h
+++ b/arch/um/include/irq_user.h
@@ -18,19 +18,8 @@ extern int deactivate_all_fds(void);
18extern void forward_interrupts(int pid); 18extern void forward_interrupts(int pid);
19extern void init_irq_signals(int on_sigstack); 19extern void init_irq_signals(int on_sigstack);
20extern void forward_ipi(int fd, int pid); 20extern void forward_ipi(int fd, int pid);
21extern void free_irq_later(int irq, void *dev_id);
22extern int activate_ipi(int fd, int pid); 21extern int activate_ipi(int fd, int pid);
23extern unsigned long irq_lock(void); 22extern unsigned long irq_lock(void);
24extern void irq_unlock(unsigned long flags); 23extern void irq_unlock(unsigned long flags);
25#endif
26 24
27/* 25#endif
28 * Overrides for Emacs so that we follow Linus's tabbing style.
29 * Emacs will notice this stuff at the end of the file and automatically
30 * adjust the settings for this buffer only. This must remain at the end
31 * of the file.
32 * ---------------------------------------------------------------------------
33 * Local variables:
34 * c-file-style: "linux"
35 * End:
36 */
diff --git a/arch/um/include/line.h b/arch/um/include/line.h
index 474398ba1207..e6cc3abfd4db 100644
--- a/arch/um/include/line.h
+++ b/arch/um/include/line.h
@@ -32,6 +32,7 @@ struct line_driver {
32}; 32};
33 33
34struct line { 34struct line {
35 struct tty_struct *tty;
35 char *init_str; 36 char *init_str;
36 int init_pri; 37 int init_pri;
37 struct list_head chan_list; 38 struct list_head chan_list;
@@ -89,10 +90,9 @@ extern int line_ioctl(struct tty_struct *tty, struct file * file,
89 unsigned int cmd, unsigned long arg); 90 unsigned int cmd, unsigned long arg);
90 91
91extern char *add_xterm_umid(char *base); 92extern char *add_xterm_umid(char *base);
92extern int line_setup_irq(int fd, int input, int output, 93extern int line_setup_irq(int fd, int input, int output, struct line *line,
93 struct tty_struct *tty); 94 void *data);
94extern void line_close_chan(struct line *line); 95extern void line_close_chan(struct line *line);
95extern void line_disable(struct tty_struct *tty, int current_irq);
96extern struct tty_driver * line_register_devfs(struct lines *set, 96extern struct tty_driver * line_register_devfs(struct lines *set,
97 struct line_driver *line_driver, 97 struct line_driver *line_driver,
98 struct tty_operations *driver, 98 struct tty_operations *driver,