All of lore.kernel.org
 help / color / mirror / Atom feed
From: NeilBrown <neilb@suse.de>
To: Jiri Slaby <jslaby@suse.cz>
Cc: NeilBrown <neil@brown.name>, Mark Rutland <mark.rutland@arm.com>,
	One Thousand Gnomes <gnomes@lxorguk.ukuu.org.uk>,
	Peter Hurley <peter@hurleysoftware.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Sebastian Reichel <sre@kernel.org>, Pavel Machek <pavel@ucw.cz>,
	Grant Likely <grant.likely@linaro.org>,
	GTA04 owners <gta04-owner@goldelico.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] TTY: add support for tty_slave devices.
Date: Tue, 31 Mar 2015 10:45:20 +1100	[thread overview]
Message-ID: <20150331104520.1002b7f0@notabene.brown> (raw)
In-Reply-To: <55113D1B.1030906@suse.cz>

[-- Attachment #1: Type: text/plain, Size: 5974 bytes --]

On Tue, 24 Mar 2015 11:31:55 +0100 Jiri Slaby <jslaby@suse.cz> wrote:

> Hi,
> 
> On 03/18/2015, 06:58 AM, NeilBrown wrote:
> > --- /dev/null
> > +++ b/drivers/tty/slave/tty_slave_core.c
> > @@ -0,0 +1,136 @@
> 
> ...
> 
> > +static int tty_slave_match(struct device *dev, struct device_driver *drv)
> > +{
> > +	return of_driver_match_device(dev, drv);
> > +}
> > +
> > +static void tty_slave_release(struct device *dev)
> > +{
> > +	kfree(dev);
> 
> This should free the slave where the dev is contained. This is never
> called IMO due to missing put_device's in the code.

Yes of course, thanks.  I've fix the 'kfree'.


> 
> > +}
> > +
> > +struct bus_type tty_slave_bus_type = {
> > +	.name		= "tty-slave",
> > +	.match		= tty_slave_match,
> > +};
> > +
> > +int tty_slave_register(struct device *parent, struct device_node *node,
> > +		       struct device *tty, struct tty_driver *drv)
> > +{
> > +	struct tty_slave *slave;
> > +	int retval;
> > +
> > +	if (!of_get_property(node, "compatible", NULL))
> > +		return -ENODEV;
> > +
> > +	slave = kzalloc(sizeof(*slave), GFP_KERNEL);
> > +	if (!slave)
> > +		return -ENOMEM;
> > +
> 
> device_initialize();

device_initialize is only needed if you call device_add()
I use device_register() which calls both.


> 
> > +	slave->dev.bus = &tty_slave_bus_type;
> > +	slave->dev.parent = parent;
> > +	slave->dev.release = tty_slave_release;
> > +	slave->dev.of_node = of_node_get(node);
> > +	dev_set_name(&slave->dev, "%s", node->name);
> > +	slave->tty_dev = tty;
> > +	slave->tty_drv = drv;
> > +	slave->ops = *drv->ops;
> > +	retval = device_register(&slave->dev);
> > +	if (retval) {
> > +		of_node_put(node);
> > +		kfree(slave);
> 
> Do device_put() instead of the two. And do the two in .release.

Done, thanks.

> 
> > +	}
> > +	return retval;
> > +}
> > +EXPORT_SYMBOL(tty_slave_register);
> ...
> > --- a/drivers/tty/tty_io.c
> > +++ b/drivers/tty/tty_io.c
> ...
> > @@ -3205,6 +3208,29 @@ static void tty_device_create_release(struct device *dev)
> >  	kfree(dev);
> >  }
> >  
> > +int tty_register_finalize(struct tty_driver *driver, struct device *dev)
> > +{
> > +	int retval;
> > +	bool cdev = false;
> > +	int index = dev->devt - MKDEV(driver->major,
> > +				      driver->minor_start);
> > +	printk("REGISTER %d %d 0x%x %d\n", driver->major, driver->minor_start, dev->devt, index);
> > +	if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
> > +		retval = tty_cdev_add(driver,
> > +				      dev->devt,
> > +				      index, 1);
> > +		if (retval)
> > +			return retval;
> > +		cdev = true;
> > +	}
> > +	retval = device_register(dev);
> > +	if (retval == 0)
> > +		return 0;
> > +	if (cdev)
> > +		cdev_del(&driver->cdevs[index]);
> > +	return retval;
> > +}
> > +EXPORT_SYMBOL(tty_register_finalize);
> >  /**
> >   *	tty_register_device_attr - register a tty device
> >   *	@driver: the tty driver that describes the tty device
> > @@ -3234,7 +3260,8 @@ struct device *tty_register_device_attr(struct tty_driver *driver,
> >  	dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
> >  	struct device *dev = NULL;
> >  	int retval = -ENODEV;
> > -	bool cdev = false;
> > +	struct device_node *node;
> > +	bool slave_registered = false;
> >  
> >  	if (index >= driver->num) {
> >  		printk(KERN_ERR "Attempt to register invalid tty line number "
> > @@ -3247,13 +3274,6 @@ struct device *tty_register_device_attr(struct tty_driver *driver,
> >  	else
> >  		tty_line_name(driver, index, name);
> >  
> > -	if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
> > -		retval = tty_cdev_add(driver, devt, index, 1);
> > -		if (retval)
> > -			goto error;
> > -		cdev = true;
> > -	}
> > -
> >  	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
> >  	if (!dev) {
> >  		retval = -ENOMEM;
> > @@ -3268,16 +3288,24 @@ struct device *tty_register_device_attr(struct tty_driver *driver,
> >  	dev->groups = attr_grp;
> >  	dev_set_drvdata(dev, drvdata);
> >  
> > -	retval = device_register(dev);
> > -	if (retval)
> > -		goto error;
> > +	if (device && device->of_node)
> > +		for_each_available_child_of_node(device->of_node, node) {
> > +			if (tty_slave_register(device, node, dev, driver) == 0)
> > +				slave_registered = true;
> > +			if (slave_registered)
> > +				break;
> > +		}
> > +
> > +	if (!slave_registered) {
> > +		retval = tty_register_finalize(driver, dev);
> > +		if (retval)
> > +			goto error;
> > +	}
> >  
> >  	return dev;
> 
> And what about ttys not using the tty_register_device* helpers?

I guess they are on their own - they don't get any help...
Is there a problem that I'm not seeing here?

I think this only applies to code that calls device_create(tty_class, ...)
which is pty.c, vt.c, and "/dev/tty".  These are all virtual devices so
having a slave doesn't make much sense... does it?

> 
> What happens when the tty is unregistered?

Good question.  I hadn't thought that through.

When the tty is unregistered, it will drop the reference it has on ->parent
which the tty_slave.  So we want that to be the last reference.
So in tty_slave_finalize() I need a put_dev() on the slave.
That must be the "put_dev" that you thought was missing earlier.

However that leaves a loose end. destruct_tty_driver() calls
tty_unregister_device() on all registered ttys for that driver.
If one had a tty_slave which was finalized, that will drop the reference on
the slave so it will disappear, which is all good.
But if one has a slave for which the driver hasn't been found yet, then there
will be no tty to unregister so the tty_slave cannot be dropped.

I guess I need to either take a reference to the driver - which doesn't seem
like a good idea - or use bus_find_device() to find any tty_slaves with that
driver, and drop them.
I'll see how that works out.


Thanks a lot!

NeilBrown

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 811 bytes --]

  reply	other threads:[~2015-03-30 23:45 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-18  5:58 [PATCH 0/3] tty slave device support - version 3 NeilBrown
2015-03-18  5:58 ` [PATCH 3/3] tty/slaves: add a driver to power on/off UART attached devices NeilBrown
     [not found]   ` <20150318055831.21025.33670.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2015-03-20  7:54     ` [Gta04-owner] " Dr. H. Nikolaus Schaller
2015-03-20  7:54       ` Dr. H. Nikolaus Schaller
     [not found]       ` <C53A3E5D-5AEA-4F0F-88A9-F9BC8CB0D0D6-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-03-20  8:54         ` NeilBrown
2015-03-20  8:54           ` NeilBrown
2015-03-20  9:34           ` Dr. H. Nikolaus Schaller
     [not found]             ` <14FB51CF-9568-4BF4-B917-2C019D992FDB-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-03-20 19:50               ` Pavel Machek
2015-03-20 19:50                 ` Pavel Machek
2015-03-20 23:31             ` NeilBrown
2015-03-24 17:58               ` Dr. H. Nikolaus Schaller
2015-03-25  1:45                 ` Sebastian Reichel
2015-03-25  7:59                   ` Dr. H. Nikolaus Schaller
2015-03-25 15:21                     ` Sebastian Reichel
2015-03-25 16:44                       ` Dr. H. Nikolaus Schaller
2015-03-26 18:08                         ` Sebastian Reichel
2015-03-27  9:22                           ` Dr. H. Nikolaus Schaller
2015-03-27 16:31                             ` Sebastian Reichel
2015-03-27 17:11                               ` Dr. H. Nikolaus Schaller
2015-04-27 20:35                                 ` Pavel Machek
2015-04-29  6:56                                   ` Dr. H. Nikolaus Schaller
2015-03-25 20:53                     ` Pavel Machek
2015-03-25 21:25                       ` Dr. H. Nikolaus Schaller
2015-03-25 21:25                         ` Dr. H. Nikolaus Schaller
     [not found]                         ` <1F3B5E32-1330-457C-AE25-791319293C38-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-03-26  5:56                           ` Pavel Machek
2015-03-26  5:56                             ` Pavel Machek
2015-03-26  6:44                             ` Dr. H. Nikolaus Schaller
     [not found]                               ` <365B2C25-1782-4ADE-B620-190A4CC5E8E3-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-04-04  7:52                                 ` Pavel Machek
2015-04-04  7:52                                   ` Pavel Machek
2015-03-25 20:42                 ` Pavel Machek
2015-03-25 21:22                   ` Dr. H. Nikolaus Schaller
2015-03-25 21:22                     ` Dr. H. Nikolaus Schaller
2015-03-18  5:58 ` [PATCH 2/3] TTY: add support for tty_slave devices NeilBrown
2015-03-18  9:11   ` Paul Bolle
2015-03-22  3:32     ` NeilBrown
2015-03-20 19:41   ` Pavel Machek
2015-03-22  3:42     ` [Gta04-owner] " NeilBrown
     [not found]       ` <20150322144209.14abc603-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2015-03-22  7:58         ` Pavel Machek
2015-03-22  7:58           ` Pavel Machek
2015-03-24 10:31   ` Jiri Slaby
2015-03-30 23:45     ` NeilBrown [this message]
2015-03-25 16:30   ` Peter Hurley
2015-03-25 21:17     ` [Gta04-owner] " NeilBrown
2015-03-27 11:09       ` Peter Hurley
2015-03-31  0:33         ` NeilBrown
2015-03-18  5:58 ` [PATCH 1/3] TTY: use class_find_device to find port in uart_suspend/resume NeilBrown
     [not found]   ` <20150318055831.21025.27864.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2015-03-25 16:20     ` Peter Hurley
2015-03-25 16:20       ` Peter Hurley
2015-03-29 21:49       ` [Gta04-owner] " NeilBrown
2015-03-20  7:54 ` [Gta04-owner] [PATCH 0/3] tty slave device support - version 3 Dr. H. Nikolaus Schaller
     [not found]   ` <80D7E742-4633-4CCD-B754-221387D82922-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-03-20  8:43     ` NeilBrown
2015-03-20  8:43       ` NeilBrown
2015-03-20  8:54       ` Dr. H. Nikolaus Schaller
2015-03-20 13:08         ` Sebastian Reichel
2015-03-20 13:57           ` Dr. H. Nikolaus Schaller
     [not found]             ` <72268D51-F993-497A-B4F9-707C8DB7155C-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-03-20 17:14               ` Sebastian Reichel
2015-03-20 17:14                 ` Sebastian Reichel
2015-03-20 19:31 ` Pavel Machek
     [not found] ` <20150318055437.21025.13990.stgit-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2015-05-05 19:54   ` Peter Hurley
2015-05-05 19:54     ` Peter Hurley
2015-05-05 20:46     ` NeilBrown
     [not found]     ` <55492001.30806-WaGBZJeGNqdsbIuE7sb01tBPR1lH4CV8@public.gmane.org>
2015-05-06  5:19       ` [Gta04-owner] " Dr. H. Nikolaus Schaller
2015-05-06  5:19         ` Dr. H. Nikolaus Schaller
     [not found]         ` <DE60E7AA-1BF4-4A68-9638-E09F85FD5C72-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-05-06  9:27           ` Pavel Machek
2015-05-06  9:27             ` Pavel Machek
2015-05-06 11:50             ` Dr. H. Nikolaus Schaller
2015-05-06 11:50               ` Dr. H. Nikolaus Schaller
2015-05-06 12:05               ` Peter Hurley
2015-05-06 12:27                 ` Dr. H. Nikolaus Schaller
2015-05-06 12:27                   ` Dr. H. Nikolaus Schaller
2015-05-06 12:36                   ` Mark Rutland
2015-05-06 13:28                     ` Dr. H. Nikolaus Schaller
2015-05-06 13:28                       ` Dr. H. Nikolaus Schaller
2015-05-06 14:15                       ` Mark Rutland
2015-05-06 16:09                         ` Dr. H. Nikolaus Schaller
2015-05-06 17:18                           ` Mark Rutland
2015-05-07 12:46                             ` Dr. H. Nikolaus Schaller
2015-05-07 12:46                               ` Dr. H. Nikolaus Schaller
2015-05-07 14:30                               ` Peter Hurley
2015-05-07 15:11                                 ` Dr. H. Nikolaus Schaller
2015-05-07 16:18                                   ` Peter Hurley
2015-05-07 16:57                                     ` Dr. H. Nikolaus Schaller
     [not found]                               ` <B4D487C5-C260-497B-A441-6C381D53616C-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-05-07 14:56                                 ` Peter Hurley
2015-05-07 14:56                                   ` Peter Hurley
     [not found]                                   ` <554B7D33.602-WaGBZJeGNqdsbIuE7sb01tBPR1lH4CV8@public.gmane.org>
2015-05-07 15:34                                     ` Dr. H. Nikolaus Schaller
2015-05-07 15:34                                       ` Dr. H. Nikolaus Schaller
2015-05-07 15:51                                       ` Peter Hurley
2015-05-07 16:46                                         ` Dr. H. Nikolaus Schaller
2015-05-13  8:09                                           ` Dr. H. Nikolaus Schaller
2015-06-03 11:49                                             ` [PATCH RFC 0/3] UART slave device support Dr. H. Nikolaus Schaller
     [not found]                                               ` <56C579D3-E8F8-4B5A-B6E8-993B113F3461-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-06-06 13:09                                                 ` Pavel Machek
2015-06-06 13:09                                                   ` Pavel Machek
     [not found]                                             ` <463356C5-E3C6-432C-A1C5-71F0287F1FEE@goldelico.com>
2015-06-03 12:09                                               ` [Gta04-owner] [PATCH RFC 3/3] misc: Add w2g0004 gps receiver driver Christ van Willegen
2015-05-07 15:37                       ` [Gta04-owner] [PATCH 0/3] tty slave device support - version 3 Peter Hurley
     [not found]               ` <A2594559-CA92-40C2-A06A-AC2483E85CB1-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-05-06 14:28                 ` Pavel Machek
2015-05-06 14:28                   ` Pavel Machek
2015-05-06 16:12                   ` Dr. H. Nikolaus Schaller
     [not found]                     ` <C68A105A-7147-4143-9B91-1A239726A780-xXXSsgcRVICgSpxsJD1C4w@public.gmane.org>
2015-06-06 13:09                       ` Pavel Machek
2015-06-06 13:09                         ` Pavel Machek
2015-06-06 18:53                         ` Belisko Marek
2015-06-06 18:55                           ` Belisko Marek
2015-05-07 15:48           ` Rob Herring
2015-05-07 15:48             ` Rob Herring
2015-05-06 11:10         ` Peter Hurley

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=20150331104520.1002b7f0@notabene.brown \
    --to=neilb@suse.de \
    --cc=arnd@arndb.de \
    --cc=devicetree@vger.kernel.org \
    --cc=gnomes@lxorguk.ukuu.org.uk \
    --cc=grant.likely@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=gta04-owner@goldelico.com \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=neil@brown.name \
    --cc=pavel@ucw.cz \
    --cc=peter@hurleysoftware.com \
    --cc=sre@kernel.org \
    /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.