1. 03 2月, 2007 1 次提交
  2. 11 1月, 2007 1 次提交
    • J
      [PATCH] x86-64: - Ignore long SMI interrupts in clock calibration · ed5316d4
      Jack Steiner 提交于
      Ensure that no SMI interrupts occur between the read of the HPET & TSC
      in the clock calibration loop.
      
      I noticed that a 2.66GHz system incorrectly detected the processor
      clock speed about 1/7 of the time:
      
      	time.c: Detected 2660.005 MHz processor.	(most of the time)
      	time.c: Detected 2988.203 MHz processor.	(sometime)
      
      The problem is caused by an SMI interrupt occuring in hpet_calibrate_tsc()
      between the read of the HPET & TSC. Prior to switching the BIOS into
      ACPI mode, it appears that every 27msec an SMI interrupt occurs. The
      SMI interrupt takes 4.8 msec to process.
      
      Note: On my test system, TICK_MIN had to be >380. I picked 5000
      to minimize risk of having a value that is too small for other
      platforms.
      Signed-off-by: NJack Steiner <steiner@sgi.com>
      Signed-off-by: NAndi Kleen <ak@suse.de>
      
       arch/x86_64/kernel/time.c |   25 +++++++++++++++++++++----
       1 file changed, 21 insertions(+), 4 deletions(-)
      ed5316d4
  3. 22 11月, 2006 1 次提交
    • D
      WorkStruct: Pass the work_struct pointer instead of context data · 65f27f38
      David Howells 提交于
      Pass the work_struct pointer to the work function rather than context data.
      The work function can use container_of() to work out the data.
      
      For the cases where the container of the work_struct may go away the moment the
      pending bit is cleared, it is made possible to defer the release of the
      structure by deferring the clearing of the pending bit.
      
      To make this work, an extra flag is introduced into the management side of the
      work_struct.  This governs auto-release of the structure upon execution.
      
      Ordinarily, the work queue executor would release the work_struct for further
      scheduling or deallocation by clearing the pending bit prior to jumping to the
      work function.  This means that, unless the driver makes some guarantee itself
      that the work_struct won't go away, the work function may not access anything
      else in the work_struct or its container lest they be deallocated..  This is a
      problem if the auxiliary data is taken away (as done by the last patch).
      
      However, if the pending bit is *not* cleared before jumping to the work
      function, then the work function *may* access the work_struct and its container
      with no problems.  But then the work function must itself release the
      work_struct by calling work_release().
      
      In most cases, automatic release is fine, so this is the default.  Special
      initiators exist for the non-auto-release case (ending in _NAR).
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      65f27f38
  4. 14 11月, 2006 1 次提交
    • A
      [PATCH] x86-64: Fix vgetcpu when CONFIG_HOTPLUG_CPU is disabled · 8c131af1
      Andi Kleen 提交于
      The vgetcpu per CPU initialization previously relied on CPU hotplug
      events for all CPUs to initialize the per CPU state. That only
      worked only on kernels with CONFIG_HOTPLUG_CPU enabled.  On the
      others some CPUs didn't get their state initialized properly
      and vgetcpu wouldn't work.
      
      Change the initialization sequence to instead run in a normal
      initcall (which runs after the normal CPU bootup) and initialize
      all running CPUs there. Later hotplug CPUs are still handled
      with an hotplug notifier.
      
      This actually simplifies the code somewhat.
      Signed-off-by: NAndi Kleen <ak@suse.de>
      8c131af1
  5. 22 10月, 2006 2 次提交
    • A
      [PATCH] x86-64: Fix C3 timer test · aa026ede
      Andi Kleen 提交于
      There was a typo in the C3 latency test to decide of the TSC
      should be used or not. It used the C2 latency threshold, not the
      C3 one. Fix that.
      
      This should fix the time on various dual core laptops.
      Signed-off-by: NAndi Kleen <ak@suse.de>
      aa026ede
    • A
      [PATCH] x86-64: Fix C3 timer test · 37b1bccf
      Andi Kleen 提交于
      There was a typo in the C3 latency test to decide of the TSC
      should be used or not. It used the C2 latency threshold, not the
      C3 one. Fix that.
      
      This should fix the time on various dual core laptops.
      Signed-off-by: NAndi Kleen <ak@suse.de>
      37b1bccf
  6. 05 10月, 2006 1 次提交
    • D
      IRQ: Maintain regs pointer globally rather than passing to IRQ handlers · 7d12e780
      David Howells 提交于
      Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
      of passing regs around manually through all ~1800 interrupt handlers in the
      Linux kernel.
      
      The regs pointer is used in few places, but it potentially costs both stack
      space and code to pass it around.  On the FRV arch, removing the regs parameter
      from all the genirq function results in a 20% speed up of the IRQ exit path
      (ie: from leaving timer_interrupt() to leaving do_IRQ()).
      
      Where appropriate, an arch may override the generic storage facility and do
      something different with the variable.  On FRV, for instance, the address is
      maintained in GR28 at all times inside the kernel as part of general exception
      handling.
      
      Having looked over the code, it appears that the parameter may be handed down
      through up to twenty or so layers of functions.  Consider a USB character
      device attached to a USB hub, attached to a USB controller that posts its
      interrupts through a cascaded auxiliary interrupt controller.  A character
      device driver may want to pass regs to the sysrq handler through the input
      layer which adds another few layers of parameter passing.
      
      I've build this code with allyesconfig for x86_64 and i386.  I've runtested the
      main part of the code on FRV and i386, though I can't test most of the drivers.
      I've also done partial conversion for powerpc and MIPS - these at least compile
      with minimal configurations.
      
      This will affect all archs.  Mostly the changes should be relatively easy.
      Take do_IRQ(), store the regs pointer at the beginning, saving the old one:
      
      	struct pt_regs *old_regs = set_irq_regs(regs);
      
      And put the old one back at the end:
      
      	set_irq_regs(old_regs);
      
      Don't pass regs through to generic_handle_irq() or __do_IRQ().
      
      In timer_interrupt(), this sort of change will be necessary:
      
      	-	update_process_times(user_mode(regs));
      	-	profile_tick(CPU_PROFILING, regs);
      	+	update_process_times(user_mode(get_irq_regs()));
      	+	profile_tick(CPU_PROFILING);
      
      I'd like to move update_process_times()'s use of get_irq_regs() into itself,
      except that i386, alone of the archs, uses something other than user_mode().
      
      Some notes on the interrupt handling in the drivers:
      
       (*) input_dev() is now gone entirely.  The regs pointer is no longer stored in
           the input_dev struct.
      
       (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking.  It does
           something different depending on whether it's been supplied with a regs
           pointer or not.
      
       (*) Various IRQ handler function pointers have been moved to type
           irq_handler_t.
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
      7d12e780
  7. 01 10月, 2006 1 次提交
    • A
      [PATCH] kill wall_jiffies · 8ef38609
      Atsushi Nemoto 提交于
      With 2.6.18-rc4-mm2, now wall_jiffies will always be the same as jiffies.
      So we can kill wall_jiffies completely.
      
      This is just a cleanup and logically should not change any real behavior
      except for one thing: RTC updating code in (old) ppc and xtensa use a
      condition "jiffies - wall_jiffies == 1".  This condition is never met so I
      suppose it is just a bug.  I just remove that condition only instead of
      kill the whole "if" block.
      
      [heiko.carstens@de.ibm.com: s390 build fix and cleanup]
      Signed-off-by: NAtsushi Nemoto <anemo@mba.ocn.ne.jp>
      Cc: Andi Kleen <ak@muc.de>
      Cc: Paul Mackerras <paulus@samba.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Richard Henderson <rth@twiddle.net>
      Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
      Cc: Russell King <rmk@arm.linux.org.uk>
      Cc: Ian Molton <spyro@f2s.com>
      Cc: Mikael Starvik <starvik@axis.com>
      Cc: David Howells <dhowells@redhat.com>
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Cc: Hirokazu Takata <takata.hirokazu@renesas.com>
      Cc: Ralf Baechle <ralf@linux-mips.org>
      Cc: Kyle McMartin <kyle@mcmartin.ca>
      Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
      Cc: Richard Curnow <rc@rc0.org.uk>
      Cc: William Lee Irwin III <wli@holomorphy.com>
      Cc: "David S. Miller" <davem@davemloft.net>
      Cc: Jeff Dike <jdike@addtoit.com>
      Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
      Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp>
      Cc: Chris Zankel <chris@zankel.net>
      Cc: "Luck, Tony" <tony.luck@intel.com>
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Cc: Roman Zippel <zippel@linux-m68k.org>
      Signed-off-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
      Signed-off-by: NAndrew Morton <akpm@osdl.org>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      8ef38609
  8. 30 9月, 2006 1 次提交
    • A
      [PATCH] simplify update_times (avoid jiffies/jiffies_64 aliasing problem) · 3171a030
      Atsushi Nemoto 提交于
      Pass ticks to do_timer() and update_times(), and adjust x86_64 and s390
      timer interrupt handler with this change.
      
      Currently update_times() calculates ticks by "jiffies - wall_jiffies", but
      callers of do_timer() should know how many ticks to update.  Passing ticks
      get rid of this redundant calculation.  Also there are another redundancy
      pointed out by Martin Schwidefsky.
      
      This cleanup make a barrier added by
      5aee405c needless.  So this patch removes
      it.
      
      As a bonus, this cleanup make wall_jiffies can be removed easily, since now
      wall_jiffies is always synced with jiffies.  (This patch does not really
      remove wall_jiffies.  It would be another cleanup patch)
      Signed-off-by: NAtsushi Nemoto <anemo@mba.ocn.ne.jp>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: "Eric W. Biederman" <ebiederm@xmission.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: john stultz <johnstul@us.ibm.com>
      Cc: Andi Kleen <ak@muc.de>
      Cc: Paul Mackerras <paulus@samba.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Richard Henderson <rth@twiddle.net>
      Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
      Acked-by: NRussell King <rmk@arm.linux.org.uk>
      Cc: Ian Molton <spyro@f2s.com>
      Cc: Mikael Starvik <starvik@axis.com>
      Acked-by: NDavid Howells <dhowells@redhat.com>
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Cc: Hirokazu Takata <takata.hirokazu@renesas.com>
      Acked-by: NRalf Baechle <ralf@linux-mips.org>
      Cc: Kyle McMartin <kyle@mcmartin.ca>
      Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
      Cc: Richard Curnow <rc@rc0.org.uk>
      Cc: William Lee Irwin III <wli@holomorphy.com>
      Cc: "David S. Miller" <davem@davemloft.net>
      Cc: Jeff Dike <jdike@addtoit.com>
      Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
      Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp>
      Cc: Chris Zankel <chris@zankel.net>
      Acked-by: N"Luck, Tony" <tony.luck@intel.com>
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Cc: Roman Zippel <zippel@linux-m68k.org>
      Signed-off-by: NAndrew Morton <akpm@osdl.org>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      3171a030
  9. 26 9月, 2006 7 次提交
    • C
      [PATCH] hpet rtc emulation: add watchdog timer · 1447c27d
      Clemens Ladisch 提交于
      To prevent the emulated RTC timer from stopping when interrupts are delayed
      for too long, disable interrupts around all of the register initialization,
      and check that the interrupt handler did not schedule the next interrupt in
      the past.
      Signed-off-by: NClemens Ladisch <clemens@ladisch.de>
      Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
      Cc: Andi Kleen <ak@muc.de>
      Cc: Vojtech Pavlik <vojtech@suse.cz>
      Cc: Robert Picco <Robert.Picco@hp.com>
      Signed-off-by: NAndrew Morton <akpm@osdl.org>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      1447c27d
    • R
      [PATCH] Detect clock skew during suspend · 34464a5b
      Rafael J. Wysocki 提交于
      Detect the situations in which the time after a resume from disk would
      be earlier than the time before the suspend and prevent them from
      happening on x86_64.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Signed-off-by: NAndi Kleen <ak@suse.de>
      34464a5b
    • D
      [PATCH] X86_64 monotonic_clock goes backwards · cbf9b4bb
      Dimitri Sivanich 提交于
      I've noticed some erratic behavior while testing the X86_64 version
      of monotonic_clock().
      
      While spinning in a loop reading monotonic clock values (pinned to a
      single cpu) I noticed that the difference between subsequent values
      occasionally went negative (time going backwards).
      
      I found that in the following code:
                      this_offset = get_cycles_sync();
                      /* FIXME: 1000 or 1000000? */
      -->             offset = (this_offset - last_offset)*1000 / cpu_khz;
              }
              return base + offset;
      
      the offset sometimes turns out to be 0, even though
      this_offset > last_offset.
      
      +Added fix From: Toyo Abe <toyoa@mvista.com>
      
      The x86_64-mm-monotonic-clock.patch in 2.6.18-rc4-mm2 made a change to
      the updating of monotonic_base. It now uses cycles_2_ns().
      
      I suggest that a set_cyc2ns_scale() should be done prior to the setup_irq().
      Because cycles_2_ns() can be called from the timer ISR right after the irq0
      is enabled.
      Signed-off-by: NToyo Abe <toyoa@mvista.com>
      Signed-off-by: NDimitri Sivanich <sivanich@sgi.com>
      Signed-off-by: NAndi Kleen <ak@suse.de>
      cbf9b4bb
    • A
      [PATCH] Remove all ifdefs for local/io apic · 7f11d8a5
      Andi Kleen 提交于
      IO-APIC or local APIC can only be disabled at runtime anyways and
      Kconfig has forced these options on for a long time now.
      
      The Kconfigs are kept only now for the benefit of the shared acpi
      boot.c code.
      Signed-off-by: NAndi Kleen <ak@suse.de>
      7f11d8a5
    • A
      [PATCH] Simplify profile_pc on x86-64 · 31679f38
      Andi Kleen 提交于
      Use knowledge about EFLAGS layout (bits 22:63 are always 0) to distingush
      EFLAGS word and kernel address in the spin lock stack frame.
      Signed-off-by: NAndi Kleen <ak@suse.de>
      31679f38
    • V
      [PATCH] Add the vgetcpu vsyscall · c08c8205
      Vojtech Pavlik 提交于
      This patch adds a vgetcpu vsyscall, which depending on the CPU RDTSCP
      capability uses either the RDTSCP or CPUID to obtain a CPU and node
      numbers and pass them to the program.
      
      AK: Lots of changes over Vojtech's original code:
      Better prototype for vgetcpu()
      It's better to pass the cpu / node numbers as separate arguments
      to avoid mistakes when going from SMP to NUMA.
      Also add a fast time stamp based cache using a user supplied
      argument to speed things more up.
      Use fast method from Chuck Ebbert to retrieve node/cpu from
      GDT limit instead of CPUID
      Made sure RDTSCP init is always executed after node is known.
      Drop printk
      Signed-off-by: NVojtech Pavlik <vojtech@suse.cz>
      Signed-off-by: NAndi Kleen <ak@suse.de>
      c08c8205
    • V
      [PATCH] Add initalization of the RDTSCP auxilliary values · a670fad0
      Vojtech Pavlik 提交于
      This patch adds initalization of the RDTSCP auxilliary values to CPU numbers
      to time.c. If RDTSCP is available, the MSRs are written with the respective
      values. It can be later used to initalize per-cpu timekeeping variables.
      
      AK: Some cleanups. Move externs into headers and fix CPU hotplug.
      Signed-off-by: NVojtech Pavlik <vojtech@suse.cz>
      Signed-off-by: NAndi Kleen <ak@suse.de>
      a670fad0
  10. 30 7月, 2006 1 次提交
  11. 29 7月, 2006 1 次提交
    • A
      [PATCH] i386/x86-64: Add user_mode checks to profile_pc for oprofile · d5a26017
      Andi Kleen 提交于
      Fixes a obscure user space triggerable crash during oprofiling.
      
      Oprofile calls profile_pc from NMIs even when user_mode(regs) is not true and
      the program counter is inside the kernel lock section. This opens
      a race - when a user program jumps to a kernel lock address and
      a NMI happens before the illegal page fault exception is raised
      and the program has a unmapped esp or ebp then the kernel could
      oops. NMIs have a higher priority than exceptions so that could
      happen.
      
      Add user_mode checks to i386/x86-64 profile_pc to prevent that.
      
      Cc: John Levon <levon@movementarian.org>
      Signed-off-by: NAndi Kleen <ak@suse.de>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      d5a26017
  12. 03 7月, 2006 1 次提交
  13. 27 6月, 2006 6 次提交
  14. 10 4月, 2006 2 次提交
  15. 01 4月, 2006 1 次提交
    • O
      [PATCH] Don't pass boot parameters to argv_init[] · 9b41046c
      OGAWA Hirofumi 提交于
      The boot cmdline is parsed in parse_early_param() and
      parse_args(,unknown_bootoption).
      
      And __setup() is used in obsolete_checksetup().
      
      	start_kernel()
      		-> parse_args()
      			-> unknown_bootoption()
      				-> obsolete_checksetup()
      
      If __setup()'s callback (->setup_func()) returns 1 in
      obsolete_checksetup(), obsolete_checksetup() thinks a parameter was
      handled.
      
      If ->setup_func() returns 0, obsolete_checksetup() tries other
      ->setup_func().  If all ->setup_func() that matched a parameter returns 0,
      a parameter is seted to argv_init[].
      
      Then, when runing /sbin/init or init=app, argv_init[] is passed to the app.
      If the app doesn't ignore those arguments, it will warning and exit.
      
      This patch fixes a wrong usage of it, however fixes obvious one only.
      Signed-off-by: NOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
      Signed-off-by: NAndrew Morton <akpm@osdl.org>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      9b41046c
  16. 29 3月, 2006 1 次提交
  17. 26 3月, 2006 4 次提交
  18. 22 3月, 2006 1 次提交
  19. 27 2月, 2006 1 次提交
    • A
      [PATCH] x86_64: Move the SMP time selection earlier · e8b91777
      Andi Kleen 提交于
      SMP time selection originally ran after all CPUs were brought up because
      it needed to know the number of CPUs to decide if it needs an MP safe
      timer or not.
      
      This is not needed anymore because we know present CPUs early.
      
      This fixes a couple of problems:
       - apicmaintimer didn't always work because it relied on state that was
         set up time_init_gtod too late.
       - The output for the used timer in early kernel log was misleading
         because time_init_gtod could actually change it later.  Now always
         print the final timer choice
      Signed-off-by: NAndi Kleen <ak@suse.de>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      e8b91777
  20. 18 2月, 2006 1 次提交
  21. 12 2月, 2006 1 次提交
    • C
      [PATCH] x86-64: Fix HPET timer on x460 · 33042a9f
      Chris McDermott 提交于
      [description from AK]
      
      The IBM Summit 3 chipset doesn't implement the HPET timer replacement
      option.  Since the current Linux code relies on it use a mixed mode with
      both PIT for the interrupt and HPET counters for the time keeping.  That
      was already implemented, but didn't work properly because it was still
      using the last interrupt offset in HPET.  This resulted in x460 not
      booting.  Fix this up by using the free running HPET counter.
      
      Shouldn't affect any other machine because they either use full HPET mode
      or no HPET at all.
      
      TBD needs a similar 32bit fix.
      Signed-off-by: NAndi Kleen <ak@suse.de>
      Cc: Pallipadi, Venkatesh" <venkatesh.pallipadi@intel.com>
      Cc: Bob Picco <bob.picco@hp.com>
      Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
      Cc: john stultz <johnstul@us.ibm.com>
      Signed-off-by: NAndrew Morton <akpm@osdl.org>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      33042a9f
  22. 08 2月, 2006 1 次提交
  23. 05 2月, 2006 2 次提交