All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Hurley <peter@hurleysoftware.com>
To: "xinhui.pan" <xinhuix.pan@intel.com>,
	Greg KH <gregkh@linuxfoundation.org>, mnipxh <mnipxh@gmail.com>
Cc: jslaby@suse.cz, linux-kernel@vger.kernel.org,
	yanmin_zhang@linux.intel.com
Subject: Re: [PATCH] tty/tty_io.c: make a check before reuse cdev
Date: Tue, 22 Jul 2014 12:40:59 -0400	[thread overview]
Message-ID: <53CE941B.1030102@hurleysoftware.com> (raw)
In-Reply-To: <53CE5097.2000502@intel.com>

On 07/22/2014 07:52 AM, xinhui.pan wrote:
> 
> 于 2014年07月21日 23:38, Greg KH 写道:
>> On Mon, Jul 21, 2014 at 08:47:16PM +0800, pp wrote:
>>> As reuse the cdev may cause panic. After we unregister the tty device, we may use tty_hangup() o
>>> other similar function to send a signal(SIGHUP) to process which has opend our device. But that
>>> not succeed if the process couldn't get the signal. for example, a process forked
>>> but his parent quited never get SIGHUP.
>>>
>>> Here is our scence.
>>> tty driver register its device and init the cdevs, then process "A" open one cdev.
>>> tty driver unregister its device and cdev_del the cdevs, call tty_hangup to (S)send signal SIGHUP to process A.
>>> But that step(S) fails.
>>
>> How can that fail?  What driver does this fail for?
> 
> hi, Greg
> 	Thanks for your nice comments. :)
> 	It's gsm driver that want to unregister/register tty device. We are working on our intel mobile phone,
> When the phone goes into airplane-mode, the modem will disconnect from system, then gsmld_close() -> gsmld_detach_gsm() -> tty_unregister_device().
> When the phone leaves airplane-mode, the modem will connect to system, then gsmld_open() -> gsmld_attach_gsm() -> tty_register_device()
> In this way how gsm driver works.
> It seems very normal and can work well. :)
> 
> But there is always something bad for us to deal with. 
> If a process(A, its name) opens the /dev/gsmttyXX, and the process(A) is, for example, running with command "A &".
> The process(A) is not able to receive the signal SIGHUP from __tty_hangup() -> tty_signal_session_leader(). 
> There are several reasons that can stop process(A) from receiving signal SIGHUP. 
> another example, B is running, and he makes a fork(), A is the child of B, then B quit, leave A running.
> in such scenario, A is not able to receive signal SIGHUP, either. 
> Anyway, we cannot guarantee process(A) will close /dev/gsmttyXX in time. That means we don't know when we can reuse the tty_driver->cdevs[XX].
> one second, one minute? We don't know. We just don't trust user space. :)

Or a process could simply ignore SIGHUP, in which case /dev/gsmttyXX
will not be closed until process termination.

>>> tty driver register its device and (D)init the cdevs again.
>>
>> What driver does this with an "old" device, it should have created a new
>> one, otherwise, as you have pointed out, it's a bug.
>>
> 
> I can't agree more with you. we should not use "old" device.

This is a gsm driver problem. The GSM driver is reusing device indexes
for still-open ttys.

The GSM driver uses a global table, gsm_mux[], to allocate device indexes
but prematurely clears the table entry in gsm_mux_cleanup(). If instead,
clearing the gsm_mux table entry were deferred to gsm_mux_free(), then
device indexes would not be getting reused until after the last tty
associated with the last gsm attach was closed.

Regards,
Peter Hurley

  reply	other threads:[~2014-07-22 16:41 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-21 12:47 [PATCH] tty/tty_io.c: make a check before reuse cdev pp
2014-07-21 15:38 ` Greg KH
2014-07-22 11:52   ` xinhui.pan
2014-07-22 16:40     ` Peter Hurley [this message]
2014-07-22 17:38       ` Greg KH
2014-07-23  9:21       ` xinhui.pan
2014-07-23 16:04         ` Peter Hurley
2014-07-24 10:23           ` xinhui.pan
2014-07-25 15:24           ` xinhui
2014-07-23 16:07         ` One Thousand Gnomes
2014-07-24 11:01           ` xinhui.pan
2014-07-24 11:03           ` xinhui.pan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53CE941B.1030102@hurleysoftware.com \
    --to=peter@hurleysoftware.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mnipxh@gmail.com \
    --cc=xinhuix.pan@intel.com \
    --cc=yanmin_zhang@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.