提交 4995f8ef 编写于 作者: K Kay Sievers 提交者: Greg Kroah-Hartman

vcs: hook sysfs devices into object lifetime instead of "binding"

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

Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: NKay Sievers <kay.sievers@vrfy.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 ce21c7bc
...@@ -479,18 +479,18 @@ static const struct file_operations vcs_fops = { ...@@ -479,18 +479,18 @@ static const struct file_operations vcs_fops = {
static struct class *vc_class; 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, device_create(vc_class, NULL, MKDEV(VCS_MAJOR, index + 1), NULL,
"vcs%u", tty->index + 1); "vcs%u", index + 1);
device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129), NULL, device_create(vc_class, NULL, MKDEV(VCS_MAJOR, index + 129), NULL,
"vcsa%u", tty->index + 1); "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, index + 1));
device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 129)); device_destroy(vc_class, MKDEV(VCS_MAJOR, index + 129));
} }
int __init vcs_init(void) int __init vcs_init(void)
......
...@@ -778,6 +778,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ ...@@ -778,6 +778,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
} }
vc->vc_kmalloced = 1; vc->vc_kmalloced = 1;
vc_init(vc, vc->vc_rows, vc->vc_cols, 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); atomic_notifier_call_chain(&vt_notifier_list, VT_ALLOCATE, &param);
} }
return 0; return 0;
...@@ -987,7 +988,9 @@ void vc_deallocate(unsigned int currcons) ...@@ -987,7 +988,9 @@ void vc_deallocate(unsigned int currcons)
if (vc_cons_allocated(currcons)) { if (vc_cons_allocated(currcons)) {
struct vc_data *vc = vc_cons[currcons].d; struct vc_data *vc = vc_cons[currcons].d;
struct vt_notifier_param param = { .vc = vc }; struct vt_notifier_param param = { .vc = vc };
atomic_notifier_call_chain(&vt_notifier_list, VT_DEALLOCATE, &param); atomic_notifier_call_chain(&vt_notifier_list, VT_DEALLOCATE, &param);
vcs_remove_sysfs(currcons);
vc->vc_sw->con_deinit(vc); vc->vc_sw->con_deinit(vc);
put_pid(vc->vt_pid); put_pid(vc->vt_pid);
module_put(vc->vc_sw->owner); module_put(vc->vc_sw->owner);
...@@ -2775,7 +2778,6 @@ static int con_open(struct tty_struct *tty, struct file *filp) ...@@ -2775,7 +2778,6 @@ static int con_open(struct tty_struct *tty, struct file *filp)
tty->termios->c_iflag |= IUTF8; tty->termios->c_iflag |= IUTF8;
else else
tty->termios->c_iflag &= ~IUTF8; tty->termios->c_iflag &= ~IUTF8;
vcs_make_sysfs(tty);
release_console_sem(); release_console_sem();
return ret; return ret;
} }
...@@ -2795,7 +2797,6 @@ static void con_shutdown(struct tty_struct *tty) ...@@ -2795,7 +2797,6 @@ static void con_shutdown(struct tty_struct *tty)
BUG_ON(vc == NULL); BUG_ON(vc == NULL);
acquire_console_sem(); acquire_console_sem();
vc->vc_tty = NULL; vc->vc_tty = NULL;
vcs_remove_sysfs(tty);
release_console_sem(); release_console_sem();
tty_shutdown(tty); tty_shutdown(tty);
} }
......
...@@ -137,8 +137,8 @@ extern void resume_console(void); ...@@ -137,8 +137,8 @@ extern void resume_console(void);
int mda_console_init(void); int mda_console_init(void);
void prom_con_init(void); void prom_con_init(void);
void vcs_make_sysfs(struct tty_struct *tty); void vcs_make_sysfs(int index);
void vcs_remove_sysfs(struct tty_struct *tty); void vcs_remove_sysfs(int index);
/* Some debug stub to catch some of the obvious races in the VT code */ /* Some debug stub to catch some of the obvious races in the VT code */
#if 1 #if 1
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册