Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Mar 2016 04:38:27 +0000 (21:38 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Mar 2016 04:38:27 +0000 (21:38 -0700)
Pull trivial tree updates from Jiri Kosina.

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial:
  drivers/rtc: broken link fix
  drm/i915 Fix typos in i915_gem_fence.c
  Docs: fix missing word in REPORTING-BUGS
  lib+mm: fix few spelling mistakes
  MAINTAINERS: add git URL for APM driver
  treewide: Fix typo in printk

1  2 
drivers/gpu/drm/i915/i915_gem_fence.c
drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c
drivers/rtc/rtc-rx8025.c
drivers/usb/gadget/legacy/Kconfig
kernel/time/timekeeping.c
lib/842/842_decompress.c
mm/balloon_compaction.c
net/openvswitch/vport-geneve.c

index 598198543dcdbd303d9e77749009a5e922fea3f1,6f7249b00d4c4a83666517fc8222c26e782536a9..a2b938ec01a7ca6d4854a83213c56aa3f02f35ef
@@@ -34,8 -34,8 +34,8 @@@
   * set of these objects.
   *
   * Fences are used to detile GTT memory mappings. They're also connected to the
-  * hardware frontbuffer render tracking and hence interract with frontbuffer
-  * conmpression. Furthermore on older platforms fences are required for tiled
+  * hardware frontbuffer render tracking and hence interact with frontbuffer
+  * compression. Furthermore on older platforms fences are required for tiled
   * objects used by the display engine. They can also be used by the render
   * engine - they're required for blitter commands and are optional for render
   * commands. But on gen4+ both display (with the exception of fbc) and rendering
@@@ -46,8 -46,8 +46,8 @@@
   *
   * Finally note that because fences are such a restricted resource they're
   * dynamically associated with objects. Furthermore fence state is committed to
-  * the hardware lazily to avoid unecessary stalls on gen2/3. Therefore code must
-  * explictly call i915_gem_object_get_fence() to synchronize fencing status
+  * the hardware lazily to avoid unnecessary stalls on gen2/3. Therefore code must
+  * explicitly call i915_gem_object_get_fence() to synchronize fencing status
   * for cpu access. Also note that some code wants an unfenced view, for those
   * cases the fence can be removed forcefully with i915_gem_object_put_fence().
   *
@@@ -59,19 -59,19 +59,19 @@@ static void i965_write_fence_reg(struc
                                 struct drm_i915_gem_object *obj)
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      int fence_reg;
 +      i915_reg_t fence_reg_lo, fence_reg_hi;
        int fence_pitch_shift;
  
        if (INTEL_INFO(dev)->gen >= 6) {
 -              fence_reg = FENCE_REG_SANDYBRIDGE_0;
 -              fence_pitch_shift = SANDYBRIDGE_FENCE_PITCH_SHIFT;
 +              fence_reg_lo = FENCE_REG_GEN6_LO(reg);
 +              fence_reg_hi = FENCE_REG_GEN6_HI(reg);
 +              fence_pitch_shift = GEN6_FENCE_PITCH_SHIFT;
        } else {
 -              fence_reg = FENCE_REG_965_0;
 +              fence_reg_lo = FENCE_REG_965_LO(reg);
 +              fence_reg_hi = FENCE_REG_965_HI(reg);
                fence_pitch_shift = I965_FENCE_PITCH_SHIFT;
        }
  
 -      fence_reg += reg * 8;
 -
        /* To w/a incoherency with non-atomic 64-bit register updates,
         * we split the 64-bit update into two 32-bit writes. In order
         * for a partial fence not to be evaluated between writes, we
@@@ -81,8 -81,8 +81,8 @@@
         * For extra levels of paranoia, we make sure each step lands
         * before applying the next step.
         */
 -      I915_WRITE(fence_reg, 0);
 -      POSTING_READ(fence_reg);
 +      I915_WRITE(fence_reg_lo, 0);
 +      POSTING_READ(fence_reg_lo);
  
        if (obj) {
                u32 size = i915_gem_obj_ggtt_size(obj);
                        val |= 1 << I965_FENCE_TILING_Y_SHIFT;
                val |= I965_FENCE_REG_VALID;
  
 -              I915_WRITE(fence_reg + 4, val >> 32);
 -              POSTING_READ(fence_reg + 4);
 +              I915_WRITE(fence_reg_hi, val >> 32);
 +              POSTING_READ(fence_reg_hi);
  
 -              I915_WRITE(fence_reg + 0, val);
 -              POSTING_READ(fence_reg);
 +              I915_WRITE(fence_reg_lo, val);
 +              POSTING_READ(fence_reg_lo);
        } else {
 -              I915_WRITE(fence_reg + 4, 0);
 -              POSTING_READ(fence_reg + 4);
 +              I915_WRITE(fence_reg_hi, 0);
 +              POSTING_READ(fence_reg_hi);
        }
  }
  
@@@ -128,7 -128,7 +128,7 @@@ static void i915_write_fence_reg(struc
                WARN((i915_gem_obj_ggtt_offset(obj) & ~I915_FENCE_START_MASK) ||
                     (size & -size) != size ||
                     (i915_gem_obj_ggtt_offset(obj) & (size - 1)),
 -                   "object 0x%08lx [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
 +                   "object 0x%08llx [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
                     i915_gem_obj_ggtt_offset(obj), obj->map_and_fenceable, size);
  
                if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
        } else
                val = 0;
  
 -      if (reg < 8)
 -              reg = FENCE_REG_830_0 + reg * 4;
 -      else
 -              reg = FENCE_REG_945_8 + (reg - 8) * 4;
 -
 -      I915_WRITE(reg, val);
 -      POSTING_READ(reg);
 +      I915_WRITE(FENCE_REG(reg), val);
 +      POSTING_READ(FENCE_REG(reg));
  }
  
  static void i830_write_fence_reg(struct drm_device *dev, int reg,
                WARN((i915_gem_obj_ggtt_offset(obj) & ~I830_FENCE_START_MASK) ||
                     (size & -size) != size ||
                     (i915_gem_obj_ggtt_offset(obj) & (size - 1)),
 -                   "object 0x%08lx not 512K or pot-size 0x%08x aligned\n",
 +                   "object 0x%08llx not 512K or pot-size 0x%08x aligned\n",
                     i915_gem_obj_ggtt_offset(obj), size);
  
                pitch_val = obj->stride / 128;
        } else
                val = 0;
  
 -      I915_WRITE(FENCE_REG_830_0 + reg * 4, val);
 -      POSTING_READ(FENCE_REG_830_0 + reg * 4);
 +      I915_WRITE(FENCE_REG(reg), val);
 +      POSTING_READ(FENCE_REG(reg));
  }
  
  inline static bool i915_gem_object_needs_mb(struct drm_i915_gem_object *obj)
@@@ -317,7 -322,7 +317,7 @@@ i915_find_fence_reg(struct drm_device *
  
        /* First try to find a free reg */
        avail = NULL;
 -      for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
 +      for (i = 0; i < dev_priv->num_fence_regs; i++) {
                reg = &dev_priv->fence_regs[i];
                if (!reg->obj)
                        return reg;
@@@ -527,7 -532,7 +527,7 @@@ void i915_gem_restore_fences(struct drm
   * required.
   *
   * When bit 17 is XORed in, we simply refuse to tile at all.  Bit
-  * 17 is not just a page offset, so as we page an objet out and back in,
+  * 17 is not just a page offset, so as we page an object out and back in,
   * individual pages in it will have different bit 17 addresses, resulting in
   * each 64 bytes being swapped with its neighbor!
   *
@@@ -642,10 -647,11 +642,10 @@@ i915_gem_detect_bit_6_swizzle(struct dr
                }
  
                /* check for L-shaped memory aka modified enhanced addressing */
 -              if (IS_GEN4(dev)) {
 -                      uint32_t ddc2 = I915_READ(DCC2);
 -
 -                      if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE))
 -                              dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES;
 +              if (IS_GEN4(dev) &&
 +                  !(I915_READ(DCC2) & DCC2_MODIFIED_ENHANCED_DISABLE)) {
 +                      swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN;
 +                      swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN;
                }
  
                if (dcc == 0xffffffff) {
                 * matching, which was the case for the swizzling required in
                 * the table above, or from the 1-ch value being less than
                 * the minimum size of a rank.
 +               *
 +               * Reports indicate that the swizzling actually
 +               * varies depending upon page placement inside the
 +               * channels, i.e. we see swizzled pages where the
 +               * banks of memory are paired and unswizzled on the
 +               * uneven portion, so leave that as unknown.
                 */
 -              if (I915_READ16(C0DRB3) != I915_READ16(C1DRB3)) {
 -                      swizzle_x = I915_BIT_6_SWIZZLE_NONE;
 -                      swizzle_y = I915_BIT_6_SWIZZLE_NONE;
 -              } else {
 +              if (I915_READ16(C0DRB3) == I915_READ16(C1DRB3)) {
                        swizzle_x = I915_BIT_6_SWIZZLE_9_10;
                        swizzle_y = I915_BIT_6_SWIZZLE_9;
                }
        }
  
 +      if (swizzle_x == I915_BIT_6_SWIZZLE_UNKNOWN ||
 +          swizzle_y == I915_BIT_6_SWIZZLE_UNKNOWN) {
 +              /* Userspace likes to explode if it sees unknown swizzling,
 +               * so lie. We will finish the lie when reporting through
 +               * the get-tiling-ioctl by reporting the physical swizzle
 +               * mode as unknown instead.
 +               *
 +               * As we don't strictly know what the swizzling is, it may be
 +               * bit17 dependent, and so we need to also prevent the pages
 +               * from being moved.
 +               */
 +              dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES;
 +              swizzle_x = I915_BIT_6_SWIZZLE_NONE;
 +              swizzle_y = I915_BIT_6_SWIZZLE_NONE;
 +      }
 +
        dev_priv->mm.bit_6_swizzle_x = swizzle_x;
        dev_priv->mm.bit_6_swizzle_y = swizzle_y;
  }
index 5f44b66ccb86481774733960b3577e83fcdfabc0,704d0874411676c22e84e162c0d092d4e3ec2e66..5b0248adf4ce661a3088673afa3683cf486130e4
@@@ -64,7 -64,7 +64,7 @@@ const char *usnic_ib_qp_grp_state_to_st
        case IB_QPS_ERR:
                return "ERR";
        default:
-               return "UNKOWN STATE";
+               return "UNKNOWN STATE";
  
        }
  }
@@@ -236,8 -236,8 +236,8 @@@ create_roce_custom_flow(struct usnic_ib
  
        /* Create Flow Handle */
        qp_flow = kzalloc(sizeof(*qp_flow), GFP_ATOMIC);
 -      if (IS_ERR_OR_NULL(qp_flow)) {
 -              err = qp_flow ? PTR_ERR(qp_flow) : -ENOMEM;
 +      if (!qp_flow) {
 +              err = -ENOMEM;
                goto out_dealloc_flow;
        }
        qp_flow->flow = flow;
@@@ -311,8 -311,8 +311,8 @@@ create_udp_flow(struct usnic_ib_qp_grp 
  
        /* Create qp_flow */
        qp_flow = kzalloc(sizeof(*qp_flow), GFP_ATOMIC);
 -      if (IS_ERR_OR_NULL(qp_flow)) {
 -              err = qp_flow ? PTR_ERR(qp_flow) : -ENOMEM;
 +      if (!qp_flow) {
 +              err = -ENOMEM;
                goto out_dealloc_flow;
        }
        qp_flow->flow = flow;
@@@ -521,7 -521,7 +521,7 @@@ int usnic_ib_qp_grp_modify(struct usnic
  
        if (!status) {
                qp_grp->state = new_state;
 -              usnic_info("Transistioned %u from %s to %s",
 +              usnic_info("Transitioned %u from %s to %s",
                qp_grp->grp_id,
                usnic_ib_qp_grp_state_to_string(old_state),
                usnic_ib_qp_grp_state_to_string(new_state));
@@@ -575,7 -575,7 +575,7 @@@ alloc_res_chunk_list(struct usnic_vnic 
        return res_chunk_list;
  
  out_free_res:
 -      for (i--; i > 0; i--)
 +      for (i--; i >= 0; i--)
                usnic_vnic_put_resources(res_chunk_list[i]);
        kfree(res_chunk_list);
        return ERR_PTR(err);
diff --combined drivers/rtc/rtc-rx8025.c
index b69647e0be235bd5de1356de7c00d05485a39f5b,5c2e9bcec091bf20f32f7c2b7f550103f543da0f..9f105efbc5464815717f1a9bf622e947cabebbe2
@@@ -7,7 -7,7 +7,7 @@@
   * All rights reserved.
   *
   * Modified by fengjh at rising.com.cn
-  * <http://lists.lm-sensors.org/mailman/listinfo/lm-sensors>
+  * <lm-sensors@lm-sensors.org>
   * 2006.11
   *
   * Code cleanup by Sergei Poselenov, <sposelenov@emcraft.com>
@@@ -146,10 -146,8 +146,10 @@@ static irqreturn_t rx8025_handle_irq(in
  {
        struct i2c_client *client = dev_id;
        struct rx8025_data *rx8025 = i2c_get_clientdata(client);
 +      struct mutex *lock = &rx8025->rtc->ops_lock;
        int status;
  
 +      mutex_lock(lock);
        status = rx8025_read_reg(client, RX8025_REG_CTRL2);
        if (status < 0)
                goto out;
        }
  
  out:
 +      mutex_unlock(lock);
 +
        return IRQ_HANDLED;
  }
  
@@@ -344,17 -340,7 +344,17 @@@ static int rx8025_set_alarm(struct devi
        if (client->irq <= 0)
                return -EINVAL;
  
 -      /* Hardware alarm precision is 1 minute! */
 +      /*
 +       * Hardware alarm precision is 1 minute!
 +       * round up to nearest minute
 +       */
 +      if (t->time.tm_sec) {
 +              time64_t alarm_time = rtc_tm_to_time64(&t->time);
 +
 +              alarm_time += 60 - t->time.tm_sec;
 +              rtc_time64_to_tm(alarm_time, &t->time);
 +      }
 +
        ald[0] = bin2bcd(t->time.tm_min);
        if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224)
                ald[1] = bin2bcd(t->time.tm_hour);
@@@ -532,8 -518,9 +532,8 @@@ static int rx8025_probe(struct i2c_clie
        }
  
        rx8025 = devm_kzalloc(&client->dev, sizeof(*rx8025), GFP_KERNEL);
 -      if (!rx8025) {
 +      if (!rx8025)
                return -ENOMEM;
 -      }
  
        rx8025->client = client;
        i2c_set_clientdata(client, rx8025);
        if (client->irq > 0) {
                dev_info(&client->dev, "IRQ %d supplied\n", client->irq);
                err = devm_request_threaded_irq(&client->dev, client->irq, NULL,
 -                                              rx8025_handle_irq, 0, "rx8025",
 -                                              client);
 +                                              rx8025_handle_irq,
 +                                              IRQF_ONESHOT,
 +                                              "rx8025", client);
                if (err) {
                        dev_err(&client->dev, "unable to request IRQ, alarms disabled\n");
                        client->irq = 0;
  
        rx8025->rtc->max_user_freq = 1;
  
 +      /* the rx8025 alarm only supports a minute accuracy */
 +      rx8025->rtc->uie_unsupported = 1;
 +
        err = rx8025_sysfs_register(&client->dev);
        return err;
  }
index a23d1b90454c4f106436510c05b67ef10438e069,fb1cdd9af4721ebdc3bddf241416c99e78884ac2..0b36878eb5fdd30231284b8ba99a7f508f6af12c
@@@ -103,8 -103,7 +103,7 @@@ config USB_ET
           - CDC Ethernet Emulation Model (EEM) is a newer standard that has
             a simpler interface that can be used by more USB hardware.
  
-         RNDIS support is an additional option, more demanding than than
-         subset.
+         RNDIS support is an additional option, more demanding than subset.
  
          Within the USB device, this gadget driver exposes a network device
          "usbX", where X depends on what other networking devices you have.
@@@ -250,7 -249,6 +249,7 @@@ config USB_GADGET_TARGE
        tristate "USB Gadget Target Fabric Module"
        depends on TARGET_CORE
        select USB_LIBCOMPOSITE
 +      select USB_F_TCM
        help
          This fabric is an USB gadget. Two USB protocols are supported that is
          BBB or BOT (Bulk Only Transport) and UAS (USB Attached SCSI). BOT is
index 9c629bbed572b0cbe6710a936af5fbc52440cb03,0d4cc7601df7649909ecb2b6b9c627b9b40b5bbe..479d25cd3d4ffc53f75c5d29912df312f609bbb1
@@@ -131,7 -131,7 +131,7 @@@ static void timekeeping_check_update(st
                printk_deferred("         timekeeping: Your kernel is sick, but tries to cope by capping time updates\n");
        } else {
                if (offset > (max_cycles >> 1)) {
-                       printk_deferred("INFO: timekeeping: Cycle offset (%lld) is larger than the the '%s' clock's 50%% safety margin (%lld)\n",
+                       printk_deferred("INFO: timekeeping: Cycle offset (%lld) is larger than the '%s' clock's 50%% safety margin (%lld)\n",
                                        offset, name, max_cycles >> 1);
                        printk_deferred("      timekeeping: Your kernel is still fine, but is feeling a bit nervous\n");
                }
@@@ -233,7 -233,6 +233,7 @@@ static void tk_setup_internals(struct t
        u64 tmp, ntpinterval;
        struct clocksource *old_clock;
  
 +      ++tk->cs_was_changed_seq;
        old_clock = tk->tkr_mono.clock;
        tk->tkr_mono.clock = clock;
        tk->tkr_mono.read = clock->read;
@@@ -299,11 -298,13 +299,11 @@@ u32 (*arch_gettimeoffset)(void) = defau
  static inline u32 arch_gettimeoffset(void) { return 0; }
  #endif
  
 -static inline s64 timekeeping_get_ns(struct tk_read_base *tkr)
 +static inline s64 timekeeping_delta_to_ns(struct tk_read_base *tkr,
 +                                        cycle_t delta)
  {
 -      cycle_t delta;
        s64 nsec;
  
 -      delta = timekeeping_get_delta(tkr);
 -
        nsec = delta * tkr->mult + tkr->xtime_nsec;
        nsec >>= tkr->shift;
  
        return nsec + arch_gettimeoffset();
  }
  
 +static inline s64 timekeeping_get_ns(struct tk_read_base *tkr)
 +{
 +      cycle_t delta;
 +
 +      delta = timekeeping_get_delta(tkr);
 +      return timekeeping_delta_to_ns(tkr, delta);
 +}
 +
 +static inline s64 timekeeping_cycles_to_ns(struct tk_read_base *tkr,
 +                                          cycle_t cycles)
 +{
 +      cycle_t delta;
 +
 +      /* calculate the delta since the last update_wall_time */
 +      delta = clocksource_delta(cycles, tkr->cycle_last, tkr->mask);
 +      return timekeeping_delta_to_ns(tkr, delta);
 +}
 +
  /**
   * update_fast_timekeeper - Update the fast and NMI safe monotonic timekeeper.
   * @tkr: Timekeeping readout base from which we take the update
@@@ -863,274 -846,43 +863,274 @@@ time64_t ktime_get_real_seconds(void
  }
  EXPORT_SYMBOL_GPL(ktime_get_real_seconds);
  
 -#ifdef CONFIG_NTP_PPS
 +/**
 + * __ktime_get_real_seconds - The same as ktime_get_real_seconds
 + * but without the sequence counter protect. This internal function
 + * is called just when timekeeping lock is already held.
 + */
 +time64_t __ktime_get_real_seconds(void)
 +{
 +      struct timekeeper *tk = &tk_core.timekeeper;
 +
 +      return tk->xtime_sec;
 +}
  
  /**
 - * ktime_get_raw_and_real_ts64 - get day and raw monotonic time in timespec format
 - * @ts_raw:   pointer to the timespec to be set to raw monotonic time
 - * @ts_real:  pointer to the timespec to be set to the time of day
 - *
 - * This function reads both the time of day and raw monotonic time at the
 - * same time atomically and stores the resulting timestamps in timespec
 - * format.
 + * ktime_get_snapshot - snapshots the realtime/monotonic raw clocks with counter
 + * @systime_snapshot: pointer to struct receiving the system time snapshot
   */
 -void ktime_get_raw_and_real_ts64(struct timespec64 *ts_raw, struct timespec64 *ts_real)
 +void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot)
  {
        struct timekeeper *tk = &tk_core.timekeeper;
        unsigned long seq;
 -      s64 nsecs_raw, nsecs_real;
 +      ktime_t base_raw;
 +      ktime_t base_real;
 +      s64 nsec_raw;
 +      s64 nsec_real;
 +      cycle_t now;
  
        WARN_ON_ONCE(timekeeping_suspended);
  
        do {
                seq = read_seqcount_begin(&tk_core.seq);
  
 -              *ts_raw = tk->raw_time;
 -              ts_real->tv_sec = tk->xtime_sec;
 -              ts_real->tv_nsec = 0;
 +              now = tk->tkr_mono.read(tk->tkr_mono.clock);
 +              systime_snapshot->cs_was_changed_seq = tk->cs_was_changed_seq;
 +              systime_snapshot->clock_was_set_seq = tk->clock_was_set_seq;
 +              base_real = ktime_add(tk->tkr_mono.base,
 +                                    tk_core.timekeeper.offs_real);
 +              base_raw = tk->tkr_raw.base;
 +              nsec_real = timekeeping_cycles_to_ns(&tk->tkr_mono, now);
 +              nsec_raw  = timekeeping_cycles_to_ns(&tk->tkr_raw, now);
 +      } while (read_seqcount_retry(&tk_core.seq, seq));
 +
 +      systime_snapshot->cycles = now;
 +      systime_snapshot->real = ktime_add_ns(base_real, nsec_real);
 +      systime_snapshot->raw = ktime_add_ns(base_raw, nsec_raw);
 +}
 +EXPORT_SYMBOL_GPL(ktime_get_snapshot);
  
 -              nsecs_raw  = timekeeping_get_ns(&tk->tkr_raw);
 -              nsecs_real = timekeeping_get_ns(&tk->tkr_mono);
 +/* Scale base by mult/div checking for overflow */
 +static int scale64_check_overflow(u64 mult, u64 div, u64 *base)
 +{
 +      u64 tmp, rem;
  
 -      } while (read_seqcount_retry(&tk_core.seq, seq));
 +      tmp = div64_u64_rem(*base, div, &rem);
  
 -      timespec64_add_ns(ts_raw, nsecs_raw);
 -      timespec64_add_ns(ts_real, nsecs_real);
 +      if (((int)sizeof(u64)*8 - fls64(mult) < fls64(tmp)) ||
 +          ((int)sizeof(u64)*8 - fls64(mult) < fls64(rem)))
 +              return -EOVERFLOW;
 +      tmp *= mult;
 +      rem *= mult;
 +
 +      do_div(rem, div);
 +      *base = tmp + rem;
 +      return 0;
  }
 -EXPORT_SYMBOL(ktime_get_raw_and_real_ts64);
  
 -#endif /* CONFIG_NTP_PPS */
 +/**
 + * adjust_historical_crosststamp - adjust crosstimestamp previous to current interval
 + * @history:                  Snapshot representing start of history
 + * @partial_history_cycles:   Cycle offset into history (fractional part)
 + * @total_history_cycles:     Total history length in cycles
 + * @discontinuity:            True indicates clock was set on history period
 + * @ts:                               Cross timestamp that should be adjusted using
 + *    partial/total ratio
 + *
 + * Helper function used by get_device_system_crosststamp() to correct the
 + * crosstimestamp corresponding to the start of the current interval to the
 + * system counter value (timestamp point) provided by the driver. The
 + * total_history_* quantities are the total history starting at the provided
 + * reference point and ending at the start of the current interval. The cycle
 + * count between the driver timestamp point and the start of the current
 + * interval is partial_history_cycles.
 + */
 +static int adjust_historical_crosststamp(struct system_time_snapshot *history,
 +                                       cycle_t partial_history_cycles,
 +                                       cycle_t total_history_cycles,
 +                                       bool discontinuity,
 +                                       struct system_device_crosststamp *ts)
 +{
 +      struct timekeeper *tk = &tk_core.timekeeper;
 +      u64 corr_raw, corr_real;
 +      bool interp_forward;
 +      int ret;
 +
 +      if (total_history_cycles == 0 || partial_history_cycles == 0)
 +              return 0;
 +
 +      /* Interpolate shortest distance from beginning or end of history */
 +      interp_forward = partial_history_cycles > total_history_cycles/2 ?
 +              true : false;
 +      partial_history_cycles = interp_forward ?
 +              total_history_cycles - partial_history_cycles :
 +              partial_history_cycles;
 +
 +      /*
 +       * Scale the monotonic raw time delta by:
 +       *      partial_history_cycles / total_history_cycles
 +       */
 +      corr_raw = (u64)ktime_to_ns(
 +              ktime_sub(ts->sys_monoraw, history->raw));
 +      ret = scale64_check_overflow(partial_history_cycles,
 +                                   total_history_cycles, &corr_raw);
 +      if (ret)
 +              return ret;
 +
 +      /*
 +       * If there is a discontinuity in the history, scale monotonic raw
 +       *      correction by:
 +       *      mult(real)/mult(raw) yielding the realtime correction
 +       * Otherwise, calculate the realtime correction similar to monotonic
 +       *      raw calculation
 +       */
 +      if (discontinuity) {
 +              corr_real = mul_u64_u32_div
 +                      (corr_raw, tk->tkr_mono.mult, tk->tkr_raw.mult);
 +      } else {
 +              corr_real = (u64)ktime_to_ns(
 +                      ktime_sub(ts->sys_realtime, history->real));
 +              ret = scale64_check_overflow(partial_history_cycles,
 +                                           total_history_cycles, &corr_real);
 +              if (ret)
 +                      return ret;
 +      }
 +
 +      /* Fixup monotonic raw and real time time values */
 +      if (interp_forward) {
 +              ts->sys_monoraw = ktime_add_ns(history->raw, corr_raw);
 +              ts->sys_realtime = ktime_add_ns(history->real, corr_real);
 +      } else {
 +              ts->sys_monoraw = ktime_sub_ns(ts->sys_monoraw, corr_raw);
 +              ts->sys_realtime = ktime_sub_ns(ts->sys_realtime, corr_real);
 +      }
 +
 +      return 0;
 +}
 +
 +/*
 + * cycle_between - true if test occurs chronologically between before and after
 + */
 +static bool cycle_between(cycle_t before, cycle_t test, cycle_t after)
 +{
 +      if (test > before && test < after)
 +              return true;
 +      if (test < before && before > after)
 +              return true;
 +      return false;
 +}
 +
 +/**
 + * get_device_system_crosststamp - Synchronously capture system/device timestamp
 + * @get_time_fn:      Callback to get simultaneous device time and
 + *    system counter from the device driver
 + * @ctx:              Context passed to get_time_fn()
 + * @history_begin:    Historical reference point used to interpolate system
 + *    time when counter provided by the driver is before the current interval
 + * @xtstamp:          Receives simultaneously captured system and device time
 + *
 + * Reads a timestamp from a device and correlates it to system time
 + */
 +int get_device_system_crosststamp(int (*get_time_fn)
 +                                (ktime_t *device_time,
 +                                 struct system_counterval_t *sys_counterval,
 +                                 void *ctx),
 +                                void *ctx,
 +                                struct system_time_snapshot *history_begin,
 +                                struct system_device_crosststamp *xtstamp)
 +{
 +      struct system_counterval_t system_counterval;
 +      struct timekeeper *tk = &tk_core.timekeeper;
 +      cycle_t cycles, now, interval_start;
 +      unsigned int clock_was_set_seq = 0;
 +      ktime_t base_real, base_raw;
 +      s64 nsec_real, nsec_raw;
 +      u8 cs_was_changed_seq;
 +      unsigned long seq;
 +      bool do_interp;
 +      int ret;
 +
 +      do {
 +              seq = read_seqcount_begin(&tk_core.seq);
 +              /*
 +               * Try to synchronously capture device time and a system
 +               * counter value calling back into the device driver
 +               */
 +              ret = get_time_fn(&xtstamp->device, &system_counterval, ctx);
 +              if (ret)
 +                      return ret;
 +
 +              /*
 +               * Verify that the clocksource associated with the captured
 +               * system counter value is the same as the currently installed
 +               * timekeeper clocksource
 +               */
 +              if (tk->tkr_mono.clock != system_counterval.cs)
 +                      return -ENODEV;
 +              cycles = system_counterval.cycles;
 +
 +              /*
 +               * Check whether the system counter value provided by the
 +               * device driver is on the current timekeeping interval.
 +               */
 +              now = tk->tkr_mono.read(tk->tkr_mono.clock);
 +              interval_start = tk->tkr_mono.cycle_last;
 +              if (!cycle_between(interval_start, cycles, now)) {
 +                      clock_was_set_seq = tk->clock_was_set_seq;
 +                      cs_was_changed_seq = tk->cs_was_changed_seq;
 +                      cycles = interval_start;
 +                      do_interp = true;
 +              } else {
 +                      do_interp = false;
 +              }
 +
 +              base_real = ktime_add(tk->tkr_mono.base,
 +                                    tk_core.timekeeper.offs_real);
 +              base_raw = tk->tkr_raw.base;
 +
 +              nsec_real = timekeeping_cycles_to_ns(&tk->tkr_mono,
 +                                                   system_counterval.cycles);
 +              nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw,
 +                                                  system_counterval.cycles);
 +      } while (read_seqcount_retry(&tk_core.seq, seq));
 +
 +      xtstamp->sys_realtime = ktime_add_ns(base_real, nsec_real);
 +      xtstamp->sys_monoraw = ktime_add_ns(base_raw, nsec_raw);
 +
 +      /*
 +       * Interpolate if necessary, adjusting back from the start of the
 +       * current interval
 +       */
 +      if (do_interp) {
 +              cycle_t partial_history_cycles, total_history_cycles;
 +              bool discontinuity;
 +
 +              /*
 +               * Check that the counter value occurs after the provided
 +               * history reference and that the history doesn't cross a
 +               * clocksource change
 +               */
 +              if (!history_begin ||
 +                  !cycle_between(history_begin->cycles,
 +                                 system_counterval.cycles, cycles) ||
 +                  history_begin->cs_was_changed_seq != cs_was_changed_seq)
 +                      return -EINVAL;
 +              partial_history_cycles = cycles - system_counterval.cycles;
 +              total_history_cycles = cycles - history_begin->cycles;
 +              discontinuity =
 +                      history_begin->clock_was_set_seq != clock_was_set_seq;
 +
 +              ret = adjust_historical_crosststamp(history_begin,
 +                                                  partial_history_cycles,
 +                                                  total_history_cycles,
 +                                                  discontinuity, xtstamp);
 +              if (ret)
 +                      return ret;
 +      }
 +
 +      return 0;
 +}
 +EXPORT_SYMBOL_GPL(get_device_system_crosststamp);
  
  /**
   * do_gettimeofday - Returns the time of day in a timeval
@@@ -1207,7 -959,7 +1207,7 @@@ int timekeeping_inject_offset(struct ti
        struct timespec64 ts64, tmp;
        int ret = 0;
  
 -      if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
 +      if (!timespec_inject_offset_valid(ts))
                return -EINVAL;
  
        ts64 = timespec_to_timespec64(*ts);
@@@ -1840,12 -1592,9 +1840,12 @@@ static __always_inline void timekeeping
  {
        s64 interval = tk->cycle_interval;
        s64 xinterval = tk->xtime_interval;
 +      u32 base = tk->tkr_mono.clock->mult;
 +      u32 max = tk->tkr_mono.clock->maxadj;
 +      u32 cur_adj = tk->tkr_mono.mult;
        s64 tick_error;
        bool negative;
 -      u32 adj;
 +      u32 adj_scale;
  
        /* Remove any current error adj from freq calculation */
        if (tk->ntp_err_mult)
        /* preserve the direction of correction */
        negative = (tick_error < 0);
  
 -      /* Sort out the magnitude of the correction */
 -      tick_error = abs64(tick_error);
 -      for (adj = 0; tick_error > interval; adj++)
 +      /* If any adjustment would pass the max, just return */
 +      if (negative && (cur_adj - 1) <= (base - max))
 +              return;
 +      if (!negative && (cur_adj + 1) >= (base + max))
 +              return;
 +      /*
 +       * Sort out the magnitude of the correction, but
 +       * avoid making so large a correction that we go
 +       * over the max adjustment.
 +       */
 +      adj_scale = 0;
 +      tick_error = abs(tick_error);
 +      while (tick_error > interval) {
 +              u32 adj = 1 << (adj_scale + 1);
 +
 +              /* Check if adjustment gets us within 1 unit from the max */
 +              if (negative && (cur_adj - adj) <= (base - max))
 +                      break;
 +              if (!negative && (cur_adj + adj) >= (base + max))
 +                      break;
 +
 +              adj_scale++;
                tick_error >>= 1;
 +      }
  
        /* scale the corrections */
 -      timekeeping_apply_adjustment(tk, offset, negative, adj);
 +      timekeeping_apply_adjustment(tk, offset, negative, adj_scale);
  }
  
  /*
diff --combined lib/842/842_decompress.c
index a7f278d2ed8ff21dbf64c6f0193e60c0ea29d5ac,a2a941f8112ddb9bb32f00afa2c0f2299ccf1950..11fc39b4032b5aa0d4e1958ecb1cabdc43cdcb07
@@@ -69,7 -69,7 +69,7 @@@ struct sw842_param 
        ((s) == 2 ? be16_to_cpu(get_unaligned((__be16 *)d)) :   \
         (s) == 4 ? be32_to_cpu(get_unaligned((__be32 *)d)) :   \
         (s) == 8 ? be64_to_cpu(get_unaligned((__be64 *)d)) :   \
 -       WARN(1, "pr_debug param err invalid size %x\n", s))
 +       0)
  
  static int next_bits(struct sw842_param *p, u64 *d, u8 n);
  
@@@ -202,14 -202,10 +202,14 @@@ static int __do_index(struct sw842_para
                return -EINVAL;
        }
  
 -      pr_debug("index%x to %lx off %lx adjoff %lx tot %lx data %lx\n",
 -               size, (unsigned long)index, (unsigned long)(index * size),
 -               (unsigned long)offset, (unsigned long)total,
 -               (unsigned long)beN_to_cpu(&p->ostart[offset], size));
 +      if (size != 2 && size != 4 && size != 8)
 +              WARN(1, "__do_index invalid size %x\n", size);
 +      else
 +              pr_debug("index%x to %lx off %lx adjoff %lx tot %lx data %lx\n",
 +                       size, (unsigned long)index,
 +                       (unsigned long)(index * size), (unsigned long)offset,
 +                       (unsigned long)total,
 +                       (unsigned long)beN_to_cpu(&p->ostart[offset], size));
  
        memcpy(p->out, &p->ostart[offset], size);
        p->out += size;
@@@ -254,7 -250,7 +254,7 @@@ static int do_op(struct sw842_param *p
                case OP_ACTION_NOOP:
                        break;
                default:
-                       pr_err("Interal error, invalid op %x\n", op);
+                       pr_err("Internal error, invalid op %x\n", op);
                        return -EINVAL;
                }
  
diff --combined mm/balloon_compaction.c
index 300117f1a08f35c27c531d55ed0a08a1a9b81e50,59c2bc8a1efc7c94a88a51dfbf2496151d4c5c99..57b3e9bd6bc52727b62d563d0dd482eba41badf0
  /*
   * balloon_page_enqueue - allocates a new page and inserts it into the balloon
   *                      page list.
-  * @b_dev_info: balloon device decriptor where we will insert a new page to
+  * @b_dev_info: balloon device descriptor where we will insert a new page to
   *
   * Driver must call it to properly allocate a new enlisted balloon page
-  * before definetively removing it from the guest system.
+  * before definitively removing it from the guest system.
   * This function returns the page address for the recently enqueued page or
   * NULL in the case we fail to allocate a new page this turn.
   */
@@@ -61,7 -61,6 +61,7 @@@ struct page *balloon_page_dequeue(struc
        bool dequeued_page;
  
        dequeued_page = false;
 +      spin_lock_irqsave(&b_dev_info->pages_lock, flags);
        list_for_each_entry_safe(page, tmp, &b_dev_info->pages, lru) {
                /*
                 * Block others from accessing the 'page' while we get around
                                continue;
                        }
  #endif
 -                      spin_lock_irqsave(&b_dev_info->pages_lock, flags);
                        balloon_page_delete(page);
                        __count_vm_event(BALLOON_DEFLATE);
 -                      spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
                        unlock_page(page);
                        dequeued_page = true;
                        break;
                }
        }
 +      spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
  
        if (!dequeued_page) {
                /*
index 30ab8e127288d4290b5f823a62726179c19b0f5a,69f1de58a3b416713c9fcffc924ac606d13eebdb..1a1fcec8869593a8c99710e2021baa45ebfdedc8
@@@ -34,7 -34,7 +34,7 @@@ static struct vport_ops ovs_geneve_vpor
   * @dst_port: destination port.
   */
  struct geneve_port {
 -      u16 port_no;
 +      u16 dst_port;
  };
  
  static inline struct geneve_port *geneve_vport(const struct vport *vport)
@@@ -47,7 -47,7 +47,7 @@@ static int geneve_get_options(const str
  {
        struct geneve_port *geneve_port = geneve_vport(vport);
  
 -      if (nla_put_u16(skb, OVS_TUNNEL_ATTR_DST_PORT, geneve_port->port_no))
 +      if (nla_put_u16(skb, OVS_TUNNEL_ATTR_DST_PORT, geneve_port->dst_port))
                return -EMSGSIZE;
        return 0;
  }
@@@ -83,7 -83,7 +83,7 @@@ static struct vport *geneve_tnl_create(
                return vport;
  
        geneve_port = geneve_vport(vport);
 -      geneve_port->port_no = dst_port;
 +      geneve_port->dst_port = dst_port;
  
        rtnl_lock();
        dev = geneve_dev_create_fb(net, parms->name, NET_NAME_USER, dst_port);
@@@ -117,6 -117,7 +117,6 @@@ static struct vport_ops ovs_geneve_vpor
        .destroy        = ovs_netdev_tunnel_destroy,
        .get_options    = geneve_get_options,
        .send           = dev_queue_xmit,
 -      .owner          = THIS_MODULE,
  };
  
  static int __init ovs_geneve_tnl_init(void)
@@@ -132,6 -133,6 +132,6 @@@ static void __exit ovs_geneve_tnl_exit(
  module_init(ovs_geneve_tnl_init);
  module_exit(ovs_geneve_tnl_exit);
  
- MODULE_DESCRIPTION("OVS: Geneve swiching port");
+ MODULE_DESCRIPTION("OVS: Geneve switching port");
  MODULE_LICENSE("GPL");
  MODULE_ALIAS("vport-type-5");
This page took 0.046491 seconds and 5 git commands to generate.