hvc_console: Add a hangup notifier for backends
I have added a hangup notifier that can be used by hvc console backends to handle a tty hangup. The default irq hangup notifier calls the notifier_del_irq() for compatibility. Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
		
							parent
							
								
									a02efb906d
								
							
						
					
					
						commit
						fc362e2e0e
					
				| @ -418,8 +418,8 @@ static void hvc_hangup(struct tty_struct *tty) | ||||
| 
 | ||||
| 	spin_unlock_irqrestore(&hp->lock, flags); | ||||
| 
 | ||||
| 	if (hp->ops->notifier_del) | ||||
| 			hp->ops->notifier_del(hp, hp->data); | ||||
| 	if (hp->ops->notifier_hangup) | ||||
| 			hp->ops->notifier_hangup(hp, hp->data); | ||||
| 
 | ||||
| 	while(temp_open_count) { | ||||
| 		--temp_open_count; | ||||
|  | ||||
| @ -65,9 +65,10 @@ struct hv_ops { | ||||
| 	int (*get_chars)(uint32_t vtermno, char *buf, int count); | ||||
| 	int (*put_chars)(uint32_t vtermno, const char *buf, int count); | ||||
| 
 | ||||
| 	/* Callbacks for notification. Called in open and close */ | ||||
| 	/* Callbacks for notification. Called in open, close and hangup */ | ||||
| 	int (*notifier_add)(struct hvc_struct *hp, int irq); | ||||
| 	void (*notifier_del)(struct hvc_struct *hp, int irq); | ||||
| 	void (*notifier_hangup)(struct hvc_struct *hp, int irq); | ||||
| }; | ||||
| 
 | ||||
| /* Register a vterm and a slot index for use as a console (console_init) */ | ||||
| @ -86,6 +87,7 @@ void hvc_kick(void); | ||||
| /* default notifier for irq based notification */ | ||||
| extern int notifier_add_irq(struct hvc_struct *hp, int data); | ||||
| extern void notifier_del_irq(struct hvc_struct *hp, int data); | ||||
| extern void notifier_hangup_irq(struct hvc_struct *hp, int data); | ||||
| 
 | ||||
| 
 | ||||
| #if defined(CONFIG_XMON) && defined(CONFIG_SMP) | ||||
|  | ||||
| @ -42,3 +42,8 @@ void notifier_del_irq(struct hvc_struct *hp, int irq) | ||||
| 	free_irq(irq, hp); | ||||
| 	hp->irq_requested = 0; | ||||
| } | ||||
| 
 | ||||
| void notifier_hangup_irq(struct hvc_struct *hp, int irq) | ||||
| { | ||||
| 	notifier_del_irq(hp, irq); | ||||
| } | ||||
|  | ||||
| @ -202,6 +202,7 @@ static struct hv_ops hvc_get_put_ops = { | ||||
| 	.put_chars = put_chars, | ||||
| 	.notifier_add = notifier_add_irq, | ||||
| 	.notifier_del = notifier_del_irq, | ||||
| 	.notifier_hangup = notifier_hangup_irq, | ||||
| }; | ||||
| 
 | ||||
| static int __devinit hvc_vio_probe(struct vio_dev *vdev, | ||||
|  | ||||
| @ -82,6 +82,7 @@ static struct hv_ops hvc_get_put_ops = { | ||||
| 	.put_chars = hvc_put_chars, | ||||
| 	.notifier_add = notifier_add_irq, | ||||
| 	.notifier_del = notifier_del_irq, | ||||
| 	.notifier_hangup = notifier_hangup_irq, | ||||
| }; | ||||
| 
 | ||||
| static int __devinit hvc_vio_probe(struct vio_dev *vdev, | ||||
|  | ||||
| @ -102,6 +102,7 @@ static struct hv_ops hvc_ops = { | ||||
| 	.put_chars = write_console, | ||||
| 	.notifier_add = notifier_add_irq, | ||||
| 	.notifier_del = notifier_del_irq, | ||||
| 	.notifier_hangup = notifier_hangup_irq, | ||||
| }; | ||||
| 
 | ||||
| static int __init xen_init(void) | ||||
|  | ||||
| @ -198,6 +198,7 @@ static int __devinit virtcons_probe(struct virtio_device *dev) | ||||
| 	virtio_cons.put_chars = put_chars; | ||||
| 	virtio_cons.notifier_add = notifier_add_vio; | ||||
| 	virtio_cons.notifier_del = notifier_del_vio; | ||||
| 	virtio_cons.notifier_hangup = notifier_del_vio; | ||||
| 
 | ||||
| 	/* The first argument of hvc_alloc() is the virtual console number, so
 | ||||
| 	 * we use zero.  The second argument is the parameter for the | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user