Skip to content

Commit

Permalink
tty: make the kref destructor occur asynchronously
Browse files Browse the repository at this point in the history
We want to be able to sleep in the destructor for USB at least. It isn't a
hot path so just pushing it to a work queue doesn't really cause any
difficulty.

Signed-off-by: Alan Cox <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Alan Cox authored and Live-CD User committed Sep 19, 2009
1 parent e936ffd commit b50989d
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions drivers/char/tty_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1386,10 +1386,14 @@ EXPORT_SYMBOL(tty_shutdown);
* tty_mutex - sometimes only
* takes the file list lock internally when working on the list
* of ttys that the driver keeps.
*
* This method gets called from a work queue so that the driver private
* shutdown ops can sleep (needed for USB at least)
*/
static void release_one_tty(struct kref *kref)
static void release_one_tty(struct work_struct *work)
{
struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
struct tty_struct *tty =
container_of(work, struct tty_struct, hangup_work);
struct tty_driver *driver = tty->driver;

if (tty->ops->shutdown)
Expand All @@ -1407,6 +1411,15 @@ static void release_one_tty(struct kref *kref)
free_tty_struct(tty);
}

static void queue_release_one_tty(struct kref *kref)
{
struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
/* The hangup queue is now free so we can reuse it rather than
waste a chunk of memory for each port */
INIT_WORK(&tty->hangup_work, release_one_tty);
schedule_work(&tty->hangup_work);
}

/**
* tty_kref_put - release a tty kref
* @tty: tty device
Expand All @@ -1418,7 +1431,7 @@ static void release_one_tty(struct kref *kref)
void tty_kref_put(struct tty_struct *tty)
{
if (tty)
kref_put(&tty->kref, release_one_tty);
kref_put(&tty->kref, queue_release_one_tty);
}
EXPORT_SYMBOL(tty_kref_put);

Expand Down

0 comments on commit b50989d

Please sign in to comment.