From 7342c59a44ad9e5f30baaa2de84830f40b9f06c0 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Thu, 15 Nov 2012 09:49:48 +0100 Subject: TTY: isicom, stop using port->tty Do not access unsafe port->tty pointer when we have a safe tty already. Use the safe one. Signed-off-by: Jiri Slaby Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index d7492e183607..5f3ecbc2713e 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -603,7 +603,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) if (tty_port_cts_enabled(&port->port)) { if (tty->hw_stopped) { if (header & ISI_CTS) { - port->port.tty->hw_stopped = 0; + tty->hw_stopped = 0; /* start tx ing */ port->status |= (ISI_TXOK | ISI_CTS); -- cgit v1.2.3 From d0f59141ca40159c9d142c0f62e9aea61f846539 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Thu, 15 Nov 2012 09:49:55 +0100 Subject: TTY: isicom, fix tty buffers memory leak After commit "TTY: move tty buffers to tty_port", the tty buffers are not freed in some drivers. This is because tty_port_destructor is not called whenever a tty_port is freed. This was an assumption I counted with but was unfortunately untrue. So fix the drivers to fulfil this assumption. This one is special as we need more work to be done. Previously, the tty_port was initialized at module load time, but to be able to destroy the port and init it again, we now do the initialization in probe and destroy in remove. I.e. at more appropriate places for that. Signed-off-by: Jiri Slaby Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index 5f3ecbc2713e..67f288d7e76a 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -1610,10 +1610,15 @@ static int __devinit isicom_probe(struct pci_dev *pdev, if (retval < 0) goto errunri; - for (index = 0; index < board->port_count; index++) - tty_port_register_device(&board->ports[index].port, - isicom_normal, board->index * 16 + index, - &pdev->dev); + for (index = 0; index < board->port_count; index++) { + struct tty_port *tport = &board->ports[index].port; + tty_port_init(tport); + tport->ops = &isicom_port_ops; + tport->close_delay = 50 * HZ/100; + tport->closing_wait = 3000 * HZ/100; + tty_port_register_device(tport, isicom_normal, + board->index * 16 + index, &pdev->dev); + } return 0; @@ -1635,8 +1640,10 @@ static void __devexit isicom_remove(struct pci_dev *pdev) struct isi_board *board = pci_get_drvdata(pdev); unsigned int i; - for (i = 0; i < board->port_count; i++) + for (i = 0; i < board->port_count; i++) { tty_unregister_device(isicom_normal, board->index * 16 + i); + tty_port_destroy(&board->ports[i].port); + } free_irq(board->irq, board); pci_release_region(pdev, 3); @@ -1655,13 +1662,9 @@ static int __init isicom_init(void) isi_card[idx].ports = port; spin_lock_init(&isi_card[idx].card_lock); for (channel = 0; channel < 16; channel++, port++) { - tty_port_init(&port->port); - port->port.ops = &isicom_port_ops; port->magic = ISICOM_MAGIC; port->card = &isi_card[idx]; port->channel = channel; - port->port.close_delay = 50 * HZ/100; - port->port.closing_wait = 3000 * HZ/100; port->status = 0; /* . . . */ } -- cgit v1.2.3 From 91116cba5da0c33f3093b804e487bea02b830bfb Mon Sep 17 00:00:00 2001 From: Bill Pemberton Date: Mon, 19 Nov 2012 13:21:06 -0500 Subject: tty: remove use of __devexit_p CONFIG_HOTPLUG is going away as an option so __devexit_p is no longer needed. Signed-off-by: Bill Pemberton Cc: Jiri Slaby Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index 67f288d7e76a..774e595e1fba 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -168,7 +168,7 @@ static struct pci_driver isicom_driver = { .name = "isicom", .id_table = isicom_pci_tbl, .probe = isicom_probe, - .remove = __devexit_p(isicom_remove) + .remove = isicom_remove }; static int prev_card = 3; /* start servicing isi_card[0] */ -- cgit v1.2.3 From 9671f09921d93e722a28ae9610d478e092ac5466 Mon Sep 17 00:00:00 2001 From: Bill Pemberton Date: Mon, 19 Nov 2012 13:21:50 -0500 Subject: tty: remove use of __devinit CONFIG_HOTPLUG is going away as an option so __devinit is no longer needed. Signed-off-by: Bill Pemberton Cc: Jiri Slaby Cc: Alan Cox Cc: Lucas Tavares Cc: "David S. Miller" Cc: Peter Korsgaard Cc: Tony Prisk Acked-by: Tobias Klauser Acked-by: Nicolas Ferre Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index 774e595e1fba..82661889b322 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -1307,7 +1307,7 @@ static const struct tty_port_operations isicom_port_ops = { .shutdown = isicom_shutdown, }; -static int __devinit reset_card(struct pci_dev *pdev, +static int reset_card(struct pci_dev *pdev, const unsigned int card, unsigned int *signature) { struct isi_board *board = pci_get_drvdata(pdev); @@ -1368,7 +1368,7 @@ end: return retval; } -static int __devinit load_firmware(struct pci_dev *pdev, +static int load_firmware(struct pci_dev *pdev, const unsigned int index, const unsigned int signature) { struct isi_board *board = pci_get_drvdata(pdev); @@ -1548,7 +1548,7 @@ end: */ static unsigned int card_count; -static int __devinit isicom_probe(struct pci_dev *pdev, +static int isicom_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { unsigned int uninitialized_var(signature), index; -- cgit v1.2.3 From ae8d8a146725a966bd7c59c94f4d0016dcf7a04f Mon Sep 17 00:00:00 2001 From: Bill Pemberton Date: Mon, 19 Nov 2012 13:26:18 -0500 Subject: tty: remove use of __devexit CONFIG_HOTPLUG is going away as an option so __devexit is no longer needed. Signed-off-by: Bill Pemberton Cc: Jiri Slaby Cc: Alan Cox Acked-by: Tobias Klauser Cc: Lucas Tavares Cc: Daniel Walker Cc: Bryan Huntsman Cc: "David S. Miller" Cc: Peter Korsgaard Cc: Tony Prisk Acked-by: David Brown Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index 82661889b322..3205b2e9090b 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -148,7 +148,7 @@ #endif static int isicom_probe(struct pci_dev *, const struct pci_device_id *); -static void __devexit isicom_remove(struct pci_dev *); +static void isicom_remove(struct pci_dev *); static struct pci_device_id isicom_pci_tbl[] = { { PCI_DEVICE(VENDOR_ID, 0x2028) }, @@ -1635,7 +1635,7 @@ err: return retval; } -static void __devexit isicom_remove(struct pci_dev *pdev) +static void isicom_remove(struct pci_dev *pdev) { struct isi_board *board = pci_get_drvdata(pdev); unsigned int i; -- cgit v1.2.3 From 2f69335710884ae6112fc8196ebe29b5cda7b79b Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Thu, 3 Jan 2013 15:53:02 +0100 Subject: TTY: convert more flipping functions Now, we start converting tty buffer functions to actually use tty_port. This will allow us to get rid of the need of tty pointer in many call sites. Only tty_port will be needed and hence no more tty_port_tty_get calls in those paths. Now 4 string flipping ones are on turn: * tty_insert_flip_string_flags * tty_insert_flip_string_fixed_flag * tty_prepare_flip_string * tty_prepare_flip_string_flags Signed-off-by: Jiri Slaby Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index 3205b2e9090b..e9fc15f00f48 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -650,8 +650,8 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) break; } } else { /* Data Packet */ - - count = tty_prepare_flip_string(tty, &rp, byte_count & ~1); + count = tty_prepare_flip_string(&port->port, &rp, + byte_count & ~1); pr_debug("%s: Can rx %d of %d bytes.\n", __func__, count, byte_count); word_count = count >> 1; -- cgit v1.2.3 From 92a19f9cec9a80ad93c06e115822deb729e2c6ad Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Thu, 3 Jan 2013 15:53:03 +0100 Subject: TTY: switch tty_insert_flip_char Now, we start converting tty buffer functions to actually use tty_port. This will allow us to get rid of the need of tty in many call sites. Only tty_port will needed and hence no more tty_port_tty_get in those paths. tty_insert_flip_char is the next one to proceed. This one is used all over the code, so the patch is huge. Signed-off-by: Jiri Slaby Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index e9fc15f00f48..c70144f55fc0 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -634,7 +634,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) break; case 1: /* Received Break !!! */ - tty_insert_flip_char(tty, 0, TTY_BREAK); + tty_insert_flip_char(&port->port, 0, TTY_BREAK); if (port->port.flags & ASYNC_SAK) do_SAK(tty); tty_flip_buffer_push(tty); @@ -658,7 +658,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) insw(base, rp, word_count); byte_count -= (word_count << 1); if (count & 0x0001) { - tty_insert_flip_char(tty, inw(base) & 0xff, + tty_insert_flip_char(&port->port, inw(base) & 0xff, TTY_NORMAL); byte_count -= 2; } -- cgit v1.2.3 From 2e124b4a390ca85325fae75764bef92f0547fa25 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Thu, 3 Jan 2013 15:53:06 +0100 Subject: TTY: switch tty_flip_buffer_push Now, we start converting tty buffer functions to actually use tty_port. This will allow us to get rid of the need of tty in many call sites. Only tty_port will needed and hence no more tty_port_tty_get in those paths. Now, the one where most of tty_port_tty_get gets removed: tty_flip_buffer_push. IOW we also closed all the races in drivers not using tty_port_tty_get at all yet. Also we move tty_flip_buffer_push declaration from include/linux/tty.h to include/linux/tty_flip.h to all others while we are changing it anyway. Signed-off-by: Jiri Slaby Signed-off-by: Greg Kroah-Hartman --- drivers/tty/isicom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/tty/isicom.c') diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c index c70144f55fc0..858291ca889c 100644 --- a/drivers/tty/isicom.c +++ b/drivers/tty/isicom.c @@ -637,7 +637,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) tty_insert_flip_char(&port->port, 0, TTY_BREAK); if (port->port.flags & ASYNC_SAK) do_SAK(tty); - tty_flip_buffer_push(tty); + tty_flip_buffer_push(&port->port); break; case 2: /* Statistics */ @@ -671,7 +671,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) byte_count -= 2; } } - tty_flip_buffer_push(tty); + tty_flip_buffer_push(&port->port); } outw(0x0000, base+0x04); /* enable interrupts */ spin_unlock(&card->card_lock); -- cgit v1.2.3