• Linus Torvalds's avatar
    vfs: avoid non-forwarding large load after small store in path lookup · 8aaa881c
    Linus Torvalds authored
    The performance regression that Josef Bacik reported in the pathname
    lookup (see commit 99d263d4 "vfs: fix bad hashing of dentries") made
    me look at performance stability of the dcache code, just to verify that
    the problem was actually fixed.  That turned up a few other problems in
    this area.
    
    There are a few cases where we exit RCU lookup mode and go to the slow
    serializing case when we shouldn't, Al has fixed those and they'll come
    in with the next VFS pull.
    
    But my performance verification also shows that link_path_walk() turns
    out to have a very unfortunate 32-bit store of the length and hash of
    the name we look up, followed by a 64-bit read of the combined hash_len
    field.  That screws up the processor store to load forwarding, causing
    an unnecessary hickup in this critical routine.
    
    It's caused by the ugly calling convention for the "hash_name()"
    function, and easily fixed by just making hash_name() fill in the whole
    'struct qstr' rather than passing it a pointer to just the hash value.
    
    With that, the profile for this function looks much smoother.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    Merge branch 'parisc-3.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
    
    Pull parisc updates from Helge Deller:
     "The most important patch is a new Light Weigth Syscall (LWS) for 8,
      16, 32 and 64 bit atomic CAS operations which is required in order to
      be able to implement the atomic gcc builtins on our platform.
    
      Other than that, we wire up the seccomp, getrandom and memfd_create
      syscalls, fixes a minor off-by-one bug and a wrong printk string"
    
    * 'parisc-3.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
      parisc: Implement new LWS CAS supporting 64 bit operations.
      parisc: Wire up seccomp, getrandom and memfd_create syscalls
      parisc: dino: fix %d confusingly prefixed with 0x in format string
      parisc: sys_hpux: NUL terminator is one past the end
    
    Merge tag 'ntb-3.17' of git://github.com/jonmason/ntb
    
    Pull ntb driver bugfixes from Jon Mason:
     "NTB driver fixes for queue spread and buffer alignment.  Also, update
      to MAINTAINERS to reflect new e-mail address"
    
    * tag 'ntb-3.17' of git://github.com/jonmason/ntb:
      ntb: Add alignment check to meet hardware requirement
      MAINTAINERS: update NTB info
      NTB: correct the spread of queues over mw's
    
    Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull ARM irq chip fixes from Thomas Gleixner:
     "Another pile of ARM specific irq chip fixlets:
    
       - off by one bugs in the crossbar driver
       - missing annotations
       - a bunch of "make it compile" updates
    
      I pulled the lot today from Jason, but it has been in -next for at
      least a week"
    
    * 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      irqchip: gic-v3: Declare rdist as __percpu pointer to __iomem pointer
      irqchip: gic: Make gic_default_routable_irq_domain_ops static
      irqchip: exynos-combiner: Fix compilation error on ARM64
      irqchip: crossbar: Off by one bugs in init
      irqchip: gic-v3: Tag all low level accessors __maybe_unused
      irqchip: gic-v3: Only define gic_peek_irq() when building SMP
    
    Merge tag 'irqchip-urgent-3.17' of git://git.infradead.org/users/jcooper/linux into irq/urgent
    
    irqchip fixes for v3.17 from Jason Cooper
    
     - GIC/GICV3: Various fixlets
     - crossbar: Fix off-by-one bug
     - exynos-combiner: Fix arm64 build error
    
    ntb: Add alignment check to meet hardware requirement
    
    The NTB translate register must have the value to be BAR size aligned.
    This alignment check make sure that the DMA memory allocated has the
    proper alignment. Another requirement for NTB to function properly with
    memory window BAR size greater or equal to 4M is to use the CMA feature
    in 3.16 kernel with the appropriate CONFIG_CMA_ALIGNMENT and
    CONFIG_CMA_SIZE_MBYTES set.
    Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
    Signed-off-by: default avatarJon Mason <jdmason@kudzu.us>
    
    MAINTAINERS: update NTB info
    
    Update my contact info to my personal email address and add Dave Jiang.
    Signed-off-by: default avatarJon Mason <jon.mason@intel.com>
    Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
    
    NTB: correct the spread of queues over mw's
    
    The detection of an uneven number of queues on the given memory windows
    was not correct.  The mw_num is zero based and the mod should be
    division to spread them evenly over the mw's.
    Signed-off-by: default avatarJon Mason <jon.mason@intel.com>
    
    Merge branches 'locking-urgent-for-linus' and 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    
    Pull futex and timer fixes from Thomas Gleixner:
     "A oneliner bugfix for the jinxed futex code:
    
       - Drop hash bucket lock in the error exit path.  I really could slap
         myself for intruducing that bug while fixing all the other horror
         in that code three month ago ...
    
      and the timer department is not too proud about the following fixes:
    
       - Deal with a long standing rounding bug in the timeval to jiffies
         conversion.  It's a real issue and this fix fell through the cracks
         for quite some time.
    
       - Another round of alarmtimer fixes.  Finally this code gets used
         more widely and the subtle issues hidden for quite some time are
         noticed and fixed.  Nothing really exciting, just the itty bitty
         details which bite the serious users here and there"
    
    * 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      futex: Unlock hb->lock in futex_wait_requeue_pi() error path
    
    * 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      alarmtimer: Lock k_itimer during timer callback
      alarmtimer: Do not signal SIGEV_NONE timers
      alarmtimer: Return relative times in timer_gettime
      jiffies: Fix timeval conversion to jiffies
    
    parisc: Implement new LWS CAS supporting 64 bit operations.
    
    The current LWS cas only works correctly for 32bit. The new LWS allows
    for CAS operations of variable size.
    Signed-off-by: default avatarGuy Martin <gmsoft@tuxicoman.be>
    Cc: <stable@vger.kernel.org> # 3.13+
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    
    vfs: fix bad hashing of dentries
    
    Josef Bacik found a performance regression between 3.2 and 3.10 and
    narrowed it down to commit bfcfaa77 ("vfs: use 'unsigned long'
    accesses for dcache name comparison and hashing"). He reports:
    
     "The test case is essentially
    
          for (i = 0; i < 1000000; i++)
                  mkdir("a$i");
    
      On xfs on a fio card this goes at about 20k dir/sec with 3.2, and 12k
      dir/sec with 3.10.  This is because we spend waaaaay more time in
      __d_lookup on 3.10 than in 3.2.
    
      The new hashing function for strings is suboptimal for <
      sizeof(unsigned long) string names (and hell even > sizeof(unsigned
      long) string names that I've tested).  I broke out the old hashing
      function and the new one into a userspace helper to get real numbers
      and this is what I'm getting:
    
          Old hash table had 1000000 entries, 0 dupes, 0 max dupes
          New hash table had 12628 entries, 987372 dupes, 900 max dupes
          We had 11400 buckets with a p50 of 30 dupes, p90 of 240 dupes, p99 of 567 dupes for the new hash
    
      My test does the hash, and then does the d_hash into a integer pointer
      array the same size as the dentry hash table on my system, and then
      just increments the value at the address we got to see how many
      entries we overlap with.
    
      As you can see the old hash function ended up with all 1 million
      entries in their own bucket, whereas the new one they are only
      distributed among ~12.5k buckets, which is why we're using so much
      more CPU in __d_lookup".
    
    The reason for this hash regression is two-fold:
    
     - On 64-bit architectures the down-mixing of the original 64-bit
       word-at-a-time hash into the final 32-bit hash value is very
       simplistic and suboptimal, and just adds the two 32-bit parts
       together.
    
       In particular, because there is no bit shuffling and the mixing
       boundary is also a byte boundary, similar character patterns in the
       low and high word easily end up just canceling each other out.
    
     - the old byte-at-a-time hash mixed each byte into the final hash as it
       hashed the path component name, resulting in the low bits of the hash
       generally being a good source of hash data.  That is not true for the
       word-at-a-time case, and the hash data is distributed among all the
       bits.
    
    The fix is the same in both cases: do a better job of mixing the bits up
    and using as much of the hash data as possible.  We already have the
    "hash_32|64()" functions to do that.
    Reported-by: default avatarJosef Bacik <jbacik@fb.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Chris Mason <clm@fb.com>
    Cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    alarmtimer: Lock k_itimer during timer callback
    
    Locks the k_itimer's it_lock member when handling the alarm timer's
    expiry callback.
    
    The regular posix timers defined in posix-timers.c have this lock held
    during timout processing because their callbacks are routed through
    posix_timer_fn().  The alarm timers follow a different path, so they
    ought to grab the lock somewhere else.
    
    Cc: stable@vger.kernel.org
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Sharvil Nanavati <sharvil@google.com>
    Signed-off-by: default avatarRichard Larocque <rlarocque@google.com>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    
    alarmtimer: Do not signal SIGEV_NONE timers
    
    Avoids sending a signal to alarm timers created with sigev_notify set to
    SIGEV_NONE by checking for that special case in the timeout callback.
    
    The regular posix timers avoid sending signals to SIGEV_NONE timers by
    not scheduling any callbacks for them in the first place.  Although it
    would be possible to do something similar for alarm timers, it's simpler
    to handle this as a special case in the timeout.
    
    Prior to this patch, the alarm timer would ignore the sigev_notify value
    and try to deliver signals to the process anyway.  Even worse, the
    sanity check for the value of sigev_signo is skipped when SIGEV_NONE was
    specified, so the signal number could be bogus.  If sigev_signo was an
    unitialized value (as it often would be if SIGEV_NONE is used), then
    it's hard to predict which signal will be sent.
    
    Cc: stable@vger.kernel.org
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Sharvil Nanavati <sharvil@google.com>
    Signed-off-by: default avatarRichard Larocque <rlarocque@google.com>
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    
    alarmtimer: Return relative times in timer_gettime
    
    Returns the time remaining for an alarm timer, rather than the time at
    which it is scheduled to expire.  If the timer has already expired or it
    is not currently scheduled, the it_value's members are set to zero.
    
    This new behavior matches that of the other posix-timers and the POSIX
    specifications.
    
    This is a change in user-visible behavior, and may break existing
    applications.  Hopefully, few users rely on the old incorrect behavior.
    
    Cc: stable@vger.kernel.org
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Sharvil Nanavati <sharvil@google.com>
    Signed-off-by: default avatarRichard Larocque <rlarocque@google.com>
    [jstultz: minor style tweak]
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    
    jiffies: Fix timeval conversion to jiffies
    
    timeval_to_jiffies tried to round a timeval up to an integral number
    of jiffies, but the logic for doing so was incorrect: intervals
    corresponding to exactly N jiffies would become N+1. This manifested
    itself particularly repeatedly stopping/starting an itimer:
    
    setitimer(ITIMER_PROF, &val, NULL);
    setitimer(ITIMER_PROF, NULL, &val);
    
    would add a full tick to val, _even if it was exactly representable in
    terms of jiffies_ (say, the result of a previous rounding.)  Doing
    this repeatedly would cause unbounded growth in val.  So fix the math.
    
    Here's what was wrong with the conversion: we essentially computed
    (eliding seconds)
    
    jiffies = usec  * (NSEC_PER_USEC/TICK_NSEC)
    
    by using scaling arithmetic, which took the best approximation of
    NSEC_PER_USEC/TICK_NSEC with denominator of 2^USEC_JIFFIE_SC =
    x/(2^USEC_JIFFIE_SC), and computed:
    
    jiffies = (usec * x) >> USEC_JIFFIE_SC
    
    and rounded this calculation up in the intermediate form (since we
    can't necessarily exactly represent TICK_NSEC in usec.) But the
    scaling arithmetic is a (very slight) *over*approximation of the true
    value; that is, instead of dividing by (1 usec/ 1 jiffie), we
    effectively divided by (1 usec/1 jiffie)-epsilon (rounding
    down). This would normally be fine, but we want to round timeouts up,
    and we did so by adding 2^USEC_JIFFIE_SC - 1 before the shift; this
    would be fine if our division was exact, but dividing this by the
    slightly smaller factor was equivalent to adding just _over_ 1 to the
    final result (instead of just _under_ 1, as desired.)
    
    In particular, with HZ=1000, we consistently computed that 10000 usec
    was 11 jiffies; the same was true for any exact multiple of
    TICK_NSEC.
    
    We could possibly still round in the intermediate form, adding
    something less than 2^USEC_JIFFIE_SC - 1, but easier still is to
    convert usec->nsec, round in nanoseconds, and then convert using
    time*spec*_to_jiffies.  This adds one constant multiplication, and is
    not observably slower in microbenchmarks on recent x86 hardware.
    
    Tested: the following program:
    
    int main() {
      struct itimerval zero = {{0, 0}, {0, 0}};
      /* Initially set to 10 ms. */
      struct itimerval initial = zero;
      initial.it_interval.tv_usec = 10000;
      setitimer(ITIMER_PROF, &initial, NULL);
      /* Save and restore several times. */
      for (size_t i = 0; i < 10; ++i) {
        struct itimerval prev;
        setitimer(ITIMER_PROF, &zero, &prev);
        /* on old kernels, this goes up by TICK_USEC every iteration */
        printf("previous value: %ld %ld %ld %ld\n",
               prev.it_interval.tv_sec, prev.it_interval.tv_usec,
               prev.it_value.tv_sec, prev.it_value.tv_usec);
        setitimer(ITIMER_PROF, &prev, NULL);
      }
        return 0;
    }
    
    Cc: stable@vger.kernel.org
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Paul Turner <pjt@google.com>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Prarit Bhargava <prarit@redhat.com>
    Reviewed-by: default avatarPaul Turner <pjt@google.com>
    Reported-by: default avatarAaron Jacobs <jacobsa@google.com>
    Signed-off-by: default avatarAndrew Hunter <ahh@google.com>
    [jstultz: Tweaked to apply to 3.17-rc]
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    
    futex: Unlock hb->lock in futex_wait_requeue_pi() error path
    
    futex_wait_requeue_pi() calls futex_wait_setup(). If
    futex_wait_setup() succeeds it returns with hb->lock held and
    preemption disabled. Now the sanity check after this does:
    
            if (match_futex(&q.key, &key2)) {
    	   	ret = -EINVAL;
    		goto out_put_keys;
    	}
    
    which releases the keys but does not release hb->lock.
    
    So we happily return to user space with hb->lock held and therefor
    preemption disabled.
    
    Unlock hb->lock before taking the exit route.
    Reported-by: default avatarDave "Trinity" Jones <davej@redhat.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarDarren Hart <dvhart@linux.intel.com>
    Reviewed-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/alpine.DEB.2.10.1409112318500.4178@nanosSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    
    irqchip: gic-v3: Declare rdist as __percpu pointer to __iomem pointer
    
    The __percpu __iomem annotations on the rdist base are contradictory
    and confuse static checkers such as sparse.
    
    This patch fixes the anotations so that rdist is described as a __percpu
    pointer to an __iomem pointer.
    
    Cc: Jason Cooper <jason@lakedaemon.net>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Link: https://lkml.kernel.org/r/1409062410-25891-9-git-send-email-will.deacon@arm.comSigned-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    
    irqchip: gic: Make gic_default_routable_irq_domain_ops static
    
    The internal irq domain ops for the GIC are not used directly anywhere
    else, so make them static. This gets rid of a sparse warning on the
    file.
    
    Cc: Jason Cooper <jason@lakedaemon.net>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Link: https://lkml.kernel.org/r/1409062410-25891-8-git-send-email-will.deacon@arm.comSigned-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    
    irqchip: exynos-combiner: Fix compilation error on ARM64
    
    The following compilation error occurs on 64-bit Exynos7 SoC:
    
    drivers/irqchip/exynos-combiner.c: In function ‘combiner_irq_domain_map’:
    drivers/irqchip/exynos-combiner.c:162:2: error: implicit declaration of function ‘set_irq_flags’ [-Werror=implicit-function-declaration]
      set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
      ^
    drivers/irqchip/exynos-combiner.c:162:21: error: ‘IRQF_VALID’ undeclared (first use in this function)
      set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
                         ^
    drivers/irqchip/exynos-combiner.c:162:21: note: each undeclared identifier is reported only once for each function it appears in
    drivers/irqchip/exynos-combiner.c:162:34: error: ‘IRQF_PROBE’ undeclared (first use in this function)
      set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
    
    Fix the build error by including linux/interrupt.h.
    Signed-off-by: default avatarNaveen Krishna Chatradhi <ch.naveen@samsung.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Jason Cooper <jason@lakedaemon.net>
    Cc: Sudeep Holla <sudeep.holla@arm.com>
    Link: https://lkml.kernel.org/r/1409722329-18309-1-git-send-email-ch.naveen@samsung.comSigned-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    
    parisc: Wire up seccomp, getrandom and memfd_create syscalls
    
    With secure computing we only support the SECCOMP_MODE_STRICT mode for
    now.
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    
    parisc: dino: fix %d confusingly prefixed with 0x in format string
    Signed-off-by: default avatarHans Wennborg <hans@hanshq.net>
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    
    parisc: sys_hpux: NUL terminator is one past the end
    
    We allocate "len" number of chars so we should put the NUL at "len - 1"
    to avoid corrupting memory.  Btw, strlen_user() is different from the
    normal strlen() function because it includes NUL terminator in the
    count.
    Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    
    irqchip: crossbar: Off by one bugs in init
    
    My static checker complains that the ">" should be ">=" or else we go
    beyond the end of the cb->irq_map[] array on the next line.
    Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    
    irqchip: gic-v3: Tag all low level accessors __maybe_unused
    
    This is only really needed for gic_write_sgi1r in the !SMP case since it
    is only referenced in the SMP initialisation code but it seems better to
    have these functions all next to each other and declared consistently.
    Signed-off-by: default avatarMark Brown <broonie@linaro.org>
    Link: https://lkml.kernel.org/r/1406748194-21094-1-git-send-email-broonie@kernel.orgSigned-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    
    irqchip: gic-v3: Only define gic_peek_irq() when building SMP
    
    If building with CONFIG_SMP disbled (for example, with allnoconfig) then
    GCC complains that the static function gic_peek_irq() is defined but not
    used since the only reference is in the SMP initialisation code. Fix this
    by moving the function definition inside the ifdef.
    Signed-off-by: default avatarMark Brown <broonie@linaro.org>
    Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Link: https://lkml.kernel.org/r/1406480224-24628-1-git-send-email-broonie@kernel.orgSigned-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    
    (cherry picked from commit 9226b5b4
    99d263d4)
    Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
    8aaa881c
namei.c 100 KB