public inbox for linux-serial@vger.kernel.org
 help / color / mirror / Atom feed
From: Alan Cox <alan@lxorguk.ukuu.org.uk>
To: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
	torvalds@linux-foundation.org
Subject: [PATCH 21/30] vcs: hook sysfs devices into object lifetime instead of "binding"
Date: Tue, 24 Mar 2009 14:05:24 +0000	[thread overview]
Message-ID: <20090324140516.12735.87872.stgit@localhost.localdomain> (raw)
In-Reply-To: <20090324135930.12735.7827.stgit@localhost.localdomain>

From: Kay Sievers <kay.sievers@vrfy.org>

During bootup performance tracing I noticed many occurrences of vca*
device creation and removal, leading to the usual userspace uevent
processing, which are, in this case, rather pointless.

A simple test showing the kernel timing (not including all the work
userspace has to do), gives us these numbers:

  $ time for i in `seq 1000`; do echo a > /dev/tty2; done
  real    0m1.142s
  user    0m0.015s
  sys     0m0.540s

If we move the hook for the vcs* driver core devices from the tty
"binding" to the vc allocation/deallocation, which is what the vcs*
devices represent, we get the following numbers:

  $ time for i in `seq 1000`; do echo a > /dev/tty2; done
  real    0m0.152s
  user    0m0.030s
  sys     0m0.072s

Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
---

 drivers/char/vc_screen.c |   16 ++++++++--------
 drivers/char/vt.c        |    5 +++--
 include/linux/console.h  |    4 ++--
 3 files changed, 13 insertions(+), 12 deletions(-)


diff --git a/drivers/char/vc_screen.c b/drivers/char/vc_screen.c
index 4f3b3f9..d94d25c 100644
--- a/drivers/char/vc_screen.c
+++ b/drivers/char/vc_screen.c
@@ -479,18 +479,18 @@ static const struct file_operations vcs_fops = {
 
 static struct class *vc_class;
 
-void vcs_make_sysfs(struct tty_struct *tty)
+void vcs_make_sysfs(int index)
 {
-	device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 1), NULL,
-		      "vcs%u", tty->index + 1);
-	device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129), NULL,
-		      "vcsa%u", tty->index + 1);
+	device_create(vc_class, NULL, MKDEV(VCS_MAJOR, index + 1), NULL,
+		      "vcs%u", index + 1);
+	device_create(vc_class, NULL, MKDEV(VCS_MAJOR, index + 129), NULL,
+		      "vcsa%u", index + 1);
 }
 
-void vcs_remove_sysfs(struct tty_struct *tty)
+void vcs_remove_sysfs(int index)
 {
-	device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 1));
-	device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 129));
+	device_destroy(vc_class, MKDEV(VCS_MAJOR, index + 1));
+	device_destroy(vc_class, MKDEV(VCS_MAJOR, index + 129));
 }
 
 int __init vcs_init(void)
diff --git a/drivers/char/vt.c b/drivers/char/vt.c
index 7900bd6..2c1d133 100644
--- a/drivers/char/vt.c
+++ b/drivers/char/vt.c
@@ -778,6 +778,7 @@ int vc_allocate(unsigned int currcons)	/* return 0 on success */
 	    }
 	    vc->vc_kmalloced = 1;
 	    vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
+	    vcs_make_sysfs(currcons);
 	    atomic_notifier_call_chain(&vt_notifier_list, VT_ALLOCATE, &param);
 	}
 	return 0;
@@ -987,7 +988,9 @@ void vc_deallocate(unsigned int currcons)
 	if (vc_cons_allocated(currcons)) {
 		struct vc_data *vc = vc_cons[currcons].d;
 		struct vt_notifier_param param = { .vc = vc };
+
 		atomic_notifier_call_chain(&vt_notifier_list, VT_DEALLOCATE, &param);
+		vcs_remove_sysfs(currcons);
 		vc->vc_sw->con_deinit(vc);
 		put_pid(vc->vt_pid);
 		module_put(vc->vc_sw->owner);
@@ -2775,7 +2778,6 @@ static int con_open(struct tty_struct *tty, struct file *filp)
 				tty->termios->c_iflag |= IUTF8;
 			else
 				tty->termios->c_iflag &= ~IUTF8;
-			vcs_make_sysfs(tty);
 			release_console_sem();
 			return ret;
 		}
@@ -2795,7 +2797,6 @@ static void con_shutdown(struct tty_struct *tty)
 	BUG_ON(vc == NULL);
 	acquire_console_sem();
 	vc->vc_tty = NULL;
-	vcs_remove_sysfs(tty);
 	release_console_sem();
 	tty_shutdown(tty);
 }
diff --git a/include/linux/console.h b/include/linux/console.h
index a67a90c..dcca533 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -137,8 +137,8 @@ extern void resume_console(void);
 int mda_console_init(void);
 void prom_con_init(void);
 
-void vcs_make_sysfs(struct tty_struct *tty);
-void vcs_remove_sysfs(struct tty_struct *tty);
+void vcs_make_sysfs(int index);
+void vcs_remove_sysfs(int index);
 
 /* Some debug stub to catch some of the obvious races in the VT code */
 #if 1


  parent reply	other threads:[~2009-03-24 14:05 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-24 14:01 [PATCH 00/30] Serial and tty for 2.6.30 Alan Cox
2009-03-24 14:01 ` [PATCH 01/30] disallow SERIAL_8250_PNP with SERIAL_8250_CONSOLE Alan Cox
2009-03-24 15:10   ` Andrey Panin
2009-03-24 15:22     ` Alan Cox
2009-03-24 20:59       ` Matthew Garrett
2009-03-24 21:26         ` Alan Cox
2009-03-24 21:34           ` Matthew Garrett
2009-03-24 21:38             ` Alan Cox
2009-03-24 21:43               ` Matthew Garrett
2009-03-24 22:18                 ` Alan Cox
2009-03-24 22:29                   ` Matthew Garrett
2009-03-24 22:36                     ` Alan Cox
2009-03-24 22:58                       ` Matthew Garrett
2009-03-25 14:22                         ` Clark Williams
2009-03-25 15:18                           ` Clark Williams
2009-03-25 15:32                             ` Alan Cox
2009-03-25 15:38                               ` Matthew Garrett
2009-03-25 17:02                                 ` Linus Torvalds
2009-03-25 23:04                         ` Bjorn Helgaas
2009-03-24 14:02 ` [PATCH 02/30] 8250_pnp.c: add another Wacom tablet Alan Cox
2009-03-24 14:02 ` [PATCH 03/30] serial: Update PNP IDs Alan Cox
2009-03-24 14:02 ` [PATCH 04/30] jsm: Fix the return variable and removing the unused retval Alan Cox
2009-03-24 14:02 ` [PATCH 05/30] PCI: quirks, don't mark one netmos as class other Alan Cox
2009-03-24 14:02 ` [PATCH 06/30] devpts: must release s_umount on error Alan Cox
2009-03-24 14:02 ` [PATCH 07/30] cpm_uart: fix non-console port startup bug Alan Cox
2009-03-24 14:03 ` [PATCH 08/30] Use barrier instead of cpu_relax for early blackfin boot Alan Cox
2009-03-24 14:03 ` [PATCH 09/30] blackfin: Explain why we cannot cpu_relax() in early serial code Alan Cox
2009-03-24 14:03 ` [PATCH 10/30] blackfin: BF538/9 serial uart support Alan Cox
2009-03-24 14:03 ` [PATCH 11/30] blackfin: Use unsigned long for flags with irq functions Alan Cox
2009-03-24 14:03 ` [PATCH 12/30] blackfin: Fix tty compile error in PIO mode Alan Cox
2009-03-24 14:03 ` [PATCH 13/30] Fix DMA rx ring buffer handling Alan Cox
2009-03-24 14:04 ` [PATCH 14/30] blackfin: Subtract ANOMALY_05000230 on quot Alan Cox
2009-03-24 14:04 ` [PATCH 15/30] applicom: Auto-load applicom module when device opened Alan Cox
2009-03-24 14:04 ` [PATCH 16/30] cyclades: Auto-load cyclades " Alan Cox
2009-03-24 14:04 ` [PATCH 17/30] specialix: Auto-load specialix " Alan Cox
2009-03-24 14:04 ` [PATCH 18/30] usb: Auto-load cdc_acm " Alan Cox
2009-03-24 14:05 ` [PATCH 19/30] riscom8: Auto-load riscom8 " Alan Cox
2009-03-24 14:05 ` [PATCH 20/30] rio: addition has higher precedence than ?: Alan Cox
2009-03-24 14:05 ` Alan Cox [this message]
2009-03-24 14:05 ` [PATCH 22/30] jsm: define init function as __devinit Alan Cox
2009-03-24 14:05 ` [PATCH 23/30] icom: remove unused variables Alan Cox
2009-03-24 14:05 ` [PATCH 24/30] isicom: isicom kref leak fix Alan Cox
2009-03-24 14:06 ` [PATCH 25/30] tty: moxa, fix refcounting in moxa_poll_port Alan Cox
2009-03-24 14:06 ` [PATCH 26/30] mxser: remove tty_port_tty_get from mxser_check_modem_status Alan Cox
2009-03-24 14:06 ` [PATCH 27/30] ucc: Fix leaky error path Alan Cox
2009-03-24 14:06 ` [PATCH 28/30] mux: fix build problem Alan Cox
2009-03-24 14:06 ` [PATCH 29/30] 8250_pci: add support for National Instruments 843x RS232 devices Alan Cox
2009-03-24 14:07 ` [PATCH 30/30] 8250_pci: ni8420 support Alan Cox

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=20090324140516.12735.87872.stgit@localhost.localdomain \
    --to=alan@lxorguk.ukuu.org.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox