1. 15 4月, 2017 1 次提交
    • N
      s390/time: Set ->min_delta_ticks and ->max_delta_ticks · 06c54611
      Nicolai Stange 提交于
      In preparation for making the clockevents core NTP correction aware,
      all clockevent device drivers must set ->min_delta_ticks and
      ->max_delta_ticks rather than ->min_delta_ns and ->max_delta_ns: a
      clockevent device's rate is going to change dynamically and thus, the
      ratio of ns to ticks ceases to stay invariant.
      
      Currently, the s390's CPU timer clockevent device is initialized as
      follows:
      
        cd->min_delta_ns    = 1;
        cd->max_delta_ns    = LONG_MAX;
      
      Note that the device's time to cycle conversion factor, i.e.
      cd->mult / (2^cd->shift), is approx. equal to 4.
      
      Hence, this would translate to
      
        cd->min_delta_ticks = 4;
        cd->max_delta_ticks = 4 * LONG_MAX;
      
      However, a minimum value of 1ns is in the range of noise anyway and the
      clockevent core will take care of this by increasing it to 1us or so.
      Furthermore, 4*LONG_MAX would overflow the unsigned long argument the
      clockevent devices gets programmed with.
      
      Thus, initialize ->min_delta_ticks with 1 and ->max_delta_ticks with
      ULONG_MAX.
      
      This patch alone doesn't introduce any change in functionality as the
      clockevents core still looks exclusively at the (untouched) ->min_delta_ns
      and ->max_delta_ns. As soon as this has changed, a followup patch will
      purge the initialization of ->min_delta_ns and ->max_delta_ns from this
      driver.
      
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
      Cc: Richard Cochran <richardcochran@gmail.com>
      Cc: Prarit Bhargava <prarit@redhat.com>
      Cc: Stephen Boyd <sboyd@codeaurora.org>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
      Cc: David Hildenbrand <dahi@linux.vnet.ibm.com>
      Cc: linux-s390@vger.kernel.org
      Signed-off-by: NNicolai Stange <nicstange@gmail.com>
      Signed-off-by: NJohn Stultz <john.stultz@linaro.org>
      06c54611
  2. 02 3月, 2017 1 次提交
  3. 17 2月, 2017 1 次提交
    • P
      s390: kernel: Audit and remove any unnecessary uses of module.h · 3994a52b
      Paul Gortmaker 提交于
      Historically a lot of these existed because we did not have
      a distinction between what was modular code and what was providing
      support to modules via EXPORT_SYMBOL and friends.  That changed
      when we forked out support for the latter into the export.h file.
      
      This means we should be able to reduce the usage of module.h
      in code that is obj-y Makefile or bool Kconfig.  The advantage
      in doing so is that module.h itself sources about 15 other headers;
      adding significantly to what we feed cpp, and it can obscure what
      headers we are effectively using.
      
      Since module.h was the source for init.h (for __init) and for
      export.h (for EXPORT_SYMBOL) we consider each change instance
      for the presence of either and replace as needed.  Build testing
      revealed some implicit header usage that was fixed up accordingly.
      Signed-off-by: NPaul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      3994a52b
  4. 07 2月, 2017 1 次提交
    • M
      s390/debug: make debug event time stamps relative to the boot TOD clock · ea417aa8
      Martin Schwidefsky 提交于
      The debug features currently uses absolute TOD time stamps for the
      debug events. Given that the TOD clock can jump forward and backward
      due to STP sync checks the order of debug events can get obfuscated.
      
      Replace the absolute TOD time stamps with a delta to the IPL time
      stamp. On a STP sync check the TOD clock correction is added to
      the IPL time stamp as well to make the deltas unaffected by STP
      sync check.
      
      The readout of the debug feature entries will convert the deltas
      back to absolute time stamps based on the Unix epoch.
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      ea417aa8
  5. 16 1月, 2017 1 次提交
  6. 25 12月, 2016 2 次提交
  7. 17 11月, 2016 1 次提交
  8. 28 10月, 2016 3 次提交
  9. 29 8月, 2016 4 次提交
  10. 13 6月, 2016 4 次提交
    • M
      s390/time: remove ETR support · fd5ada04
      Martin Schwidefsky 提交于
      The External-Time-Reference (ETR) clock synchronization interface has
      been superseded by Server-Time-Protocol (STP). Remove the outdated
      ETR interface.
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      fd5ada04
    • M
      s390/time: add leap seconds to initial system time · 936cc855
      Martin Schwidefsky 提交于
      The PTFF instruction can be used to retrieve information about UTC
      including the current number of leap seconds. Use this value to
      convert the coordinated server time value of the TOD clock to a
      proper UTC timestamp to initialize the system time. Without this
      correction the system time will be off by the number of leap seonds
      until it has been corrected via NTP.
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      936cc855
    • M
      s390/time: LPAR offset handling · 40277891
      Martin Schwidefsky 提交于
      It is possible to specify a user offset for the TOD clock, e.g. +2 hours.
      The TOD clock will carry this offset even if the clock is synchronized
      with STP. This makes the time stamps acquired with get_sync_clock()
      useless as another LPAR migth use a different TOD offset.
      
      Use the PTFF instrution to get the TOD epoch difference and subtract
      it from the TOD clock value to get a physical timestamp. As the epoch
      difference contains the sync check delta as well the LPAR offset value
      to the physical clock needs to be refreshed after each clock
      synchronization.
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      40277891
    • M
      s390/time: STP sync clock correction · 2f82f577
      Martin Schwidefsky 提交于
      The sync clock operation of the channel subsystem call for STP delivers
      the TOD clock difference as a result. Use this TOD clock difference
      instead of the difference between the TOD timestamps before and after
      the sync clock operation.
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      2f82f577
  11. 18 3月, 2016 1 次提交
  12. 07 3月, 2016 1 次提交
  13. 14 10月, 2015 1 次提交
  14. 10 8月, 2015 1 次提交
    • V
      s390/time: Migrate to new 'set-state' interface · 07aeed3f
      Viresh Kumar 提交于
      Migrate s390 driver to the new 'set-state' interface provided by
      clockevents core, the earlier 'set-mode' interface is marked obsolete
      now.
      
      This also enables us to implement callbacks for new states of clockevent
      devices, for example: ONESHOT_STOPPED.
      
      We weren't doing anything in the ->set_mode() callback. So, this patch
      doesn't provide any set-state callbacks.
      
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
      Cc: linux390@de.ibm.com
      Cc: linux-s390@vger.kernel.org
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      07aeed3f
  15. 04 8月, 2015 1 次提交
  16. 27 7月, 2015 1 次提交
  17. 23 5月, 2015 1 次提交
    • X
      s390: time: Provide read_boot_clock64() and read_persistent_clock64() · 689911c7
      Xunlei Pang 提交于
      As part of addressing the "y2038 problem" for in-kernel uses,
      this patch converts read_boot_clock() to read_boot_clock64()
      and read_persistent_clock() to read_persistent_clock64() using
      timespec64.
      
      Rename some instances of 'timespec' to 'timespec64' in time.c and
      related references
      
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
      Cc: linux390@de.ibm.com
      Signed-off-by: NXunlei Pang <pang.xunlei@linaro.org>
      [jstultz: Fixed minor style and grammer tweaks
       pointed out by Ingo]
      Signed-off-by: NJohn Stultz <john.stultz@linaro.org>
      689911c7
  18. 27 3月, 2015 1 次提交
  19. 13 3月, 2015 1 次提交
    • J
      clocksource: Mostly kill clocksource_register() · f8935983
      John Stultz 提交于
      A long running project has been to clean up remaining uses
      of clocksource_register(), replacing it with the simpler
      clocksource_register_khz/hz() functions.
      
      However, there are a few cases where we need to self-define
      our mult/shift values, so switch the function to a more
      obviously internal __clocksource_register() name, and
      consolidate much of the internal logic so we don't have
      duplication.
      Signed-off-by: NJohn Stultz <john.stultz@linaro.org>
      Cc: Dave Jones <davej@codemonkey.org.uk>
      Cc: David S. Miller <davem@davemloft.net>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Prarit Bhargava <prarit@redhat.com>
      Cc: Richard Cochran <richardcochran@gmail.com>
      Cc: Stephen Boyd <sboyd@codeaurora.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Link: http://lkml.kernel.org/r/1426133800-29329-10-git-send-email-john.stultz@linaro.org
      [ Minor cleanups. ]
      Signed-off-by: NIngo Molnar <mingo@kernel.org>
      f8935983
  20. 27 10月, 2014 1 次提交
  21. 09 9月, 2014 1 次提交
  22. 27 8月, 2014 1 次提交
    • C
      s390: Replace __get_cpu_var uses · eb7e7d76
      Christoph Lameter 提交于
      __get_cpu_var() is used for multiple purposes in the kernel source. One of
      them is address calculation via the form &__get_cpu_var(x).  This calculates
      the address for the instance of the percpu variable of the current processor
      based on an offset.
      
      Other use cases are for storing and retrieving data from the current
      processors percpu area.  __get_cpu_var() can be used as an lvalue when
      writing data or on the right side of an assignment.
      
      __get_cpu_var() is defined as :
      
      #define __get_cpu_var(var) (*this_cpu_ptr(&(var)))
      
      __get_cpu_var() always only does an address determination. However, store
      and retrieve operations could use a segment prefix (or global register on
      other platforms) to avoid the address calculation.
      
      this_cpu_write() and this_cpu_read() can directly take an offset into a
      percpu area and use optimized assembly code to read and write per cpu
      variables.
      
      This patch converts __get_cpu_var into either an explicit address
      calculation using this_cpu_ptr() or into a use of this_cpu operations that
      use the offset.  Thereby address calculations are avoided and less registers
      are used when code is generated.
      
      At the end of the patch set all uses of __get_cpu_var have been removed so
      the macro is removed too.
      
      The patch set includes passes over all arches as well. Once these operations
      are used throughout then specialized macros can be defined in non -x86
      arches as well in order to optimize per cpu access by f.e.  using a global
      register that may be set to the per cpu base.
      
      Transformations done to __get_cpu_var()
      
      1. Determine the address of the percpu instance of the current processor.
      
      	DEFINE_PER_CPU(int, y);
      	int *x = &__get_cpu_var(y);
      
          Converts to
      
      	int *x = this_cpu_ptr(&y);
      
      2. Same as #1 but this time an array structure is involved.
      
      	DEFINE_PER_CPU(int, y[20]);
      	int *x = __get_cpu_var(y);
      
          Converts to
      
      	int *x = this_cpu_ptr(y);
      
      3. Retrieve the content of the current processors instance of a per cpu
      variable.
      
      	DEFINE_PER_CPU(int, y);
      	int x = __get_cpu_var(y)
      
         Converts to
      
      	int x = __this_cpu_read(y);
      
      4. Retrieve the content of a percpu struct
      
      	DEFINE_PER_CPU(struct mystruct, y);
      	struct mystruct x = __get_cpu_var(y);
      
         Converts to
      
      	memcpy(&x, this_cpu_ptr(&y), sizeof(x));
      
      5. Assignment to a per cpu variable
      
      	DEFINE_PER_CPU(int, y)
      	__get_cpu_var(y) = x;
      
         Converts to
      
      	this_cpu_write(y, x);
      
      6. Increment/Decrement etc of a per cpu variable
      
      	DEFINE_PER_CPU(int, y);
      	__get_cpu_var(y)++
      
         Converts to
      
      	this_cpu_inc(y)
      
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      CC: linux390@de.ibm.com
      Acked-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
      Signed-off-by: NChristoph Lameter <cl@linux.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      eb7e7d76
  23. 24 7月, 2014 2 次提交
  24. 27 5月, 2014 1 次提交
  25. 03 4月, 2014 1 次提交
  26. 25 11月, 2013 2 次提交
  27. 28 8月, 2013 1 次提交
  28. 14 2月, 2013 1 次提交
  29. 31 1月, 2013 1 次提交
    • H
      s390/timer: avoid overflow when programming clock comparator · d911e03d
      Heiko Carstens 提交于
      Since ed4f2094 "s390/time: fix sched_clock() overflow" a new helper function
      is used to avoid overflows when converting TOD format values to nanosecond
      values.
      The kvm interrupt code formerly however only worked by accident because of
      an overflow. It tried to program a timer that would expire in more than ~29
      years. Because of the old TOD-to-nanoseconds overflow bug the real expiry
      value however was much smaller, but now it isn't anymore.
      This however triggers yet another bug in the function that programs the clock
      comparator s390_next_ktime(): if the absolute "expires" value is after 2042
      this will result in an overflow and the programmed value is lower than the
      current TOD value which immediatly triggers a clock comparator (= timer)
      interrupt.
      Since the timer isn't expired it will be programmed immediately again and so
      on... the result is a dead system.
      To fix this simply program the maximum possible value if an overflow is
      detected.
      Reported-by: NChristian Borntraeger <borntraeger@de.ibm.com>
      Tested-by: NChristian Borntraeger <borntraeger@de.ibm.com>
      Cc: stable@vger.kernel.org # v3.3+
      Signed-off-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
      d911e03d