lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20120703194234.GO11413@one.firstfloor.org>
Date:	Tue, 3 Jul 2012 21:42:34 +0200
From:	Andi Kleen <andi@...stfloor.org>
To:	Calvin Walton <calvin.walton@...stin.ca>
Cc:	Linus Torvalds <torvalds@...ux-foundation.org>,
	Andi Kleen <andi@...stfloor.org>,
	Jiri Kosina <jkosina@...e.cz>, linux-kernel@...r.kernel.org,
	shemminger@...tta.com
Subject: Re: long boot delays caused by 070ad7e7 floppy change

On Tue, Jul 03, 2012 at 03:36:40PM -0400, Calvin Walton wrote:
> On Tue, 2012-07-03 at 12:12 -0700, Linus Torvalds wrote:
> > What happens if you add a
> > 
> >         cancel_delayed_work(&fd_timeout);
> > 
> > to before the queue_delayed_work() in __reschedule_timeout()? Does
> > that possibly make the delay really be 3 seconds?
> 
> Yes, it does...
> [    0.718571] floppy0: reschedule timeout lock fdc
> [    1.650956] Refined TSC clocksource calibration: 2698.760 MHz.
> [    1.651109] Switching to clocksource tsc
> [    3.724664] floppy0: reschedule timeout do wakeup
> [    3.724815] floppy0: no floppy controllers found
> 
> diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
> index cce7df3..c8064e4 100644
> --- a/drivers/block/floppy.c
> +++ b/drivers/block/floppy.c
> @@ -678,6 +678,8 @@ static void __reschedule_timeout(int drive, const char *message)
>  	} else
>  		delay = UDP->timeout;
>  
> +	cancel_delayed_work(&fd_timeout);
> +
>  	queue_delayed_work(floppy_wq, &fd_timeout, delay);
>  	if (UDP->flags & FD_DEBUG)
>  		DPRINT("reschedule timeout %s\n", message);
> 
> Of course, a 3 second delay at this point in boot is still a fairly big
> bit of waiting, given how fast everything else is nowadays.

Here's the patch I did for that yesterday


>From 04a4d851d1c96b6685352d9cef41b77966cc7a1e Mon Sep 17 00:00:00 2001
From: Andi Kleen <ak@...ux.intel.com>
Date: Mon, 2 Jul 2012 17:07:08 -0700
Subject: [PATCH] floppy: Run floppy initialization asynchronous

floppy_init is quite slow, 3s on my test system to determine
that there is no floppy. Run it asynchronous to the other
init calls to improve boot time.

Cuts down boot time by 1s on a system of mine.

Signed-off-by: Andi Kleen <ak@...ux.intel.com>

diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index cce7df3..8b5769b 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -191,6 +191,7 @@ static int print_unex = 1;
 #include <linux/mutex.h>
 #include <linux/io.h>
 #include <linux/uaccess.h>
+#include <linux/async.h>
 
 /*
  * PS/2 floppies have much slower step rates than regular floppies.
@@ -4122,7 +4123,7 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data)
 	return get_disk(disks[drive]);
 }
 
-static int __init floppy_init(void)
+static int __init do_floppy_init(void)
 {
 	int i, unit, drive;
 	int err, dr;
@@ -4337,6 +4338,24 @@ out_put_disk:
 	return err;
 }
 
+#ifndef MODULE
+static __init void floppy_async_init(void *data, async_cookie_t cookie)
+{
+	do_floppy_init();
+}
+#endif
+
+static int __init floppy_init(void)
+{
+#ifdef MODULE
+	return do_floppy_init(void);
+#else
+	/* Don't hold up the bootup by the floppy initialization */
+	async_schedule(floppy_async_init, NULL);
+	return 0;
+#endif
+}
+
 static const struct io_region {
 	int offset;
 	int size;
-- 
1.7.7.6





--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ