13 Oct, 2017

2 commits

  • digsig_verify() requests a user key, then accesses its payload.
    However, a revoked key has a NULL payload, and we failed to check for
    this. request_key() *does* skip revoked keys, but there is still a
    window where the key can be revoked before we acquire its semaphore.

    Fix it by checking for a NULL payload, treating it like a key which was
    already revoked at the time it was requested.

    Fixes: 051dbb918c7f ("crypto: digital signature verification support")
    Reviewed-by: James Morris
    Cc: [v3.3+]
    Cc: Dmitry Kasatkin
    Signed-off-by: Eric Biggers
    Signed-off-by: David Howells

    Eric Biggers
     
  • When the file /proc/fs/fscache/objects (available with
    CONFIG_FSCACHE_OBJECT_LIST=y) is opened, we request a user key with
    description "fscache:objlist", then access its payload. However, a
    revoked key has a NULL payload, and we failed to check for this.
    request_key() *does* skip revoked keys, but there is still a window
    where the key can be revoked before we access its payload.

    Fix it by checking for a NULL payload, treating it like a key which was
    already revoked at the time it was requested.

    Fixes: 4fbf4291aa15 ("FS-Cache: Allow the current state of all objects to be dumped")
    Reviewed-by: James Morris
    Cc: [v2.6.32+]
    Signed-off-by: Eric Biggers
    Signed-off-by: David Howells

    Eric Biggers
     

12 Oct, 2017

1 commit

  • A key of type "encrypted" references a "master key" which is used to
    encrypt and decrypt the encrypted key's payload. However, when we
    accessed the master key's payload, we failed to handle the case where
    the master key has been revoked, which sets the payload pointer to NULL.
    Note that request_key() *does* skip revoked keys, but there is still a
    window where the key can be revoked before we acquire its semaphore.

    Fix it by checking for a NULL payload, treating it like a key which was
    already revoked at the time it was requested.

    This was an issue for master keys of type "user" only. Master keys can
    also be of type "trusted", but those cannot be revoked.

    Fixes: 7e70cb497850 ("keys: add new key-type encrypted")
    Reviewed-by: James Morris
    Cc: [v2.6.38+]
    Cc: Mimi Zohar
    Cc: David Safford
    Signed-off-by: Eric Biggers
    Signed-off-by: David Howells

    Eric Biggers
     

02 Oct, 2017

9 commits

  • Linus Torvalds
     
  • Pull x86 fixes from Thomas Gleixner:
    "This contains the following fixes and improvements:

    - Avoid dereferencing an unprotected VMA pointer in the fault signal
    generation code

    - Fix inline asm call constraints for GCC 4.4

    - Use existing register variable to retrieve the stack pointer
    instead of forcing the compiler to create another indirect access
    which results in excessive extra 'mov %rsp, %' instructions

    - Disable branch profiling for the memory encryption code to prevent
    an early boot crash

    - Fix a sparse warning caused by casting the __user annotation in
    __get_user_asm_u64() away

    - Fix an off by one error in the loop termination of the error patch
    in the x86 sysfs init code

    - Add missing CPU IDs to various Intel specific drivers to enable the
    functionality on recent hardware

    - More (init) constification in the numachip code"

    * 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    x86/asm: Use register variable to get stack pointer value
    x86/mm: Disable branch profiling in mem_encrypt.c
    x86/asm: Fix inline asm call constraints for GCC 4.4
    perf/x86/intel/uncore: Correct num_boxes for IIO and IRP
    perf/x86/intel/rapl: Add missing CPU IDs
    perf/x86/msr: Add missing CPU IDs
    perf/x86/intel/cstate: Add missing CPU IDs
    x86: Don't cast away the __user in __get_user_asm_u64()
    x86/sysfs: Fix off-by-one error in loop termination
    x86/mm: Fix fault error path using unsafe vma pointer
    x86/numachip: Add const and __initconst to numachip2_clockevent

    Linus Torvalds
     
  • Pull timer fixes from Thomas Gleixner:
    "This adds a new timer wheel function which is required for the
    conversion of the timer callback function from the 'unsigned long
    data' argument to 'struct timer_list *timer'. This conversion has two
    benefits:

    1) It makes struct timer_list smaller

    2) Many callers hand in a pointer to the timer or to the structure
    containing the timer, which happens via type casting both at setup
    and in the callback. This change gets rid of the typecasts.

    Once the conversion is complete, which is planned for 4.15, the old
    setup function and the intermediate typecast in the new setup function
    go away along with the data field in struct timer_list.

    Merging this now into mainline allows a smooth queueing of the actual
    conversion in the affected maintainer trees without creating
    dependencies"

    * 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    um/time: Fixup namespace collision
    timer: Prepare to change timer callback argument type

    Linus Torvalds
     
  • Pull smp/hotplug fixes from Thomas Gleixner:
    "This addresses the fallout of the new lockdep mechanism which covers
    completions in the CPU hotplug code.

    The lockdep splats are false positives, but there is no way to
    annotate that reliably. The solution is to split the completions for
    CPU up and down, which requires some reshuffling of the failure
    rollback handling as well"

    * 'smp-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    smp/hotplug: Hotplug state fail injection
    smp/hotplug: Differentiate the AP completion between up and down
    smp/hotplug: Differentiate the AP-work lockdep class between up and down
    smp/hotplug: Callback vs state-machine consistency
    smp/hotplug: Rewrite AP state machine core
    smp/hotplug: Allow external multi-instance rollback
    smp/hotplug: Add state diagram

    Linus Torvalds
     
  • Pull scheduler fixes from Thomas Gleixner:
    "The scheduler pull request comes with the following updates:

    - Prevent a divide by zero issue by validating the input value of
    sysctl_sched_time_avg

    - Make task state printing consistent all over the place and have
    explicit state characters for IDLE and PARKED so they wont be
    displayed as 'D' state which confuses tools"

    * 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    sched/sysctl: Check user input value of sysctl_sched_time_avg
    sched/debug: Add explicit TASK_PARKED printing
    sched/debug: Ignore TASK_IDLE for SysRq-W
    sched/debug: Add explicit TASK_IDLE printing
    sched/tracing: Use common task-state helpers
    sched/tracing: Fix trace_sched_switch task-state printing
    sched/debug: Remove unused variable
    sched/debug: Convert TASK_state to hex
    sched/debug: Implement consistent task-state printing

    Linus Torvalds
     
  • Pull perf fixes from Thomas Gleixner:

    - Prevent a division by zero in the perf aux buffer handling

    - Sync kernel headers with perf tool headers

    - Fix a build failure in the syscalltbl code

    - Make the debug messages of perf report --call-graph work correctly

    - Make sure that all required perf files are in the MANIFEST for
    container builds

    - Fix the atrr.exclude kernel handling so it respects the
    perf_event_paranoid and the user permissions

    - Make perf test on s390x work correctly

    * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    perf/aux: Only update ->aux_wakeup in non-overwrite mode
    perf test: Fix vmlinux failure on s390x part 2
    perf test: Fix vmlinux failure on s390x
    perf tools: Fix syscalltbl build failure
    perf report: Fix debug messages with --call-graph option
    perf evsel: Fix attr.exclude_kernel setting for default cycles:p
    tools include: Sync kernel ABI headers with tooling headers
    perf tools: Get all of tools/{arch,include}/ in the MANIFEST

    Linus Torvalds
     
  • Pull locking fixes from Thomas Gleixner:
    "Two fixes for locking:

    - Plug a hole the pi_stat->owner serialization which was changed
    recently and failed to fixup two usage sites.

    - Prevent reordering of the rwsem_has_spinner() check vs the
    decrement of rwsem count in up_write() which causes a missed
    wakeup"

    * 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    locking/rwsem-xadd: Fix missed wakeup due to reordering of load
    futex: Fix pi_state->owner serialization

    Linus Torvalds
     
  • Pull irq fixes from Thomas Gleixner:

    - Add a missing NULL pointer check in free_irq()

    - Fix a memory leak/memory corruption in the generic irq chip

    - Add missing rcu annotations for radix tree access

    - Use ffs instead of fls when extracting data from a chip register in
    the MIPS GIC irq driver

    - Fix the unmasking of IPI interrupts in the MIPS GIC driver so they
    end up at the target CPU and not at CPU0

    * 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    irq/generic-chip: Don't replace domain's name
    irqdomain: Add __rcu annotations to radix tree accessors
    irqchip/mips-gic: Use effective affinity to unmask
    irqchip/mips-gic: Fix shifts to extract register fields
    genirq: Check __free_irq() return value for NULL

    Linus Torvalds
     
  • Pull objtool fixes from Thomas Gleixner:
    "Two small fixes for objtool:

    - Support frame pointer setup via 'lea (%rsp), %rbp' which was not
    yet supported and caused build warnings

    - Disable unreacahble warnings for GCC4.4 and older to avoid false
    positives caused by the compiler itself"

    * 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    objtool: Support unoptimized frame pointer setup
    objtool: Skip unreachable warnings for GCC 4.4 and older

    Linus Torvalds
     

01 Oct, 2017

2 commits

  • Pull mtd fixes from Boris Brezillon:

    - Fix partition alignment check in mtdcore.c

    - Fix a buffer overflow in the Atmel NAND driver

    * tag 'mtd/fixes-for-4.14-rc3' of git://git.infradead.org/linux-mtd:
    mtd: nand: atmel: fix buffer overflow in atmel_pmecc_user
    mtd: Fix partition alignment check on multi-erasesize devices

    Linus Torvalds
     
  • Pull SCSI fixes from James Bottomley:
    "Eight mostly minor fixes for recently discovered issues in drivers"

    * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
    scsi: ILLEGAL REQUEST + ASC==27 => target failure
    scsi: aacraid: Add a small delay after IOP reset
    scsi: scsi_transport_fc: Also check for NOTPRESENT in fc_remote_port_add()
    scsi: scsi_transport_fc: set scsi_target_id upon rescan
    scsi: scsi_transport_iscsi: fix the issue that iscsi_if_rx doesn't parse nlmsg properly
    scsi: aacraid: error: testing array offset 'bus' after use
    scsi: lpfc: Don't return internal MBXERR_ERROR code from probe function
    scsi: aacraid: Fix 2T+ drives on SmartIOC-2000

    Linus Torvalds
     

30 Sep, 2017

16 commits

  • Pull x86 platform drivers fix from Darren Hart:
    "Newly discovered species of fujitsu laptops break some assumptions
    about ACPI device pairings.

    fujitsu-laptop: Don't oops when FUJ02E3 is not present"

    * tag 'platform-drivers-x86-v4.14-2' of git://git.infradead.org/linux-platform-drivers-x86:
    platform/x86: fujitsu-laptop: Don't oops when FUJ02E3 is not presnt

    Linus Torvalds
     
  • …j.anaszewski/linux-leds

    Pull LED fixes from Jacek Anaszewski:
    "Four fixes for the as3645a LED flash controller and one update to
    MAINTAINERS"

    * tag 'led_fixes-4.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds:
    MAINTAINERS: Add entry for MediaTek PMIC LED driver
    as3645a: Unregister indicator LED on device unbind
    as3645a: Use integer numbers for parsing LEDs
    dt: bindings: as3645a: Use LED number to refer to LEDs
    as3645a: Use ams,input-max-microamp as documented in DT bindings

    Linus Torvalds
     
  • Pull waitid fix from Al Viro:
    "Fix infoleak in waitid()"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    fix infoleak in waitid(2)

    Linus Torvalds
     
  • Pull btrfs fixes from David Sterba:
    "We've collected a bunch of isolated fixes, for crashes, user-visible
    behaviour or missing bits from other subsystem cleanups from the past.

    The overall number is not small but I was not able to make it
    significantly smaller. Most of the patches are supposed to go to
    stable"

    * 'for-4.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
    btrfs: log csums for all modified extents
    Btrfs: fix unexpected result when dio reading corrupted blocks
    btrfs: Report error on removing qgroup if del_qgroup_item fails
    Btrfs: skip checksum when reading compressed data if some IO have failed
    Btrfs: fix kernel oops while reading compressed data
    Btrfs: use btrfs_op instead of bio_op in __btrfs_map_block
    Btrfs: do not backup tree roots when fsync
    btrfs: remove BTRFS_FS_QUOTA_DISABLING flag
    btrfs: propagate error to btrfs_cmp_data_prepare caller
    btrfs: prevent to set invalid default subvolid
    Btrfs: send: fix error number for unknown inode types
    btrfs: fix NULL pointer dereference from free_reloc_roots()
    btrfs: finish ordered extent cleaning if no progress is found
    btrfs: clear ordered flag on cleaning up ordered extents
    Btrfs: fix incorrect {node,sector}size endianness from BTRFS_IOC_FS_INFO
    Btrfs: do not reset bio->bi_ops while writing bio
    Btrfs: use the new helper wbc_to_write_flags

    Linus Torvalds
     
  • Pull MD fixes from Shaohua Li:
    "A few fixes for MD. Mainly fix a problem introduced in 4.13, which we
    retry bio for some code paths but not all in some situations"

    * tag 'md/4.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md:
    md/raid5: cap worker count
    dm-raid: fix a race condition in request handling
    md: fix a race condition for flush request handling
    md: separate request handling

    Linus Torvalds
     
  • Pull PCI fixes from Bjorn Helgaas:

    - fix CONFIG_PCI=n build error (introduced in v4.14-rc1) (Geert
    Uytterhoeven)

    - fix a race in sysfs driver_override store/show (Nicolai Stange)

    * tag 'pci-v4.14-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
    PCI: Fix race condition with driver_override
    PCI: Add dummy pci_acs_enabled() for CONFIG_PCI=n build

    Linus Torvalds
     
  • Pull drm fixes from Dave Airlie:
    "Regular fixes pull, some amdkfd, amdgpu, etnaviv, sun4i, qxl, tegra
    fixes.

    I've got an outstanding pull for i915 but it wasn't on an rc2 base so
    I wanted to ship these out first, I might get to it before rc3 or I
    might not"

    * tag 'drm-fixes-for-v4.14-rc3' of git://people.freedesktop.org/~airlied/linux:
    drm/tegra: trace: Fix path to include
    qxl: fix framebuffer unpinning
    drm/sun4i: cec: Enable back CEC-pin framework
    drm/amdkfd: Print event limit messages only once per process
    drm/amdkfd: Fix kernel-queue wrapping bugs
    drm/amdkfd: Fix incorrect destroy_mqd parameter
    drm/radeon: disable hard reset in hibernate for APUs
    drm/amdgpu: revert tile table update for oland
    etnaviv: fix gem object list corruption
    etnaviv: fix submit error path
    qxl: fix primary surface handling
    drm/amdkfd: check for null dev to avoid a null pointer dereference

    Linus Torvalds
     
  • Pull IOMMU fixes from Joerg Roedel:

    - A comment fix for 'struct iommu_ops'

    - Format string fixes for AMD IOMMU, unfortunatly I missed that during
    review.

    - Limit mediatek physical addresses to 32 bit for v7s to fix a warning
    triggered in io-page-table code.

    - Fix dma-sync in io-pgtable-arm-v7s code

    * tag 'iommu-fixes-v4.14-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
    iommu: Fix comment for iommu_ops.map_sg
    iommu/amd: pr_err() strings should end with newlines
    iommu/mediatek: Limit the physical address in 32bit for v7s
    iommu/io-pgtable-arm-v7s: Need dma-sync while there is no QUIRK_NO_DMA

    Linus Torvalds
     
  • Pull arm64 fixes from Catalin Marinas:

    - SPsel register initialisation on reset as the architecture defines
    its state as unknown

    - Use READ_ONCE when dereferencing pmd_t pointers to avoid race
    conditions in page_vma_mapped_walk() (or fast GUP) with concurrent
    modifications of the page table

    - Avoid invoking the mm fault handling code for kernel addresses (check
    against TASK_SIZE) which would otherwise result in calling
    might_sleep() in atomic context

    * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
    arm64: fault: Route pte translation faults via do_translation_fault
    arm64: mm: Use READ_ONCE when dereferencing pointer to pte table
    arm64: Make sure SPsel is always set

    Linus Torvalds
     
  • Pull xen fixes from Juergen Gross:

    - avoid a warning when compiling with clang

    - consider read-only bits in xen-pciback when writing to a BAR

    - fix a boot crash of pv-domains

    * tag 'for-linus-4.14c-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
    xen/mmu: Call xen_cleanhighmap() with 4MB aligned for page tables mapping
    xen-pciback: relax BAR sizing write value check
    x86/xen: clean up clang build warning

    Linus Torvalds
     
  • Pull kvm fixes from Paolo Bonzini:
    "Mixed bugfixes. Perhaps the most interesting one is a latent bug that
    was finally triggered by PCID support"

    * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
    kvm/x86: Handle async PF in RCU read-side critical sections
    KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
    KVM: VMX: use cmpxchg64
    KVM: VMX: simplify and fix vmx_vcpu_pi_load
    KVM: VMX: avoid double list add with VT-d posted interrupts
    KVM: VMX: extract __pi_post_block
    KVM: PPC: Book3S HV: Check for updated HDSISR on P9 HDSI exception
    KVM: nVMX: fix HOST_CR3/HOST_CR4 cache

    Linus Torvalds
     
  • kernel_waitid() can return a PID, an error or 0. rusage is filled in the first
    case and waitid(2) rusage should've been copied out exactly in that case, *not*
    whenever kernel_waitid() has not returned an error. Compat variant shares that
    braino; none of kernel_wait4() callers do, so the below ought to fix it.

    Reported-and-tested-by: Alexander Potapenko
    Fixes: ce72a16fa705 ("wait4(2)/waitid(2): separate copying rusage to userland")
    Cc: stable@vger.kernel.org # v4.13
    Signed-off-by: Al Viro

    Al Viro
     
  • Currently we use current_stack_pointer() function to get the value
    of the stack pointer register. Since commit:

    f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")

    ... we have a stack register variable declared. It can be used instead of
    current_stack_pointer() function which allows to optimize away some
    excessive "mov %rsp, %" instructions:

    -mov %rsp,%rdx
    -sub %rdx,%rax
    -cmp $0x3fff,%rax
    -ja ffffffff810722fd

    +sub %rsp,%rax
    +cmp $0x3fff,%rax
    +ja ffffffff810722fa

    Remove current_stack_pointer(), rename __asm_call_sp to current_stack_pointer
    and use it instead of the removed function.

    Signed-off-by: Andrey Ryabinin
    Reviewed-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/20170929141537.29167-1-aryabinin@virtuozzo.com
    Signed-off-by: Ingo Molnar

    Andrey Ryabinin
     
  • Some routines in mem_encrypt.c are called very early in the boot process,
    e.g. sme_encrypt_kernel(). When CONFIG_TRACE_BRANCH_PROFILING=y is defined
    the resulting branch profiling associated with the check to see if SME is
    active results in a kernel crash. Disable branch profiling for
    mem_encrypt.c by defining DISABLE_BRANCH_PROFILING before including any
    header files.

    Reported-by: kernel test robot
    Signed-off-by: Tom Lendacky
    Acked-by: Borislav Petkov
    Cc: Borislav Petkov
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/20170929162419.6016.53390.stgit@tlendack-t1.amdoffice.net
    Signed-off-by: Ingo Molnar

    Tom Lendacky
     
  • …linux/kernel/git/acme/linux into perf/urgent

    Pull perf/urgent fixes from Arnaldo Carvalho de Melo:

    - Fix syscalltbl build failure (Akemi Yagi)

    - Fix attr.exclude_kernel setting for default cycles:p, this time for
    !root with kernel.perf_event_paranoid = -1 (Arnaldo Carvalho de Melo)

    - Sync kernel ABI headers with tooling headers (Ingo Molnar)

    - Remove misleading debug messages with --call-graph option (Mengting Zhang)

    - Revert vmlinux symbol resolution patches for s390x (Thomas Richter)

    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>

    Ingo Molnar
     
  • …jmorris/linux-security

    Pull keys fixes from James Morris:
    "Notable here is a rewrite of big_key crypto by Jason Donenfeld to
    address some issues in the original code.

    From Jason's commit log:
    "This started out as just replacing the use of crypto/rng with
    get_random_bytes_wait, so that we wouldn't use bad randomness at
    boot time. But, upon looking further, it appears that there were
    even deeper underlying cryptographic problems, and that this seems
    to have been committed with very little crypto review. So, I rewrote
    the whole thing, trying to keep to the conventions introduced by the
    previous author, to fix these cryptographic flaws."

    There has been positive review of the new code by Eric Biggers and
    Herbert Xu, and it passes basic testing via the keyutils test suite.
    Eric also manually tested it.

    Generally speaking, we likely need to improve the amount of crypto
    review for kernel crypto users including keys (I'll post a note
    separately to ksummit-discuss)"

    * 'fixes-v4.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
    security/keys: rewrite all of big_key crypto
    security/keys: properly zero out sensitive key material in big_key
    KEYS: use kmemdup() in request_key_auth_new()
    KEYS: restrict /proc/keys by credentials at open time
    KEYS: reset parent each time before searching key_user_tree
    KEYS: prevent KEYCTL_READ on negative key
    KEYS: prevent creating a different user's keyrings
    KEYS: fix writing past end of user-supplied buffer in keyring_read()
    KEYS: fix key refcount leak in keyctl_read_key()
    KEYS: fix key refcount leak in keyctl_assume_authority()
    KEYS: don't revoke uninstantiated key in request_key_auth_new()
    KEYS: fix cred refcount leak in request_key_auth_new()

    Linus Torvalds
     

29 Sep, 2017

10 commits

  • We currently route pte translation faults via do_page_fault, which elides
    the address check against TASK_SIZE before invoking the mm fault handling
    code. However, this can cause issues with the path walking code in
    conjunction with our word-at-a-time implementation because
    load_unaligned_zeropad can end up faulting in kernel space if it reads
    across a page boundary and runs into a page fault (e.g. by attempting to
    read from a guard region).

    In the case of such a fault, load_unaligned_zeropad has registered a
    fixup to shift the valid data and pad with zeroes, however the abort is
    reported as a level 3 translation fault and we dispatch it straight to
    do_page_fault, despite it being a kernel address. This results in calling
    a sleeping function from atomic context:

    BUG: sleeping function called from invalid context at arch/arm64/mm/fault.c:313
    in_atomic(): 0, irqs_disabled(): 0, pid: 10290
    Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
    [...]
    [] ___might_sleep+0x134/0x144
    [] __might_sleep+0x7c/0x8c
    [] do_page_fault+0x140/0x330
    [] do_mem_abort+0x54/0xb0
    Exception stack(0xfffffffb20247a70 to 0xfffffffb20247ba0)
    [...]
    [] el1_da+0x18/0x78
    [] path_parentat+0x44/0x88
    [] filename_parentat+0x5c/0xd8
    [] filename_create+0x4c/0x128
    [] SyS_mkdirat+0x50/0xc8
    [] el0_svc_naked+0x24/0x28
    Code: 36380080 d5384100 f9400800 9402566d (d4210000)
    ---[ end trace 2d01889f2bca9b9f ]---

    Fix this by dispatching all translation faults to do_translation_faults,
    which avoids invoking the page fault logic for faults on kernel addresses.

    Cc:
    Reported-by: Ankit Jain
    Signed-off-by: Will Deacon
    Signed-off-by: Catalin Marinas

    Will Deacon
     
  • On kernels built with support for transparent huge pages, different CPUs
    can access the PMD concurrently due to e.g. fast GUP or page_vma_mapped_walk
    and they must take care to use READ_ONCE to avoid value tearing or caching
    of stale values by the compiler. Unfortunately, these functions call into
    our pgtable macros, which don't use READ_ONCE, and compiler caching has
    been observed to cause the following crash during ext4 writeback:

    PC is at check_pte+0x20/0x170
    LR is at page_vma_mapped_walk+0x2e0/0x540
    [...]
    Process doio (pid: 2463, stack limit = 0xffff00000f2e8000)
    Call trace:
    [] check_pte+0x20/0x170
    [] page_vma_mapped_walk+0x2e0/0x540
    [] page_mkclean_one+0xac/0x278
    [] rmap_walk_file+0xf0/0x238
    [] rmap_walk+0x64/0xa0
    [] page_mkclean+0x90/0xa8
    [] clear_page_dirty_for_io+0x84/0x2a8
    [] mpage_submit_page+0x34/0x98
    [] mpage_process_page_bufs+0x164/0x170
    [] mpage_prepare_extent_to_map+0x134/0x2b8
    [] ext4_writepages+0x484/0xe30
    [] do_writepages+0x44/0xe8
    [] __filemap_fdatawrite_range+0xbc/0x110
    [] file_write_and_wait_range+0x48/0xd8
    [] ext4_sync_file+0x80/0x4b8
    [] vfs_fsync_range+0x64/0xc0
    [] SyS_msync+0x194/0x1e8

    This is because page_vma_mapped_walk loads the PMD twice before calling
    pte_offset_map: the first time without READ_ONCE (where it gets all zeroes
    due to a concurrent pmdp_invalidate) and the second time with READ_ONCE
    (where it sees a valid table pointer due to a concurrent pmd_populate).
    However, the compiler inlines everything and caches the first value in
    a register, which is subsequently used in pte_offset_phys which returns
    a junk pointer that is later dereferenced when attempting to access the
    relevant pte.

    This patch fixes the issue by using READ_ONCE in pte_offset_phys to ensure
    that a stale value is not used. Whilst this is a point fix for a known
    failure (and simple to backport), a full fix moving all of our page table
    accessors over to {READ,WRITE}_ONCE and consistently using READ_ONCE in
    page_vma_mapped_walk is in the works for a future kernel release.

    Cc: Jon Masters
    Cc: Timur Tabi
    Cc:
    Fixes: f27176cfc363 ("mm: convert page_mkclean_one() to use page_vma_mapped_walk()")
    Tested-by: Richard Ruigrok
    Signed-off-by: Will Deacon
    Signed-off-by: Catalin Marinas

    Will Deacon
     
  • Sasha Levin reported a WARNING:

    | WARNING: CPU: 0 PID: 6974 at kernel/rcu/tree_plugin.h:329
    | rcu_preempt_note_context_switch kernel/rcu/tree_plugin.h:329 [inline]
    | WARNING: CPU: 0 PID: 6974 at kernel/rcu/tree_plugin.h:329
    | rcu_note_context_switch+0x16c/0x2210 kernel/rcu/tree.c:458
    ...
    | CPU: 0 PID: 6974 Comm: syz-fuzzer Not tainted 4.13.0-next-20170908+ #246
    | Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
    | 1.10.1-1ubuntu1 04/01/2014
    | Call Trace:
    ...
    | RIP: 0010:rcu_preempt_note_context_switch kernel/rcu/tree_plugin.h:329 [inline]
    | RIP: 0010:rcu_note_context_switch+0x16c/0x2210 kernel/rcu/tree.c:458
    | RSP: 0018:ffff88003b2debc8 EFLAGS: 00010002
    | RAX: 0000000000000001 RBX: 1ffff1000765bd85 RCX: 0000000000000000
    | RDX: 1ffff100075d7882 RSI: ffffffffb5c7da20 RDI: ffff88003aebc410
    | RBP: ffff88003b2def30 R08: dffffc0000000000 R09: 0000000000000001
    | R10: 0000000000000000 R11: 0000000000000000 R12: ffff88003b2def08
    | R13: 0000000000000000 R14: ffff88003aebc040 R15: ffff88003aebc040
    | __schedule+0x201/0x2240 kernel/sched/core.c:3292
    | schedule+0x113/0x460 kernel/sched/core.c:3421
    | kvm_async_pf_task_wait+0x43f/0x940 arch/x86/kernel/kvm.c:158
    | do_async_page_fault+0x72/0x90 arch/x86/kernel/kvm.c:271
    | async_page_fault+0x22/0x30 arch/x86/entry/entry_64.S:1069
    | RIP: 0010:format_decode+0x240/0x830 lib/vsprintf.c:1996
    | RSP: 0018:ffff88003b2df520 EFLAGS: 00010283
    | RAX: 000000000000003f RBX: ffffffffb5d1e141 RCX: ffff88003b2df670
    | RDX: 0000000000000001 RSI: dffffc0000000000 RDI: ffffffffb5d1e140
    | RBP: ffff88003b2df560 R08: dffffc0000000000 R09: 0000000000000000
    | R10: ffff88003b2df718 R11: 0000000000000000 R12: ffff88003b2df5d8
    | R13: 0000000000000064 R14: ffffffffb5d1e140 R15: 0000000000000000
    | vsnprintf+0x173/0x1700 lib/vsprintf.c:2136
    | sprintf+0xbe/0xf0 lib/vsprintf.c:2386
    | proc_self_get_link+0xfb/0x1c0 fs/proc/self.c:23
    | get_link fs/namei.c:1047 [inline]
    | link_path_walk+0x1041/0x1490 fs/namei.c:2127
    ...

    This happened when the host hit a page fault, and delivered it as in an
    async page fault, while the guest was in an RCU read-side critical
    section. The guest then tries to reschedule in kvm_async_pf_task_wait(),
    but rcu_preempt_note_context_switch() would treat the reschedule as a
    sleep in RCU read-side critical section, which is not allowed (even in
    preemptible RCU). Thus the WARN.

    To cure this, make kvm_async_pf_task_wait() go to the halt path if the
    PF happens in a RCU read-side critical section.

    Reported-by: Sasha Levin
    Cc: "Paul E. McKenney"
    Cc: Peter Zijlstra
    Cc: stable@vger.kernel.org
    Signed-off-by: Boqun Feng
    Signed-off-by: Paolo Bonzini

    Boqun Feng
     
  • ------------[ cut here ]------------
    WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
    CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G W OE 4.13.0+ #17
    RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
    Call Trace:
    ? emulator_read_emulated+0x15/0x20 [kvm]
    ? segmented_read+0xae/0xf0 [kvm]
    vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
    ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
    x86_emulate_instruction+0x733/0x810 [kvm]
    vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
    ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
    kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
    ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
    kvm_vcpu_ioctl+0x340/0x700 [kvm]
    ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
    ? __fget+0xfc/0x210
    do_vfs_ioctl+0xa4/0x6a0
    ? __fget+0x11d/0x210
    SyS_ioctl+0x79/0x90
    entry_SYSCALL_64_fastpath+0x23/0xc2

    A nested #PF is triggered during L0 emulating instruction for L2. However, it
    doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes
    it by queuing the #PF exception instead ,requesting an immediate VM exit from
    L2 and keeping the exception for L1 pending for a subsequent nested VM exit.

    This should actually work all the time, making vmx_inject_page_fault_nested
    totally unnecessary. However, that's not working yet, so this patch can work
    around the issue in the meanwhile.

    Cc: Paolo Bonzini
    Cc: Radim Krčmář
    Signed-off-by: Wanpeng Li
    Signed-off-by: Paolo Bonzini

    Wanpeng Li
     
  • System will hang if user set sysctl_sched_time_avg to 0:

    [root@XXX ~]# sysctl kernel.sched_time_avg_ms=0

    Stack traceback for pid 0
    0xffff883f6406c600 0 0 1 3 R 0xffff883f6406cf50 *swapper/3
    ffff883f7ccc3ae8 0000000000000018 ffffffff810c4dd0 0000000000000000
    0000000000017800 ffff883f7ccc3d78 0000000000000003 ffff883f7ccc3bf8
    ffffffff810c4fc9 ffff883f7ccc3c08 00000000810c5043 ffff883f7ccc3c08
    Call Trace:
    [] ? update_group_capacity+0x110/0x200
    [] ? update_sd_lb_stats+0x109/0x600
    [] ? find_busiest_group+0x47/0x530
    [] ? load_balance+0x194/0x900
    [] ? update_rq_clock.part.83+0x1a/0xe0
    [] ? rebalance_domains+0x152/0x290
    [] ? run_rebalance_domains+0xdc/0x1d0
    [] ? __do_softirq+0xfb/0x320
    [] ? irq_exit+0x125/0x130
    [] ? scheduler_ipi+0x97/0x160
    [] ? smp_reschedule_interrupt+0x29/0x30
    [] ? reschedule_interrupt+0x6e/0x80
    [] ? cpuidle_enter_state+0xcc/0x230
    [] ? cpuidle_enter_state+0x9c/0x230
    [] ? cpuidle_enter+0x17/0x20
    [] ? cpu_startup_entry+0x38c/0x420
    [] ? start_secondary+0x173/0x1e0

    Because divide-by-zero error happens in function:

    update_group_capacity()
    update_cpu_capacity()
    scale_rt_capacity()
    {
    ...
    total = sched_avg_period() + delta;
    used = div_u64(avg, total);
    ...
    }

    To fix this issue, check user input value of sysctl_sched_time_avg, keep
    it unchanged when hitting invalid input, and set the minimum limit of
    sysctl_sched_time_avg to 1 ms.

    Reported-by: James Puthukattukaran
    Signed-off-by: Ethan Zhao
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: efault@gmx.de
    Cc: ethan.kernel@gmail.com
    Cc: keescook@chromium.org
    Cc: mcgrof@kernel.org
    Cc:
    Link: http://lkml.kernel.org/r/1504504774-18253-1-git-send-email-ethan.zhao@oracle.com
    Signed-off-by: Ingo Molnar

    Ethan Zhao
     
  • The kernel test bot (run by Xiaolong Ye) reported that the following commit:

    f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")

    is causing double faults in a kernel compiled with GCC 4.4.

    Linus subsequently diagnosed the crash pattern and the buggy commit and found that
    the issue is with this code:

    register unsigned int __asm_call_sp asm("esp");
    #define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)

    Even on a 64-bit kernel, it's using ESP instead of RSP. That causes GCC
    to produce the following bogus code:

    ffffffff8147461d: 89 e0 mov %esp,%eax
    ffffffff8147461f: 4c 89 f7 mov %r14,%rdi
    ffffffff81474622: 4c 89 fe mov %r15,%rsi
    ffffffff81474625: ba 20 00 00 00 mov $0x20,%edx
    ffffffff8147462a: 89 c4 mov %eax,%esp
    ffffffff8147462c: e8 bf 52 05 00 callq ffffffff814c98f0

    Despite the absurdity of it backing up and restoring the stack pointer
    for no reason, the bug is actually the fact that it's only backing up
    and restoring the lower 32 bits of the stack pointer. The upper 32 bits
    are getting cleared out, corrupting the stack pointer.

    So change the '__asm_call_sp' register variable to be associated with
    the actual full-size stack pointer.

    This also requires changing the __ASM_SEL() macro to be based on the
    actual compiled arch size, rather than the CONFIG value, because
    CONFIG_X86_64 compiles some files with '-m32' (e.g., realmode and vdso).
    Otherwise Clang fails to build the kernel because it complains about the
    use of a 64-bit register (RSP) in a 32-bit file.

    Reported-and-Bisected-and-Tested-by: kernel test robot
    Diagnosed-by: Linus Torvalds
    Signed-off-by: Josh Poimboeuf
    Cc: Alexander Potapenko
    Cc: Andrey Ryabinin
    Cc: Andy Lutomirski
    Cc: Arnd Bergmann
    Cc: Dmitriy Vyukov
    Cc: LKP
    Cc: Linus Torvalds
    Cc: Matthias Kaehlcke
    Cc: Miguel Bernal Marin
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")
    Link: http://lkml.kernel.org/r/20170928215826.6sdpmwtkiydiytim@treble
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • Currently TASK_PARKED is masqueraded as TASK_INTERRUPTIBLE, give it
    its own print state because it will not in fact get woken by regular
    wakeups and is a long-term state.

    This requires moving TASK_PARKED into the TASK_REPORT mask, and since
    that latter needs to be a contiguous bitmask, we need to shuffle the
    bits around a bit.

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • Markus reported that tasks in TASK_IDLE state are reported by SysRq-W,
    which results in undesirable clutter.

    Reported-by: Markus Trippelsdorf
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • Markus reported that kthreads that idle using TASK_IDLE instead of
    TASK_INTERRUPTIBLE are reported in as TASK_UNINTERRUPTIBLE and things
    like htop mark those red.

    This is undesirable, so add an explicit state for TASK_IDLE.

    Reported-by: Markus Trippelsdorf
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • Remove yet another task-state char instance.

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra