Skip to content

Commit

Permalink
TTY: isicom, fix tty buffers memory leak
Browse files Browse the repository at this point in the history
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 <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Jiri Slaby authored and Greg Kroah-Hartman committed Nov 16, 2012
1 parent de274bf commit d0f5914
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions drivers/tty/isicom.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -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;
/* . . . */
}
Expand Down

0 comments on commit d0f5914

Please sign in to comment.