All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Greg KH <greg@kroah.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Jesse Barnes <jbarnes@virtuousgeek.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Christoph Lameter <cl@linux.com>, Tejun Heo <tj@kernel.org>
Subject: [RFC PATCH] x86: Add safe_udelay() and safe_msleep()
Date: Tue, 11 Jan 2011 17:06:53 -0800	[thread overview]
Message-ID: <4D2CFEAD.6070206@kernel.org> (raw)
In-Reply-To: <20110111135655.GA6901@kroah.com>


We need to use those function in early-quirk stage with code that is shared with
later stage.

for x86, normal udelay() will need to wait per_cpu(cpu_info) is allocated... that i
after smp_prepare_cpus(), because it need to use percpu.loops_per_jiffy.

Also msleep() will need to wait schedular is ready.

Try to have one early version udelay that use loops_per_jiffy directly.
and early msleep is just early delay.

This patch will set safe_udelay to early in x86 early arch code, and then init/main.c
will set them back.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>

---
 arch/x86/include/asm/delay.h |    3 +++
 arch/x86/kernel/setup.c      |    4 ++++
 arch/x86/lib/delay.c         |   28 ++++++++++++++++++++++++++++
 include/linux/delay.h        |    2 ++
 init/main.c                  |    6 ++++++
 5 files changed, 43 insertions(+)

Index: linux-2.6/arch/x86/include/asm/delay.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/delay.h
+++ linux-2.6/arch/x86/include/asm/delay.h
@@ -28,4 +28,7 @@ extern void __delay(unsigned long loops)
 
 void use_tsc_delay(void);
 
+extern void __early_udelay(unsigned long usecs);
+extern void __early_msleep(unsigned int msecs);
+
 #endif /* _ASM_X86_DELAY_H */
Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -853,6 +853,10 @@ void __init setup_arch(char **cmdline_p)
 
 	dmi_scan_machine();
 
+	/* for early using */
+	safe_udelay = __early_udelay;
+	safe_msleep = __early_msleep;
+
 	/*
 	 * VMware detection requires dmi to be available, so this
 	 * needs to be done after dmi_scan_machine, for the BP.
Index: linux-2.6/arch/x86/lib/delay.c
===================================================================
--- linux-2.6.orig/arch/x86/lib/delay.c
+++ linux-2.6/arch/x86/lib/delay.c
@@ -138,3 +138,31 @@ void __ndelay(unsigned long nsecs)
 	__const_udelay(nsecs * 0x00005); /* 2**32 / 1000000000 (rounded up) */
 }
 EXPORT_SYMBOL(__ndelay);
+
+/* before cpu_info.loops_per_jiffy get set */
+static inline void __early_const_udelay(unsigned long xloops)
+{
+	int d0;
+
+	xloops *= 4;
+	asm("mull %%edx"
+		: "=d" (xloops), "=&a" (d0)
+		: "1" (xloops), "0"
+		(loops_per_jiffy * (HZ/4)));
+
+	delay_loop(++xloops);
+}
+
+/* usecs need to < 2000 */
+void __init __early_udelay(unsigned long usecs)
+{
+	/* 2**32 / 1000000 (rounded up) */
+	__early_const_udelay(usecs * 0x000010c7);
+}
+
+/* before schedular is there */
+void __init __early_msleep(unsigned int msecs)
+{
+	while (msecs--)
+		__early_udelay(1000);
+}
Index: linux-2.6/include/linux/delay.h
===================================================================
--- linux-2.6.orig/include/linux/delay.h
+++ linux-2.6/include/linux/delay.h
@@ -52,4 +52,6 @@ static inline void ssleep(unsigned int s
 	msleep(seconds * 1000);
 }
 
+extern void (*safe_udelay)(unsigned long);
+extern void (*safe_msleep)(unsigned int);
 #endif /* defined(_LINUX_DELAY_H) */
Index: linux-2.6/init/main.c
===================================================================
--- linux-2.6.orig/init/main.c
+++ linux-2.6/init/main.c
@@ -240,6 +240,9 @@ unsigned long loops_per_jiffy = (1<<12);
 
 EXPORT_SYMBOL(loops_per_jiffy);
 
+void (*safe_udelay)(unsigned long) = __udelay;
+void (*safe_msleep)(unsigned int) = msleep;
+
 static int __init debug_kernel(char *str)
 {
 	console_loglevel = 10;
@@ -879,6 +882,9 @@ static int __init kernel_init(void * unu
 	cad_pid = task_pid(current);
 
 	smp_prepare_cpus(setup_max_cpus);
+	/* set them back, x86 use it for early delay*/
+	safe_udelay = __udelay;
+	safe_msleep = msleep;
 
 	do_pre_smp_initcalls();
 	lockup_detector_init();

  parent reply	other threads:[~2011-01-12  1:09 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-09 19:58 [PATCH 0/3] x86, usb, pci: Disable usb legacy support early Yinghai Lu
2011-01-10  8:43 ` [PATCH -v2 0/4] " Yinghai Lu
2011-01-11  0:49   ` [PATCH -v3 " Yinghai Lu
2011-01-11  0:55     ` [PATCH -v3 1/4] pci, usb: Make usb handoff func all take base remapping Yinghai Lu
2011-01-11  1:07       ` Greg KH
2011-01-11  1:20         ` Yinghai Lu
2011-01-11  3:37           ` Greg KH
2011-01-11  5:21           ` Benjamin Herrenschmidt
2011-01-11  6:34             ` Yinghai Lu
2011-01-11  7:37               ` Benjamin Herrenschmidt
2011-01-11  9:21                 ` Yinghai Lu
2011-01-11 13:56                   ` Greg KH
2011-01-11 17:39                     ` Konrad Rzeszutek Wilk
2011-01-12  1:06                     ` Yinghai Lu [this message]
2011-01-12  2:32                       ` [RFC PATCH] x86: Add safe_udelay() and safe_msleep() Benjamin Herrenschmidt
2011-01-12  5:07                         ` Greg KH
2011-01-13 22:21                         ` Yinghai Lu
2011-01-13 22:44                           ` Greg KH
2011-01-13 22:52                             ` Thomas Gleixner
2011-01-13 23:02                               ` Greg KH
2011-01-13 23:04                               ` Yinghai Lu
2011-01-13 23:31                                 ` Thomas Gleixner
2011-01-14 22:42                                   ` Yinghai Lu
2011-01-13 23:48                                 ` Greg KH
2011-01-14  0:31                                   ` Yinghai Lu
2011-01-14  0:40                                     ` Benjamin Herrenschmidt
2011-01-14  1:00                                       ` Yinghai Lu
2011-01-14 14:46                                         ` Christoph Lameter
2011-01-14  0:44                                     ` Greg KH
2011-01-14  1:12                                       ` Yinghai Lu
2011-01-14 14:50                                         ` Christoph Lameter
2011-01-14 21:22                                           ` [PATCH] x86: set percpu cpu0 lpj to default Yinghai Lu
2011-01-14 21:28                                             ` Christoph Lameter
2011-01-15 13:09                                               ` Tejun Heo
2011-01-16  2:32                                                 ` Yinghai Lu
2011-01-14 22:16                                             ` Greg KH
2011-01-14 22:29                                               ` Yinghai Lu
2011-01-11  5:18       ` [PATCH -v3 1/4] pci, usb: Make usb handoff func all take base remapping Benjamin Herrenschmidt
2011-01-11  0:55     ` [PATCH 2/4] x86: early_quirk check all dev/func in domain 0 Yinghai Lu
2011-01-11  1:09       ` Greg KH
2011-01-11  1:46         ` Yinghai Lu
2011-01-11  3:38           ` Greg KH
2011-01-11  3:39           ` Greg KH
2011-01-11  0:55     ` [PATCH 3/4] x86, pci: add dummy pci device for early stage Yinghai Lu
2011-01-11  0:55     ` [PATCH -v3 4/4] x86: usb handoff in early_quirk Yinghai Lu
2011-01-11  1:08       ` Greg KH
2011-01-11  1:41         ` Yinghai Lu
2011-01-11  1:07     ` [PATCH -v3 0/4] x86, usb, pci: Disable usb legacy support early Greg KH
2011-01-11  1:25       ` Yinghai Lu
2011-01-11  3:35         ` Greg KH
     [not found] ` <4D2AC584.6010004@kernel.org>
2011-01-10  8:43   ` [PATCH -v2 1/4] pci, usb: Seperate usb handoff func to another file Yinghai Lu
2011-01-10  8:44   ` [PATCH 2/4] x86: early_quirk check all dev/func in domain 0 Yinghai Lu
2011-01-10  8:44   ` [PATCH 3/4] x86, pci: add dummy pci device for early stage Yinghai Lu
2011-01-10  8:44   ` [PATCH v2 4/4] x86: usb handoff in early_quirk Yinghai Lu
2011-01-10 15:57 ` [PATCH 0/3] x86, usb, pci: Disable usb legacy support early Greg KH
2011-01-10 18:27   ` Jesse Barnes
2011-01-10 20:10     ` Yinghai Lu

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=4D2CFEAD.6070206@kernel.org \
    --to=yinghai@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=benh@kernel.crashing.org \
    --cc=cl@linux.com \
    --cc=greg@kroah.com \
    --cc=hpa@zytor.com \
    --cc=jbarnes@virtuousgeek.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=tj@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.