All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH/RFC] serial_core: Fix pm imbalance on unbind
@ 2014-03-10 19:54 ` Geert Uytterhoeven
  0 siblings, 0 replies; 6+ messages in thread
From: Geert Uytterhoeven @ 2014-03-10 19:54 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Jiri Slaby
  Cc: linux-serial, linux-kernel, linux-sh, Geert Uytterhoeven

From: Geert Uytterhoeven <geert+renesas@linux-m68k.org>

When a serial port is closed, uart_close() takes care of shutting down the
hardware, and powering it down.

When a serial port is unbound while in use, uart_close() bypasses all of
this, as this is supposed to be done through uart_hangup() (invoked via
tty_vhangup() in uart_remove_one_port()).

However, uart_hangup() does not set the hardware's power state, leaving it
powered up.  This may also lead to unbounded nesting counts in clock and
power management, depending on their internal implementation.

Make sure to power down the port in uart_hangup(), except when the port is
used as a serial console. For serial consoles, this must be postponed until
after their deregistration in uart_remove_one_port() (symmetry with
registration in uart_configure_port(), invoked from uart_add_one_port()).

After this, the module clock used by the sh-sci driver is disabled on
unbind while the serial port is in use.

Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
---
 drivers/tty/serial/serial_core.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 8ece7f14d89d..a91cc2dcb66a 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1452,6 +1452,8 @@ static void uart_hangup(struct tty_struct *tty)
 		clear_bit(ASYNCB_NORMAL_ACTIVE, &port->flags);
 		spin_unlock_irqrestore(&port->lock, flags);
 		tty_port_tty_set(port, NULL);
+		if (!uart_console(state->uart_port))
+			uart_change_pm(state, UART_PM_STATE_OFF);
 		wake_up_interruptible(&port->open_wait);
 		wake_up_interruptible(&port->delta_msr_wait);
 	}
@@ -2677,10 +2679,12 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
 		tty_vhangup(port->tty);
 
 	/*
-	 * If the port is used as a console, unregister it
+	 * If the port is used as a console, unregister it, and power it down
 	 */
-	if (uart_console(uport))
+	if (uart_console(uport)) {
 		unregister_console(uport->cons);
+		uart_change_pm(state, UART_PM_STATE_OFF);
+	}
 
 	/*
 	 * Free the port IO and memory resources, if any.
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH/RFC] serial_core: Fix pm imbalance on unbind
@ 2014-03-10 19:54 ` Geert Uytterhoeven
  0 siblings, 0 replies; 6+ messages in thread
From: Geert Uytterhoeven @ 2014-03-10 19:54 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Jiri Slaby
  Cc: linux-serial, linux-kernel, linux-sh, Geert Uytterhoeven

From: Geert Uytterhoeven <geert+renesas@linux-m68k.org>

When a serial port is closed, uart_close() takes care of shutting down the
hardware, and powering it down.

When a serial port is unbound while in use, uart_close() bypasses all of
this, as this is supposed to be done through uart_hangup() (invoked via
tty_vhangup() in uart_remove_one_port()).

However, uart_hangup() does not set the hardware's power state, leaving it
powered up.  This may also lead to unbounded nesting counts in clock and
power management, depending on their internal implementation.

Make sure to power down the port in uart_hangup(), except when the port is
used as a serial console. For serial consoles, this must be postponed until
after their deregistration in uart_remove_one_port() (symmetry with
registration in uart_configure_port(), invoked from uart_add_one_port()).

After this, the module clock used by the sh-sci driver is disabled on
unbind while the serial port is in use.

Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
---
 drivers/tty/serial/serial_core.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 8ece7f14d89d..a91cc2dcb66a 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1452,6 +1452,8 @@ static void uart_hangup(struct tty_struct *tty)
 		clear_bit(ASYNCB_NORMAL_ACTIVE, &port->flags);
 		spin_unlock_irqrestore(&port->lock, flags);
 		tty_port_tty_set(port, NULL);
+		if (!uart_console(state->uart_port))
+			uart_change_pm(state, UART_PM_STATE_OFF);
 		wake_up_interruptible(&port->open_wait);
 		wake_up_interruptible(&port->delta_msr_wait);
 	}
@@ -2677,10 +2679,12 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
 		tty_vhangup(port->tty);
 
 	/*
-	 * If the port is used as a console, unregister it
+	 * If the port is used as a console, unregister it, and power it down
 	 */
-	if (uart_console(uport))
+	if (uart_console(uport)) {
 		unregister_console(uport->cons);
+		uart_change_pm(state, UART_PM_STATE_OFF);
+	}
 
 	/*
 	 * Free the port IO and memory resources, if any.
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH/RFC] serial_core: Fix pm imbalance on unbind
  2014-03-10 19:54 ` Geert Uytterhoeven
@ 2014-03-20 10:23   ` Geert Uytterhoeven
  -1 siblings, 0 replies; 6+ messages in thread
From: Geert Uytterhoeven @ 2014-03-20 10:23 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Jiri Slaby
  Cc: linux-serial, linux-kernel, Linux-sh list, Geert Uytterhoeven

Hi Greg,

On Mon, Mar 10, 2014 at 8:54 PM, Geert Uytterhoeven
<geert@linux-m68k.org> wrote:
> From: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
>
> When a serial port is closed, uart_close() takes care of shutting down the
> hardware, and powering it down.
>
> When a serial port is unbound while in use, uart_close() bypasses all of
> this, as this is supposed to be done through uart_hangup() (invoked via
> tty_vhangup() in uart_remove_one_port()).
>
> However, uart_hangup() does not set the hardware's power state, leaving it
> powered up.  This may also lead to unbounded nesting counts in clock and
> power management, depending on their internal implementation.
>
> Make sure to power down the port in uart_hangup(), except when the port is
> used as a serial console. For serial consoles, this must be postponed until
> after their deregistration in uart_remove_one_port() (symmetry with
> registration in uart_configure_port(), invoked from uart_add_one_port()).
>
> After this, the module clock used by the sh-sci driver is disabled on
> unbind while the serial port is in use.
>
> Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>

I noticed you have applied all serial patches I've sent, except for this one.
Is there any specific reason you skipped this one?

Thanks!

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH/RFC] serial_core: Fix pm imbalance on unbind
@ 2014-03-20 10:23   ` Geert Uytterhoeven
  0 siblings, 0 replies; 6+ messages in thread
From: Geert Uytterhoeven @ 2014-03-20 10:23 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Jiri Slaby
  Cc: linux-serial, linux-kernel, Linux-sh list, Geert Uytterhoeven

Hi Greg,

On Mon, Mar 10, 2014 at 8:54 PM, Geert Uytterhoeven
<geert@linux-m68k.org> wrote:
> From: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
>
> When a serial port is closed, uart_close() takes care of shutting down the
> hardware, and powering it down.
>
> When a serial port is unbound while in use, uart_close() bypasses all of
> this, as this is supposed to be done through uart_hangup() (invoked via
> tty_vhangup() in uart_remove_one_port()).
>
> However, uart_hangup() does not set the hardware's power state, leaving it
> powered up.  This may also lead to unbounded nesting counts in clock and
> power management, depending on their internal implementation.
>
> Make sure to power down the port in uart_hangup(), except when the port is
> used as a serial console. For serial consoles, this must be postponed until
> after their deregistration in uart_remove_one_port() (symmetry with
> registration in uart_configure_port(), invoked from uart_add_one_port()).
>
> After this, the module clock used by the sh-sci driver is disabled on
> unbind while the serial port is in use.
>
> Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>

I noticed you have applied all serial patches I've sent, except for this one.
Is there any specific reason you skipped this one?

Thanks!

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH/RFC] serial_core: Fix pm imbalance on unbind
  2014-03-20 10:23   ` Geert Uytterhoeven
@ 2014-03-20 21:14     ` Greg Kroah-Hartman
  -1 siblings, 0 replies; 6+ messages in thread
From: Greg Kroah-Hartman @ 2014-03-20 21:14 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Jiri Slaby, linux-serial, linux-kernel, Linux-sh list,
	Geert Uytterhoeven

On Thu, Mar 20, 2014 at 11:23:00AM +0100, Geert Uytterhoeven wrote:
> Hi Greg,
> 
> On Mon, Mar 10, 2014 at 8:54 PM, Geert Uytterhoeven
> <geert@linux-m68k.org> wrote:
> > From: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
> >
> > When a serial port is closed, uart_close() takes care of shutting down the
> > hardware, and powering it down.
> >
> > When a serial port is unbound while in use, uart_close() bypasses all of
> > this, as this is supposed to be done through uart_hangup() (invoked via
> > tty_vhangup() in uart_remove_one_port()).
> >
> > However, uart_hangup() does not set the hardware's power state, leaving it
> > powered up.  This may also lead to unbounded nesting counts in clock and
> > power management, depending on their internal implementation.
> >
> > Make sure to power down the port in uart_hangup(), except when the port is
> > used as a serial console. For serial consoles, this must be postponed until
> > after their deregistration in uart_remove_one_port() (symmetry with
> > registration in uart_configure_port(), invoked from uart_add_one_port()).
> >
> > After this, the module clock used by the sh-sci driver is disabled on
> > unbind while the serial port is in use.
> >
> > Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
> 
> I noticed you have applied all serial patches I've sent, except for this one.
> Is there any specific reason you skipped this one?

It was marked "RFC" so I didn't think it was to be applied...

If it's ready, please resend.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH/RFC] serial_core: Fix pm imbalance on unbind
@ 2014-03-20 21:14     ` Greg Kroah-Hartman
  0 siblings, 0 replies; 6+ messages in thread
From: Greg Kroah-Hartman @ 2014-03-20 21:14 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Jiri Slaby, linux-serial, linux-kernel, Linux-sh list,
	Geert Uytterhoeven

On Thu, Mar 20, 2014 at 11:23:00AM +0100, Geert Uytterhoeven wrote:
> Hi Greg,
> 
> On Mon, Mar 10, 2014 at 8:54 PM, Geert Uytterhoeven
> <geert@linux-m68k.org> wrote:
> > From: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
> >
> > When a serial port is closed, uart_close() takes care of shutting down the
> > hardware, and powering it down.
> >
> > When a serial port is unbound while in use, uart_close() bypasses all of
> > this, as this is supposed to be done through uart_hangup() (invoked via
> > tty_vhangup() in uart_remove_one_port()).
> >
> > However, uart_hangup() does not set the hardware's power state, leaving it
> > powered up.  This may also lead to unbounded nesting counts in clock and
> > power management, depending on their internal implementation.
> >
> > Make sure to power down the port in uart_hangup(), except when the port is
> > used as a serial console. For serial consoles, this must be postponed until
> > after their deregistration in uart_remove_one_port() (symmetry with
> > registration in uart_configure_port(), invoked from uart_add_one_port()).
> >
> > After this, the module clock used by the sh-sci driver is disabled on
> > unbind while the serial port is in use.
> >
> > Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
> 
> I noticed you have applied all serial patches I've sent, except for this one.
> Is there any specific reason you skipped this one?

It was marked "RFC" so I didn't think it was to be applied...

If it's ready, please resend.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-03-20 21:14 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-10 19:54 [PATCH/RFC] serial_core: Fix pm imbalance on unbind Geert Uytterhoeven
2014-03-10 19:54 ` Geert Uytterhoeven
2014-03-20 10:23 ` Geert Uytterhoeven
2014-03-20 10:23   ` Geert Uytterhoeven
2014-03-20 21:14   ` Greg Kroah-Hartman
2014-03-20 21:14     ` Greg Kroah-Hartman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.