Merge tag 'kvmarm-fixes-for-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 28 Mar 2019 18:07:30 +0000 (19:07 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 28 Mar 2019 18:07:30 +0000 (19:07 +0100)
KVM/ARM fixes for 5.1

- Fix THP handling in the presence of pre-existing PTEs
- Honor request for PTE mappings even when THPs are available
- GICv4 performance improvement
- Take the srcu lock when writing to guest-controlled ITS data structures
- Reset the virtual PMU in preemptible context
- Various cleanups

346 files changed:
Documentation/devicetree/bindings/interrupt-controller/renesas,irqc.txt
Documentation/virtual/kvm/api.txt
Documentation/virtual/kvm/mmu.txt
MAINTAINERS
Makefile
arch/alpha/include/asm/Kbuild
arch/alpha/include/uapi/asm/kvm_para.h [deleted file]
arch/arc/Kconfig
arch/arc/Makefile
arch/arc/boot/dts/abilis_tb100.dtsi
arch/arc/boot/dts/abilis_tb100_dvk.dts
arch/arc/boot/dts/abilis_tb101.dtsi
arch/arc/boot/dts/abilis_tb101_dvk.dts
arch/arc/boot/dts/abilis_tb10x.dtsi
arch/arc/boot/dts/axc001.dtsi
arch/arc/boot/dts/axc003.dtsi
arch/arc/boot/dts/axc003_idu.dtsi
arch/arc/boot/dts/axs10x_mb.dtsi
arch/arc/boot/dts/hsdk.dts
arch/arc/boot/dts/vdk_axc003.dtsi
arch/arc/boot/dts/vdk_axc003_idu.dtsi
arch/arc/boot/dts/vdk_axs10x_mb.dtsi
arch/arc/configs/hsdk_defconfig
arch/arc/include/asm/Kbuild
arch/arc/include/asm/arcregs.h
arch/arc/include/asm/irqflags-arcv2.h
arch/arc/include/asm/perf_event.h
arch/arc/include/asm/spinlock.h
arch/arc/include/uapi/asm/Kbuild
arch/arc/kernel/head.S
arch/arc/kernel/intc-arcv2.c
arch/arc/kernel/setup.c
arch/arc/kernel/troubleshoot.c
arch/arc/lib/Makefile
arch/arc/lib/memcpy-archs-unaligned.S [new file with mode: 0644]
arch/arc/plat-eznps/Kconfig
arch/arm/include/uapi/asm/Kbuild
arch/arm/include/uapi/asm/kvm_para.h [deleted file]
arch/arm/mach-cns3xxx/core.c
arch/arm64/Kconfig
arch/arm64/include/asm/cputype.h
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/probes/kprobes.c
arch/arm64/kernel/stacktrace.c
arch/c6x/include/asm/Kbuild
arch/c6x/include/uapi/asm/Kbuild
arch/h8300/include/asm/Kbuild
arch/h8300/include/uapi/asm/Kbuild
arch/hexagon/include/asm/Kbuild
arch/hexagon/include/uapi/asm/kvm_para.h [deleted file]
arch/ia64/include/asm/Kbuild
arch/ia64/include/uapi/asm/Kbuild
arch/m68k/include/asm/Kbuild
arch/m68k/include/uapi/asm/Kbuild
arch/microblaze/include/asm/Kbuild
arch/microblaze/include/uapi/asm/Kbuild
arch/mips/bcm47xx/workarounds.c
arch/mips/include/asm/jump_label.h
arch/mips/include/uapi/asm/posix_types.h
arch/mips/kernel/vmlinux.lds.S
arch/mips/loongson64/lemote-2f/irq.c
arch/nios2/include/asm/Kbuild
arch/nios2/include/uapi/asm/Kbuild
arch/openrisc/include/asm/Kbuild
arch/openrisc/include/uapi/asm/Kbuild
arch/parisc/include/asm/Kbuild
arch/parisc/include/uapi/asm/Kbuild
arch/powerpc/include/asm/mmu.h
arch/powerpc/include/asm/vdso_datapage.h
arch/powerpc/kernel/cpu_setup_6xx.S
arch/powerpc/kernel/head_32.S
arch/powerpc/kernel/security.c
arch/powerpc/kernel/vdso64/gettimeofday.S
arch/powerpc/mm/hash_low_32.S
arch/sh/include/asm/Kbuild
arch/sh/include/uapi/asm/Kbuild
arch/sparc/include/asm/Kbuild
arch/sparc/include/uapi/asm/kvm_para.h [deleted file]
arch/unicore32/include/asm/Kbuild
arch/unicore32/include/uapi/asm/Kbuild
arch/x86/boot/string.c
arch/x86/hyperv/hv_init.c
arch/x86/include/asm/cpu_device_id.h
arch/x86/include/asm/kvm_host.h
arch/x86/include/asm/processor-cyrix.h
arch/x86/kernel/aperture_64.c
arch/x86/kernel/cpu/cyrix.c
arch/x86/kernel/cpu/microcode/core.c
arch/x86/kernel/hpet.c
arch/x86/kernel/hw_breakpoint.c
arch/x86/kernel/mpparse.c
arch/x86/kvm/hyperv.c
arch/x86/kvm/mmu.c
arch/x86/kvm/mmutrace.h
arch/x86/kvm/svm.c
arch/x86/kvm/vmx/nested.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/vmx/vmx.h
arch/x86/kvm/x86.c
arch/x86/lib/csum-partial_64.c
arch/x86/mm/pti.c
arch/xtensa/include/asm/Kbuild
arch/xtensa/include/uapi/asm/Kbuild
block/bio.c
block/blk-cgroup.c
block/blk-iolatency.c
block/blk-mq.c
block/blk-mq.h
block/blk-sysfs.c
drivers/acpi/utils.c
drivers/auxdisplay/Kconfig
drivers/auxdisplay/Makefile
drivers/auxdisplay/charlcd.c
drivers/auxdisplay/hd44780.c
drivers/auxdisplay/panel.c
drivers/base/power/domain.c
drivers/base/swnode.c
drivers/block/loop.c
drivers/block/paride/pcd.c
drivers/block/paride/pf.c
drivers/block/rbd.c
drivers/clocksource/clps711x-timer.c
drivers/clocksource/mips-gic-timer.c
drivers/clocksource/tcb_clksrc.c
drivers/clocksource/timer-riscv.c
drivers/clocksource/timer-ti-dm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
drivers/gpu/drm/exynos/exynos_mixer.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gpu_error.c
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/nouveau/nouveau_debugfs.c
drivers/gpu/drm/nouveau/nouveau_dmem.c
drivers/gpu/drm/udl/udl_gem.c
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
drivers/infiniband/hw/i40iw/i40iw_utils.c
drivers/infiniband/hw/mlx4/alias_GUID.c
drivers/infiniband/hw/mlx5/devx.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/qp.c
drivers/iommu/amd_iommu.c
drivers/iommu/intel-iommu.c
drivers/iommu/iova.c
drivers/irqchip/irq-brcmstb-l2.c
drivers/irqchip/irq-gic-v3-its.c
drivers/irqchip/irq-gic.c
drivers/irqchip/irq-imx-irqsteer.c
drivers/irqchip/irq-mbigen.c
drivers/irqchip/irq-mmp.c
drivers/irqchip/irq-mvebu-sei.c
drivers/irqchip/irq-stm32-exti.c
drivers/mmc/host/alcor.c
drivers/mmc/host/davinci_mmc.c
drivers/mmc/host/mxcmmc.c
drivers/mmc/host/pxamci.c
drivers/mmc/host/renesas_sdhi_core.c
drivers/mmc/host/sdhci-omap.c
drivers/net/ethernet/mellanox/mlx5/core/qp.c
drivers/platform/chrome/cros_ec_debugfs.c
drivers/platform/chrome/wilco_ec/mailbox.c
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/ibmvscsi/ibmvscsi.c
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_transport_iscsi.c
drivers/thermal/broadcom/bcm2835_thermal.c
drivers/thermal/cpu_cooling.c
drivers/thermal/intel/int340x_thermal/int3400_thermal.c
drivers/thermal/intel/intel_powerclamp.c
drivers/thermal/mtk_thermal.c
drivers/thermal/samsung/exynos_tmu.c
fs/block_dev.c
fs/cifs/cifsfs.c
fs/cifs/cifsfs.h
fs/cifs/file.c
fs/cifs/smb2maperror.c
fs/cifs/smb2pdu.c
fs/cifs/trace.h
fs/ext4/ext4_jbd2.h
fs/ext4/file.c
fs/ext4/indirect.c
fs/ext4/inode.c
fs/ext4/ioctl.c
fs/ext4/resize.c
fs/ext4/super.c
fs/io_uring.c
fs/iomap.c
fs/notify/fanotify/fanotify_user.c
fs/notify/inotify/inotify_user.c
fs/proc/kcore.c
fs/udf/inode.c
fs/udf/truncate.c
fs/udf/udfdecl.h
include/linux/blk-mq.h
include/linux/blk_types.h
include/linux/blkdev.h
include/linux/ceph/libceph.h
include/linux/irq.h
include/linux/irqchip/arm-gic.h
include/linux/kcore.h
include/linux/mlx5/qp.h
include/linux/sbitmap.h
include/linux/uio.h
include/misc/charlcd.h
include/uapi/linux/Kbuild
kernel/events/core.c
kernel/futex.c
kernel/irq/devres.c
kernel/irq/manage.c
kernel/sched/core.c
kernel/sched/cpufreq_schedutil.c
kernel/sched/fair.c
kernel/time/jiffies.c
kernel/watchdog.c
kernel/workqueue.c
net/ceph/ceph_common.c
net/ceph/mon_client.c
security/selinux/ss/policydb.c
sound/drivers/opl3/opl3_voice.h
sound/firewire/motu/motu.c
sound/isa/sb/sb8.c
sound/pci/echoaudio/echoaudio.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_realtek.c
tools/arch/arm64/include/uapi/asm/unistd.h
tools/bpf/bpftool/prog.c
tools/build/Makefile.feature
tools/build/feature/test-all.c
tools/include/uapi/asm-generic/unistd.h
tools/include/uapi/linux/in.h
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf.h
tools/lib/bpf/libbpf.map
tools/objtool/check.c
tools/perf/Documentation/Build.txt
tools/perf/Documentation/perf-config.txt
tools/perf/Documentation/perf-record.txt
tools/perf/Documentation/perf-report.txt
tools/perf/Documentation/perf-script.txt
tools/perf/Documentation/perf-stat.txt
tools/perf/Documentation/tips.txt
tools/perf/Makefile.config
tools/perf/arch/x86/entry/syscalls/syscall_64.tbl
tools/perf/arch/x86/util/Build
tools/perf/arch/x86/util/archinsn.c [new file with mode: 0644]
tools/perf/bench/epoll-ctl.c
tools/perf/bench/epoll-wait.c
tools/perf/builtin-list.c
tools/perf/builtin-record.c
tools/perf/builtin-report.c
tools/perf/builtin-script.c
tools/perf/builtin-stat.c
tools/perf/builtin-top.c
tools/perf/builtin.h
tools/perf/perf.c
tools/perf/perf.h
tools/perf/pmu-events/arch/powerpc/power8/other.json
tools/perf/pmu-events/arch/x86/amdfam17h/branch.json [new file with mode: 0644]
tools/perf/pmu-events/arch/x86/amdfam17h/cache.json [new file with mode: 0644]
tools/perf/pmu-events/arch/x86/amdfam17h/core.json [new file with mode: 0644]
tools/perf/pmu-events/arch/x86/amdfam17h/floating-point.json [new file with mode: 0644]
tools/perf/pmu-events/arch/x86/amdfam17h/memory.json [new file with mode: 0644]
tools/perf/pmu-events/arch/x86/amdfam17h/other.json [new file with mode: 0644]
tools/perf/pmu-events/arch/x86/mapfile.csv
tools/perf/scripts/python/export-to-postgresql.py
tools/perf/scripts/python/export-to-sqlite.py
tools/perf/scripts/python/exported-sql-viewer.py
tools/perf/tests/attr/test-record-C0
tools/perf/tests/attr/test-record-basic
tools/perf/tests/attr/test-record-branch-any
tools/perf/tests/attr/test-record-branch-filter-any
tools/perf/tests/attr/test-record-branch-filter-any_call
tools/perf/tests/attr/test-record-branch-filter-any_ret
tools/perf/tests/attr/test-record-branch-filter-hv
tools/perf/tests/attr/test-record-branch-filter-ind_call
tools/perf/tests/attr/test-record-branch-filter-k
tools/perf/tests/attr/test-record-branch-filter-u
tools/perf/tests/attr/test-record-count
tools/perf/tests/attr/test-record-data
tools/perf/tests/attr/test-record-freq
tools/perf/tests/attr/test-record-graph-default
tools/perf/tests/attr/test-record-graph-dwarf
tools/perf/tests/attr/test-record-graph-fp
tools/perf/tests/attr/test-record-group
tools/perf/tests/attr/test-record-group-sampling
tools/perf/tests/attr/test-record-group1
tools/perf/tests/attr/test-record-no-buffering
tools/perf/tests/attr/test-record-no-inherit
tools/perf/tests/attr/test-record-no-samples
tools/perf/tests/attr/test-record-period
tools/perf/tests/attr/test-record-raw
tools/perf/tests/backward-ring-buffer.c
tools/perf/tests/evsel-tp-sched.c
tools/perf/tests/expr.c
tools/perf/tests/openat-syscall-all-cpus.c
tools/perf/ui/browser.c
tools/perf/ui/browsers/Build
tools/perf/ui/browsers/annotate.c
tools/perf/ui/browsers/hists.c
tools/perf/ui/browsers/res_sample.c [new file with mode: 0644]
tools/perf/ui/browsers/scripts.c
tools/perf/util/annotate.c
tools/perf/util/annotate.h
tools/perf/util/archinsn.h [new file with mode: 0644]
tools/perf/util/bpf-event.c
tools/perf/util/bpf-event.h
tools/perf/util/build-id.c
tools/perf/util/config.c
tools/perf/util/data.c
tools/perf/util/data.h
tools/perf/util/dso.c
tools/perf/util/dso.h
tools/perf/util/env.c
tools/perf/util/env.h
tools/perf/util/evlist.c
tools/perf/util/evlist.h
tools/perf/util/evsel.c
tools/perf/util/evsel.h
tools/perf/util/header.c
tools/perf/util/header.h
tools/perf/util/hist.c
tools/perf/util/hist.h
tools/perf/util/map.c
tools/perf/util/ordered-events.c
tools/perf/util/parse-events.c
tools/perf/util/probe-event.c
tools/perf/util/session.c
tools/perf/util/sort.c
tools/perf/util/sort.h
tools/perf/util/stat.c
tools/perf/util/symbol.c
tools/perf/util/symbol_conf.h
tools/perf/util/time-utils.c
tools/perf/util/time-utils.h
tools/power/x86/turbostat/turbostat.c
tools/testing/selftests/kvm/Makefile
tools/testing/selftests/kvm/include/kvm_util.h
tools/testing/selftests/kvm/lib/kvm_util.c
tools/testing/selftests/kvm/x86_64/cr4_cpuid_sync_test.c
tools/testing/selftests/kvm/x86_64/state_test.c
virt/kvm/eventfd.c
virt/kvm/kvm_main.c

index 8de96a4fb2d574095cb088744f405a1bab5e87f2..f977ea7617f68235f19d801d855e54bbd6f25b02 100644 (file)
@@ -16,6 +16,7 @@ Required properties:
     - "renesas,irqc-r8a7793" (R-Car M2-N)
     - "renesas,irqc-r8a7794" (R-Car E2)
     - "renesas,intc-ex-r8a774a1" (RZ/G2M)
+    - "renesas,intc-ex-r8a774c0" (RZ/G2E)
     - "renesas,intc-ex-r8a7795" (R-Car H3)
     - "renesas,intc-ex-r8a7796" (R-Car M3-W)
     - "renesas,intc-ex-r8a77965" (R-Car M3-N)
index 7de9eee73fcd9d533aec2c1bc88d413f6216db73..67068c47c591a5ce8fc373313d46f434863ef54b 100644 (file)
@@ -5,25 +5,32 @@ The Definitive KVM (Kernel-based Virtual Machine) API Documentation
 ----------------------
 
 The kvm API is a set of ioctls that are issued to control various aspects
-of a virtual machine.  The ioctls belong to three classes
+of a virtual machine.  The ioctls belong to three classes:
 
  - System ioctls: These query and set global attributes which affect the
    whole kvm subsystem.  In addition a system ioctl is used to create
-   virtual machines
+   virtual machines.
 
  - VM ioctls: These query and set attributes that affect an entire virtual
    machine, for example memory layout.  In addition a VM ioctl is used to
-   create virtual cpus (vcpus).
+   create virtual cpus (vcpus) and devices.
 
-   Only run VM ioctls from the same process (address space) that was used
-   to create the VM.
+   VM ioctls must be issued from the same process (address space) that was
+   used to create the VM.
 
  - vcpu ioctls: These query and set attributes that control the operation
    of a single virtual cpu.
 
-   Only run vcpu ioctls from the same thread that was used to create the
-   vcpu.
+   vcpu ioctls should be issued from the same thread that was used to create
+   the vcpu, except for asynchronous vcpu ioctl that are marked as such in
+   the documentation.  Otherwise, the first ioctl after switching threads
+   could see a performance impact.
 
+ - device ioctls: These query and set attributes that control the operation
+   of a single device.
+
+   device ioctls must be issued from the same process (address space) that
+   was used to create the VM.
 
 2. File descriptors
 -------------------
@@ -32,17 +39,34 @@ The kvm API is centered around file descriptors.  An initial
 open("/dev/kvm") obtains a handle to the kvm subsystem; this handle
 can be used to issue system ioctls.  A KVM_CREATE_VM ioctl on this
 handle will create a VM file descriptor which can be used to issue VM
-ioctls.  A KVM_CREATE_VCPU ioctl on a VM fd will create a virtual cpu
-and return a file descriptor pointing to it.  Finally, ioctls on a vcpu
-fd can be used to control the vcpu, including the important task of
-actually running guest code.
+ioctls.  A KVM_CREATE_VCPU or KVM_CREATE_DEVICE ioctl on a VM fd will
+create a virtual cpu or device and return a file descriptor pointing to
+the new resource.  Finally, ioctls on a vcpu or device fd can be used
+to control the vcpu or device.  For vcpus, this includes the important
+task of actually running guest code.
 
 In general file descriptors can be migrated among processes by means
 of fork() and the SCM_RIGHTS facility of unix domain socket.  These
 kinds of tricks are explicitly not supported by kvm.  While they will
 not cause harm to the host, their actual behavior is not guaranteed by
-the API.  The only supported use is one virtual machine per process,
-and one vcpu per thread.
+the API.  See "General description" for details on the ioctl usage
+model that is supported by KVM.
+
+It is important to note that althought VM ioctls may only be issued from
+the process that created the VM, a VM's lifecycle is associated with its
+file descriptor, not its creator (process).  In other words, the VM and
+its resources, *including the associated address space*, are not freed
+until the last reference to the VM's file descriptor has been released.
+For example, if fork() is issued after ioctl(KVM_CREATE_VM), the VM will
+not be freed until both the parent (original) process and its child have
+put their references to the VM's file descriptor.
+
+Because a VM's resources are not freed until the last reference to its
+file descriptor is released, creating additional references to a VM via
+via fork(), dup(), etc... without careful consideration is strongly
+discouraged and may have unwanted side effects, e.g. memory allocated
+by and on behalf of the VM's process may not be freed/unaccounted when
+the VM is shut down.
 
 
 It is important to note that althought VM ioctls may only be issued from
@@ -515,11 +539,15 @@ c) KVM_INTERRUPT_SET_LEVEL
 Note that any value for 'irq' other than the ones stated above is invalid
 and incurs unexpected behavior.
 
+This is an asynchronous vcpu ioctl and can be invoked from any thread.
+
 MIPS:
 
 Queues an external interrupt to be injected into the virtual CPU. A negative
 interrupt number dequeues the interrupt.
 
+This is an asynchronous vcpu ioctl and can be invoked from any thread.
+
 
 4.17 KVM_DEBUG_GUEST
 
@@ -1086,14 +1114,12 @@ struct kvm_userspace_memory_region {
 #define KVM_MEM_LOG_DIRTY_PAGES        (1UL << 0)
 #define KVM_MEM_READONLY       (1UL << 1)
 
-This ioctl allows the user to create or modify a guest physical memory
-slot.  When changing an existing slot, it may be moved in the guest
-physical memory space, or its flags may be modified.  It may not be
-resized.  Slots may not overlap in guest physical address space.
-Bits 0-15 of "slot" specifies the slot id and this value should be
-less than the maximum number of user memory slots supported per VM.
-The maximum allowed slots can be queried using KVM_CAP_NR_MEMSLOTS,
-if this capability is supported by the architecture.
+This ioctl allows the user to create, modify or delete a guest physical
+memory slot.  Bits 0-15 of "slot" specify the slot id and this value
+should be less than the maximum number of user memory slots supported per
+VM.  The maximum allowed slots can be queried using KVM_CAP_NR_MEMSLOTS,
+if this capability is supported by the architecture.  Slots may not
+overlap in guest physical address space.
 
 If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 of "slot"
 specifies the address space which is being modified.  They must be
@@ -1102,6 +1128,10 @@ KVM_CAP_MULTI_ADDRESS_SPACE capability.  Slots in separate address spaces
 are unrelated; the restriction on overlapping slots only applies within
 each address space.
 
+Deleting a slot is done by passing zero for memory_size.  When changing
+an existing slot, it may be moved in the guest physical memory space,
+or its flags may be modified, but it may not be resized.
+
 Memory for the region is taken starting at the address denoted by the
 field userspace_addr, which must point at user addressable memory for
 the entire memory slot size.  Any object may back this memory, including
@@ -2493,7 +2523,7 @@ KVM_S390_MCHK (vm, vcpu) - machine check interrupt; cr 14 bits in parm,
                            machine checks needing further payload are not
                            supported by this ioctl)
 
-Note that the vcpu ioctl is asynchronous to vcpu execution.
+This is an asynchronous vcpu ioctl and can be invoked from any thread.
 
 4.78 KVM_PPC_GET_HTAB_FD
 
@@ -3042,8 +3072,7 @@ KVM_S390_INT_EMERGENCY - sigp emergency; parameters in .emerg
 KVM_S390_INT_EXTERNAL_CALL - sigp external call; parameters in .extcall
 KVM_S390_MCHK - machine check interrupt; parameters in .mchk
 
-
-Note that the vcpu ioctl is asynchronous to vcpu execution.
+This is an asynchronous vcpu ioctl and can be invoked from any thread.
 
 4.94 KVM_S390_GET_IRQ_STATE
 
index f365102c80f5dd64133cbe60a8a4fd76fc86393d..2efe0efc516e1624e89f3e60def8551bf10c05e7 100644 (file)
@@ -142,7 +142,7 @@ Shadow pages contain the following information:
     If clear, this page corresponds to a guest page table denoted by the gfn
     field.
   role.quadrant:
-    When role.cr4_pae=0, the guest uses 32-bit gptes while the host uses 64-bit
+    When role.gpte_is_8_bytes=0, the guest uses 32-bit gptes while the host uses 64-bit
     sptes.  That means a guest page table contains more ptes than the host,
     so multiple shadow pages are needed to shadow one guest page.
     For first-level shadow pages, role.quadrant can be 0 or 1 and denotes the
@@ -158,9 +158,9 @@ Shadow pages contain the following information:
     The page is invalid and should not be used.  It is a root page that is
     currently pinned (by a cpu hardware register pointing to it); once it is
     unpinned it will be destroyed.
-  role.cr4_pae:
-    Contains the value of cr4.pae for which the page is valid (e.g. whether
-    32-bit or 64-bit gptes are in use).
+  role.gpte_is_8_bytes:
+    Reflects the size of the guest PTE for which the page is valid, i.e. '1'
+    if 64-bit gptes are in use, '0' if 32-bit gptes are in use.
   role.nxe:
     Contains the value of efer.nxe for which the page is valid.
   role.cr0_wp:
@@ -173,6 +173,9 @@ Shadow pages contain the following information:
     Contains the value of cr4.smap && !cr0.wp for which the page is valid
     (pages for which this is true are different from other pages; see the
     treatment of cr0.wp=0 below).
+  role.ept_sp:
+    This is a virtual flag to denote a shadowed nested EPT page.  ept_sp
+    is true if "cr0_wp && smap_andnot_wp", an otherwise invalid combination.
   role.smm:
     Is 1 if the page is valid in system management mode.  This field
     determines which of the kvm_memslots array was used to build this
index e17ebf70b5480ecc232ce1f62aedf95a03b5f403..3e5a5d263f2992b77c4bbc884969af279513ee19 100644 (file)
@@ -8096,6 +8096,16 @@ F:       include/linux/iommu.h
 F:     include/linux/of_iommu.h
 F:     include/linux/iova.h
 
+IO_URING
+M:     Jens Axboe <axboe@kernel.dk>
+L:     linux-block@vger.kernel.org
+L:     linux-fsdevel@vger.kernel.org
+T:     git git://git.kernel.dk/linux-block
+T:     git git://git.kernel.dk/liburing
+S:     Maintained
+F:     fs/io_uring.c
+F:     include/uapi/linux/io_uring.h
+
 IP MASQUERADING
 M:     Juanjo Ciarlante <jjciarla@raiz.uncu.edu.ar>
 S:     Maintained
index 99c0530489ef000781e25e8e677e5332d328628f..c0a34064c5744e44ca696b3dd5bdb2ea809384e0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 5
 PATCHLEVEL = 1
 SUBLEVEL = 0
-EXTRAVERSION = -rc1
+EXTRAVERSION = -rc2
 NAME = Shy Crocodile
 
 # *DOCUMENTATION*
index dc0ab28baca14b5a2eb0aa0064255d023421612c..70b783333965e875a7cb4f0a110327cea46cd663 100644 (file)
@@ -6,6 +6,7 @@ generic-y += exec.h
 generic-y += export.h
 generic-y += fb.h
 generic-y += irq_work.h
+generic-y += kvm_para.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
 generic-y += preempt.h
diff --git a/arch/alpha/include/uapi/asm/kvm_para.h b/arch/alpha/include/uapi/asm/kvm_para.h
deleted file mode 100644 (file)
index baacc49..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#include <asm-generic/kvm_para.h>
index df55672c59e6e4b99f5846f12944325c227cab03..c781e45d1d9953267b977bc094e0d1acde0ee623 100644 (file)
@@ -144,11 +144,11 @@ config ARC_CPU_770
          Support for ARC770 core introduced with Rel 4.10 (Summer 2011)
          This core has a bunch of cool new features:
          -MMU-v3: Variable Page Sz (4k, 8k, 16k), bigger J-TLB (128x4)
-                   Shared Address Spaces (for sharing TLB entries in MMU)
+                  Shared Address Spaces (for sharing TLB entries in MMU)
          -Caches: New Prog Model, Region Flush
          -Insns: endian swap, load-locked/store-conditional, time-stamp-ctr
 
-endif  #ISA_ARCOMPACT
+endif #ISA_ARCOMPACT
 
 config ARC_CPU_HS
        bool "ARC-HS"
@@ -198,7 +198,7 @@ config ARC_SMP_HALT_ON_RESET
          at designated entry point. For other case, all jump to common
          entry point and spin wait for Master's signal.
 
-endif  #SMP
+endif #SMP
 
 config ARC_MCIP
        bool "ARConnect Multicore IP (MCIP) Support "
@@ -249,7 +249,7 @@ config ARC_CACHE_VIPT_ALIASING
        bool "Support VIPT Aliasing D$"
        depends on ARC_HAS_DCACHE && ISA_ARCOMPACT
 
-endif  #ARC_CACHE
+endif #ARC_CACHE
 
 config ARC_HAS_ICCM
        bool "Use ICCM"
@@ -370,7 +370,7 @@ config ARC_FPU_SAVE_RESTORE
          based on actual usage of FPU by a task. Thus our implemn does
          this for all tasks in system.
 
-endif  #ISA_ARCOMPACT
+endif #ISA_ARCOMPACT
 
 config ARC_CANT_LLSC
        def_bool n
@@ -386,6 +386,15 @@ config ARC_HAS_SWAPE
 
 if ISA_ARCV2
 
+config ARC_USE_UNALIGNED_MEM_ACCESS
+       bool "Enable unaligned access in HW"
+       default y
+       select HAVE_EFFICIENT_UNALIGNED_ACCESS
+       help
+         The ARC HS architecture supports unaligned memory access
+         which is disabled by default. Enable unaligned access in
+         hardware and use software to use it
+
 config ARC_HAS_LL64
        bool "Insn: 64bit LDD/STD"
        help
@@ -414,7 +423,7 @@ config ARC_IRQ_NO_AUTOSAVE
          This is programmable and can be optionally disabled in which case
          software INTERRUPT_PROLOGUE/EPILGUE do the needed work
 
-endif  # ISA_ARCV2
+endif # ISA_ARCV2
 
 endmenu   # "ARC CPU Configuration"
 
index df00578c279d4bc0ee03d71089769383440e7cf6..e2b991f75bc5b7bc0d8103d65e938df9b9c038ac 100644 (file)
@@ -28,6 +28,12 @@ cflags-$(CONFIG_ARC_HAS_SWAPE)               += -mswape
 
 ifdef CONFIG_ISA_ARCV2
 
+ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
+cflags-y                               += -munaligned-access
+else
+cflags-y                               += -mno-unaligned-access
+endif
+
 ifndef CONFIG_ARC_HAS_LL64
 cflags-y                               += -mno-ll64
 endif
index 02410b2114334466572c05e651b6227b02e415f0..c0bcd97522bbfcfa96b0f9e0fa992d104df474f7 100644 (file)
@@ -38,7 +38,7 @@
                        clock-div = <6>;
                };
 
-               iomux: iomux@FF10601c {
+               iomux: iomux@ff10601c {
                        /* Port 1 */
                        pctl_tsin_s0: pctl-tsin-s0 {   /* Serial TS-in 0 */
                                abilis,function = "mis0";
                        };
                };
 
-               gpioa: gpio@FF140000 {
+               gpioa: gpio@ff140000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF140000 0x1000>;
+                       reg = <0xff140000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioa";
                };
-               gpiob: gpio@FF141000 {
+               gpiob: gpio@ff141000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF141000 0x1000>;
+                       reg = <0xff141000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiob";
                };
-               gpioc: gpio@FF142000 {
+               gpioc: gpio@ff142000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF142000 0x1000>;
+                       reg = <0xff142000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioc";
                };
-               gpiod: gpio@FF143000 {
+               gpiod: gpio@ff143000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF143000 0x1000>;
+                       reg = <0xff143000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiod";
                };
-               gpioe: gpio@FF144000 {
+               gpioe: gpio@ff144000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF144000 0x1000>;
+                       reg = <0xff144000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioe";
                };
-               gpiof: gpio@FF145000 {
+               gpiof: gpio@ff145000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF145000 0x1000>;
+                       reg = <0xff145000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiof";
                };
-               gpiog: gpio@FF146000 {
+               gpiog: gpio@ff146000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF146000 0x1000>;
+                       reg = <0xff146000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiog";
                };
-               gpioh: gpio@FF147000 {
+               gpioh: gpio@ff147000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF147000 0x1000>;
+                       reg = <0xff147000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioh";
                };
-               gpioi: gpio@FF148000 {
+               gpioi: gpio@ff148000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF148000 0x1000>;
+                       reg = <0xff148000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <12>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioi";
                };
-               gpioj: gpio@FF149000 {
+               gpioj: gpio@ff149000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF149000 0x1000>;
+                       reg = <0xff149000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <32>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioj";
                };
-               gpiok: gpio@FF14a000 {
+               gpiok: gpio@ff14a000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14A000 0x1000>;
+                       reg = <0xff14a000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <22>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiok";
                };
-               gpiol: gpio@FF14b000 {
+               gpiol: gpio@ff14b000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14B000 0x1000>;
+                       reg = <0xff14b000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <4>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiol";
                };
-               gpiom: gpio@FF14c000 {
+               gpiom: gpio@ff14c000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14C000 0x1000>;
+                       reg = <0xff14c000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <4>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiom";
                };
-               gpion: gpio@FF14d000 {
+               gpion: gpio@ff14d000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14D000 0x1000>;
+                       reg = <0xff14d000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <5>;
index 3acf04db80302875d86d4e4de355c077bfabbd02..c968e677db46b01e88f344c52a6232f33fda9556 100644 (file)
        };
 
        soc100 {
-               uart@FF100000 {
+               uart@ff100000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&pctl_uart0>;
                };
-               ethernet@FE100000 {
+               ethernet@fe100000 {
                        phy-mode = "rgmii";
                };
 
-               i2c0: i2c@FF120000 {
+               i2c0: i2c@ff120000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c1: i2c@FF121000 {
+               i2c1: i2c@ff121000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c2: i2c@FF122000 {
+               i2c2: i2c@ff122000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c3: i2c@FF123000 {
+               i2c3: i2c@ff123000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c4: i2c@FF124000 {
+               i2c4: i2c@ff124000 {
                        i2c-sda-hold-time-ns = <432>;
                };
 
index f9e7686044ebee0a4c49e1d4824810e49747256e..6a1615f58f052d3586dda6038e7b2ebc3a55d161 100644 (file)
@@ -38,7 +38,7 @@
                        clock-div = <6>;
                };
 
-               iomux: iomux@FF10601c {
+               iomux: iomux@ff10601c {
                        /* Port 1 */
                        pctl_tsin_s0: pctl-tsin-s0 {   /* Serial TS-in 0 */
                                abilis,function = "mis0";
                        };
                };
 
-               gpioa: gpio@FF140000 {
+               gpioa: gpio@ff140000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF140000 0x1000>;
+                       reg = <0xff140000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioa";
                };
-               gpiob: gpio@FF141000 {
+               gpiob: gpio@ff141000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF141000 0x1000>;
+                       reg = <0xff141000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiob";
                };
-               gpioc: gpio@FF142000 {
+               gpioc: gpio@ff142000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF142000 0x1000>;
+                       reg = <0xff142000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioc";
                };
-               gpiod: gpio@FF143000 {
+               gpiod: gpio@ff143000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF143000 0x1000>;
+                       reg = <0xff143000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiod";
                };
-               gpioe: gpio@FF144000 {
+               gpioe: gpio@ff144000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF144000 0x1000>;
+                       reg = <0xff144000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioe";
                };
-               gpiof: gpio@FF145000 {
+               gpiof: gpio@ff145000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF145000 0x1000>;
+                       reg = <0xff145000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiof";
                };
-               gpiog: gpio@FF146000 {
+               gpiog: gpio@ff146000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF146000 0x1000>;
+                       reg = <0xff146000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <3>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiog";
                };
-               gpioh: gpio@FF147000 {
+               gpioh: gpio@ff147000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF147000 0x1000>;
+                       reg = <0xff147000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <2>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioh";
                };
-               gpioi: gpio@FF148000 {
+               gpioi: gpio@ff148000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF148000 0x1000>;
+                       reg = <0xff148000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <12>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioi";
                };
-               gpioj: gpio@FF149000 {
+               gpioj: gpio@ff149000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF149000 0x1000>;
+                       reg = <0xff149000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <32>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpioj";
                };
-               gpiok: gpio@FF14a000 {
+               gpiok: gpio@ff14a000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14A000 0x1000>;
+                       reg = <0xff14a000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <22>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiok";
                };
-               gpiol: gpio@FF14b000 {
+               gpiol: gpio@ff14b000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14B000 0x1000>;
+                       reg = <0xff14b000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <4>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiol";
                };
-               gpiom: gpio@FF14c000 {
+               gpiom: gpio@ff14c000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14C000 0x1000>;
+                       reg = <0xff14c000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <4>;
                        gpio-ranges = <&iomux 0 0 0>;
                        gpio-ranges-group-names = "gpiom";
                };
-               gpion: gpio@FF14d000 {
+               gpion: gpio@ff14d000 {
                        compatible = "abilis,tb10x-gpio";
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <27 2>;
-                       reg = <0xFF14D000 0x1000>;
+                       reg = <0xff14d000 0x1000>;
                        gpio-controller;
                        #gpio-cells = <2>;
                        abilis,ngpio = <5>;
index 37d88c5dd181fc5c0de3eb8bd7526d84e56f483c..05143ce9c120434a0d64ce892ed593dc038d8cf1 100644 (file)
        };
 
        soc100 {
-               uart@FF100000 {
+               uart@ff100000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&pctl_uart0>;
                };
-               ethernet@FE100000 {
+               ethernet@fe100000 {
                        phy-mode = "rgmii";
                };
 
-               i2c0: i2c@FF120000 {
+               i2c0: i2c@ff120000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c1: i2c@FF121000 {
+               i2c1: i2c@ff121000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c2: i2c@FF122000 {
+               i2c2: i2c@ff122000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c3: i2c@FF123000 {
+               i2c3: i2c@ff123000 {
                        i2c-sda-hold-time-ns = <432>;
                };
-               i2c4: i2c@FF124000 {
+               i2c4: i2c@ff124000 {
                        i2c-sda-hold-time-ns = <432>;
                };
 
index 3121536b25a375883a5eca1b94a3e2a4db372680..2fbf1bdfe6de815f0865865338f225a897a204c5 100644 (file)
@@ -54,7 +54,7 @@
                #size-cells     = <1>;
                device_type     = "soc";
                ranges          = <0xfe000000 0xfe000000 0x02000000
-                               0x000F0000 0x000F0000 0x00010000>;
+                               0x000f0000 0x000f0000 0x00010000>;
                compatible      = "abilis,tb10x", "simple-bus";
 
                pll0: oscillator {
                        clock-output-names = "ahb_clk";
                };
 
-               iomux: iomux@FF10601c {
+               iomux: iomux@ff10601c {
                        compatible = "abilis,tb10x-iomux";
                        #gpio-range-cells = <3>;
-                       reg = <0xFF10601c 0x4>;
+                       reg = <0xff10601c 0x4>;
                };
 
                intc: interrupt-controller {
@@ -88,7 +88,7 @@
                };
                tb10x_ictl: pic@fe002000 {
                        compatible = "abilis,tb10x-ictl";
-                       reg = <0xFE002000 0x20>;
+                       reg = <0xfe002000 0x20>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
                        interrupt-parent = <&intc>;
                                        20 21 22 23 24 25 26 27 28 29 30 31>;
                };
 
-               uart@FF100000 {
+               uart@ff100000 {
                        compatible = "snps,dw-apb-uart";
-                       reg = <0xFF100000 0x100>;
+                       reg = <0xff100000 0x100>;
                        clock-frequency = <166666666>;
                        interrupts = <25 8>;
                        reg-shift = <2>;
                        reg-io-width = <4>;
                        interrupt-parent = <&tb10x_ictl>;
                };
-               ethernet@FE100000 {
+               ethernet@fe100000 {
                        compatible = "snps,dwmac-3.70a","snps,dwmac";
-                       reg = <0xFE100000 0x1058>;
+                       reg = <0xfe100000 0x1058>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <6 8>;
                        interrupt-names = "macirq";
                        clocks = <&ahb_clk>;
                        clock-names = "stmmaceth";
                };
-               dma@FE000000 {
+               dma@fe000000 {
                        compatible = "snps,dma-spear1340";
-                       reg = <0xFE000000 0x400>;
+                       reg = <0xfe000000 0x400>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <14 8>;
                        dma-channels = <6>;
                        multi-block = <1 1 1 1 1 1>;
                };
 
-               i2c0: i2c@FF120000 {
+               i2c0: i2c@ff120000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        compatible = "snps,designware-i2c";
-                       reg = <0xFF120000 0x1000>;
+                       reg = <0xff120000 0x1000>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <12 8>;
                        clocks = <&ahb_clk>;
                };
-               i2c1: i2c@FF121000 {
+               i2c1: i2c@ff121000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        compatible = "snps,designware-i2c";
-                       reg = <0xFF121000 0x1000>;
+                       reg = <0xff121000 0x1000>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <12 8>;
                        clocks = <&ahb_clk>;
                };
-               i2c2: i2c@FF122000 {
+               i2c2: i2c@ff122000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        compatible = "snps,designware-i2c";
-                       reg = <0xFF122000 0x1000>;
+                       reg = <0xff122000 0x1000>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <12 8>;
                        clocks = <&ahb_clk>;
                };
-               i2c3: i2c@FF123000 {
+               i2c3: i2c@ff123000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        compatible = "snps,designware-i2c";
-                       reg = <0xFF123000 0x1000>;
+                       reg = <0xff123000 0x1000>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <12 8>;
                        clocks = <&ahb_clk>;
                };
-               i2c4: i2c@FF124000 {
+               i2c4: i2c@ff124000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        compatible = "snps,designware-i2c";
-                       reg = <0xFF124000 0x1000>;
+                       reg = <0xff124000 0x1000>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <12 8>;
                        clocks = <&ahb_clk>;
                };
 
-               spi0: spi@0xFE010000 {
+               spi0: spi@fe010000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        cell-index = <0>;
                        compatible = "abilis,tb100-spi";
                        num-cs = <1>;
-                       reg = <0xFE010000 0x20>;
+                       reg = <0xfe010000 0x20>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <26 8>;
                        clocks = <&ahb_clk>;
                };
-               spi1: spi@0xFE011000 {
+               spi1: spi@fe011000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        cell-index = <1>;
                        compatible = "abilis,tb100-spi";
                        num-cs = <2>;
-                       reg = <0xFE011000 0x20>;
+                       reg = <0xfe011000 0x20>;
                        interrupt-parent = <&tb10x_ictl>;
                        interrupts = <10 8>;
                        clocks = <&ahb_clk>;
                        interrupts = <20 2>, <19 2>;
                        interrupt-names = "cmd_irq", "event_irq";
                };
-               tb10x_mdsc0: tb10x-mdscr@FF300000 {
+               tb10x_mdsc0: tb10x-mdscr@ff300000 {
                        compatible = "abilis,tb100-mdscr";
-                       reg = <0xFF300000 0x7000>;
+                       reg = <0xff300000 0x7000>;
                        tb100-mdscr-manage-tsin;
                };
-               tb10x_mscr0: tb10x-mdscr@FF307000 {
+               tb10x_mscr0: tb10x-mdscr@ff307000 {
                        compatible = "abilis,tb100-mdscr";
-                       reg = <0xFF307000 0x7000>;
+                       reg = <0xff307000 0x7000>;
                };
                tb10x_scr0: tb10x-mdscr@ff30e000 {
                        compatible = "abilis,tb100-mdscr";
-                       reg = <0xFF30e000 0x4000>;
+                       reg = <0xff30e000 0x4000>;
                        tb100-mdscr-manage-tsin;
                };
                tb10x_scr1: tb10x-mdscr@ff312000 {
                        compatible = "abilis,tb100-mdscr";
-                       reg = <0xFF312000 0x4000>;
+                       reg = <0xff312000 0x4000>;
                        tb100-mdscr-manage-tsin;
                };
                tb10x_wfb: tb10x-wfb@ff319000 {
index fdc266504ada273e6efaf72c18cc8c2e2f48edf2..37be3bf03ad632f75214f82ff984d9f781e68358 100644 (file)
@@ -41,7 +41,7 @@
                 * this GPIO block ORs all interrupts on CPU card (creg,..)
                 * to uplink only 1 IRQ to ARC core intc
                 */
-               dw-apb-gpio@0x2000 {
+               dw-apb-gpio@2000 {
                        compatible = "snps,dw-apb-gpio";
                        reg = < 0x2000 0x80 >;
                        #address-cells = <1>;
@@ -60,7 +60,7 @@
                        };
                };
 
-               debug_uart: dw-apb-uart@0x5000 {
+               debug_uart: dw-apb-uart@5000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x5000 0x100>;
                        clock-frequency = <33333000>;
@@ -88,7 +88,7 @@
         * avoid duplicating the MB dtsi file given that IRQ from
         * this intc to cpu intc are different for axs101 and axs103
         */
-       mb_intc: dw-apb-ictl@0xe0012000 {
+       mb_intc: dw-apb-ictl@e0012000 {
                #interrupt-cells = <1>;
                compatible = "snps,dw-apb-ictl";
                reg = < 0x0 0xe0012000 0x0 0x200 >;
index d75d65ddf8e31db78c58fa9882b90c2e6be2ed4b..effa37536d7ad3a02668e0455ed93220c245c2cb 100644 (file)
@@ -55,7 +55,7 @@
                 * this GPIO block ORs all interrupts on CPU card (creg,..)
                 * to uplink only 1 IRQ to ARC core intc
                 */
-               dw-apb-gpio@0x2000 {
+               dw-apb-gpio@2000 {
                        compatible = "snps,dw-apb-gpio";
                        reg = < 0x2000 0x80 >;
                        #address-cells = <1>;
@@ -74,7 +74,7 @@
                        };
                };
 
-               debug_uart: dw-apb-uart@0x5000 {
+               debug_uart: dw-apb-uart@5000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x5000 0x100>;
                        clock-frequency = <33333000>;
         * external DMA buffer located outside of IOC aperture.
         */
        axs10x_mb {
-               ethernet@0x18000 {
+               ethernet@18000 {
                        dma-coherent;
                };
 
-               ehci@0x40000 {
+               ehci@40000 {
                        dma-coherent;
                };
 
-               ohci@0x60000 {
+               ohci@60000 {
                        dma-coherent;
                };
 
-               mmc@0x15000 {
+               mmc@15000 {
                        dma-coherent;
                };
        };
         * avoid duplicating the MB dtsi file given that IRQ from
         * this intc to cpu intc are different for axs101 and axs103
         */
-       mb_intc: dw-apb-ictl@0xe0012000 {
+       mb_intc: dw-apb-ictl@e0012000 {
                #interrupt-cells = <1>;
                compatible = "snps,dw-apb-ictl";
                reg = < 0x0 0xe0012000 0x0 0x200 >;
                #size-cells = <2>;
                ranges;
                /*
-                * Move frame buffer out of IOC aperture (0x8z-0xAz).
+                * Move frame buffer out of IOC aperture (0x8z-0xaz).
                 */
                frame_buffer: frame_buffer@be000000 {
                        compatible = "shared-dma-pool";
index a05bb737ea6392f5e77cd3830dceb8afe620943e..e401e59f61802f2ef33fcb12854a7f97f896200d 100644 (file)
@@ -62,7 +62,7 @@
                 * this GPIO block ORs all interrupts on CPU card (creg,..)
                 * to uplink only 1 IRQ to ARC core intc
                 */
-               dw-apb-gpio@0x2000 {
+               dw-apb-gpio@2000 {
                        compatible = "snps,dw-apb-gpio";
                        reg = < 0x2000 0x80 >;
                        #address-cells = <1>;
@@ -81,7 +81,7 @@
                        };
                };
 
-               debug_uart: dw-apb-uart@0x5000 {
+               debug_uart: dw-apb-uart@5000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x5000 0x100>;
                        clock-frequency = <33333000>;
         * external DMA buffer located outside of IOC aperture.
         */
        axs10x_mb {
-               ethernet@0x18000 {
+               ethernet@18000 {
                        dma-coherent;
                };
 
-               ehci@0x40000 {
+               ehci@40000 {
                        dma-coherent;
                };
 
-               ohci@0x60000 {
+               ohci@60000 {
                        dma-coherent;
                };
 
-               mmc@0x15000 {
+               mmc@15000 {
                        dma-coherent;
                };
        };
         * avoid duplicating the MB dtsi file given that IRQ from
         * this intc to cpu intc are different for axs101 and axs103
         */
-       mb_intc: dw-apb-ictl@0xe0012000 {
+       mb_intc: dw-apb-ictl@e0012000 {
                #interrupt-cells = <1>;
                compatible = "snps,dw-apb-ictl";
                reg = < 0x0 0xe0012000 0x0 0x200 >;
                #size-cells = <2>;
                ranges;
                /*
-                * Move frame buffer out of IOC aperture (0x8z-0xAz).
+                * Move frame buffer out of IOC aperture (0x8z-0xaz).
                 */
                frame_buffer: frame_buffer@be000000 {
                        compatible = "shared-dma-pool";
index 37bafd44e36d0fed9b85e80ea356cd78df0c1872..4ead6dc9af2f7e3823b332ee9d7ed5df5b920d25 100644 (file)
@@ -72,7 +72,7 @@
                        };
                };
 
-               gmac: ethernet@0x18000 {
+               gmac: ethernet@18000 {
                        #interrupt-cells = <1>;
                        compatible = "snps,dwmac";
                        reg = < 0x18000 0x2000 >;
                        mac-address = [00 00 00 00 00 00]; /* Filled in by U-Boot */
                };
 
-               ehci@0x40000 {
+               ehci@40000 {
                        compatible = "generic-ehci";
                        reg = < 0x40000 0x100 >;
                        interrupts = < 8 >;
                };
 
-               ohci@0x60000 {
+               ohci@60000 {
                        compatible = "generic-ohci";
                        reg = < 0x60000 0x100 >;
                        interrupts = < 8 >;
                 * dw_mci_pltfm_prepare_command() is used in generic platform
                 * code.
                 */
-               mmc@0x15000 {
+               mmc@15000 {
                        compatible = "altr,socfpga-dw-mshc";
                        reg = < 0x15000 0x400 >;
                        fifo-depth = < 16 >;
                        bus-width = < 4 >;
                };
 
-               uart@0x20000 {
+               uart@20000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x20000 0x100>;
                        clock-frequency = <33333333>;
                        reg-io-width = <4>;
                };
 
-               uart@0x21000 {
+               uart@21000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x21000 0x100>;
                        clock-frequency = <33333333>;
                };
 
                /* UART muxed with USB data port (ttyS3) */
-               uart@0x22000 {
+               uart@22000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x22000 0x100>;
                        clock-frequency = <33333333>;
                        reg-io-width = <4>;
                };
 
-               i2c@0x1d000 {
+               i2c@1d000 {
                        compatible = "snps,designware-i2c";
                        reg = <0x1d000 0x100>;
                        clock-frequency = <400000>;
                        #sound-dai-cells = <0>;
                };
 
-               i2c@0x1f000 {
+               i2c@1f000 {
                        compatible = "snps,designware-i2c";
                        #address-cells = <1>;
                        #size-cells = <0>;
                                };
                        };
 
-                       eeprom@0x54{
+                       eeprom@54{
                                compatible = "atmel,24c01";
                                reg = <0x54>;
                                pagesize = <0x8>;
                        };
 
-                       eeprom@0x57{
+                       eeprom@57{
                                compatible = "atmel,24c04";
                                reg = <0x57>;
                                pagesize = <0x8>;
index 43f17b51ee89cca00a0b2eebb7ed045d49de03a0..69bc1c9e8e50d673729a6187fb4f1669971c9cb7 100644 (file)
                cgu_rst: reset-controller@8a0 {
                        compatible = "snps,hsdk-reset";
                        #reset-cells = <1>;
-                       reg = <0x8A0 0x4>, <0xFF0 0x4>;
+                       reg = <0x8a0 0x4>, <0xff0 0x4>;
                };
 
                core_clk: core-clk@0 {
                        compatible = "snps,hsdk-core-pll-clock";
-                       reg = <0x00 0x10>, <0x14B8 0x4>;
+                       reg = <0x00 0x10>, <0x14b8 0x4>;
                        #clock-cells = <0>;
                        clocks = <&input_clk>;
 
                        #clock-cells = <0>;
                };
 
+               dmac_core_clk: dmac-core-clk {
+                       compatible = "fixed-clock";
+                       clock-frequency = <400000000>;
+                       #clock-cells = <0>;
+               };
+
+               dmac_cfg_clk: dmac-gpu-cfg-clk {
+                       compatible = "fixed-clock";
+                       clock-frequency = <200000000>;
+                       #clock-cells = <0>;
+               };
+
                gmac: ethernet@8000 {
                        #interrupt-cells = <1>;
                        compatible = "snps,dwmac";
                        compatible = "snps,hsdk-v1.0-ohci", "generic-ohci";
                        reg = <0x60000 0x100>;
                        interrupts = <15>;
+                       resets = <&cgu_rst HSDK_USB_RESET>;
                        dma-coherent;
                };
 
                        compatible = "snps,hsdk-v1.0-ehci", "generic-ehci";
                        reg = <0x40000 0x100>;
                        interrupts = <15>;
+                       resets = <&cgu_rst HSDK_USB_RESET>;
                        dma-coherent;
                };
 
                                reg = <0>;
                        };
                };
+
+               dmac: dmac@80000 {
+                       compatible = "snps,axi-dma-1.01a";
+                       reg = <0x80000 0x400>;
+                       interrupts = <27>;
+                       clocks = <&dmac_core_clk>, <&dmac_cfg_clk>;
+                       clock-names = "core-clk", "cfgr-clk";
+
+                       dma-channels = <4>;
+                       snps,dma-masters = <2>;
+                       snps,data-width = <3>;
+                       snps,block-size = <4096 4096 4096 4096>;
+                       snps,priority = <0 1 2 3>;
+                       snps,axi-max-burst-len = <16>;
+               };
        };
 
        memory@80000000 {
index 0fd6ba985b164b7752c26544e5d4b6d9684c88be..84e8766c8ca2c6144167ea48e969145e6bebfe71 100644 (file)
@@ -36,7 +36,7 @@
                        #interrupt-cells = <1>;
                };
 
-               debug_uart: dw-apb-uart@0x5000 {
+               debug_uart: dw-apb-uart@5000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x5000 0x100>;
                        clock-frequency = <2403200>;
@@ -49,7 +49,7 @@
 
        };
 
-       mb_intc: dw-apb-ictl@0xe0012000 {
+       mb_intc: dw-apb-ictl@e0012000 {
                #interrupt-cells = <1>;
                compatible = "snps,dw-apb-ictl";
                reg = < 0xe0012000 0x200 >;
index 28956f9a9f3db7e12042821ea72d5a4af0514e2a..eb7e705e8a2789722a449e5abf5d5ad122619f99 100644 (file)
@@ -44,7 +44,7 @@
                        #interrupt-cells = <1>;
                };
 
-               debug_uart: dw-apb-uart@0x5000 {
+               debug_uart: dw-apb-uart@5000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x5000 0x100>;
                        clock-frequency = <2403200>;
@@ -57,7 +57,7 @@
 
        };
 
-       mb_intc: dw-apb-ictl@0xe0012000 {
+       mb_intc: dw-apb-ictl@e0012000 {
                #interrupt-cells = <1>;
                compatible = "snps,dw-apb-ictl";
                reg = < 0xe0012000 0x200 >;
index 48bb4b4cd234ed65a8b4002dbf060f3bc09b7e0d..925d5cc95dbbbf1419b920d4d3e73743ec794dd4 100644 (file)
@@ -36,7 +36,7 @@
                        };
                };
 
-               ethernet@0x18000 {
+               ethernet@18000 {
                        #interrupt-cells = <1>;
                        compatible = "snps,dwmac";
                        reg = < 0x18000 0x2000 >;
                        clock-names = "stmmaceth";
                };
 
-               ehci@0x40000 {
+               ehci@40000 {
                        compatible = "generic-ehci";
                        reg = < 0x40000 0x100 >;
                        interrupts = < 8 >;
                };
 
-               uart@0x20000 {
+               uart@20000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x20000 0x100>;
                        clock-frequency = <2403200>;
@@ -65,7 +65,7 @@
                        reg-io-width = <4>;
                };
 
-               uart@0x21000 {
+               uart@21000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x21000 0x100>;
                        clock-frequency = <2403200>;
@@ -75,7 +75,7 @@
                        reg-io-width = <4>;
                };
 
-               uart@0x22000 {
+               uart@22000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x22000 0x100>;
                        clock-frequency = <2403200>;
                        interrupt-names = "arc_ps2_irq";
                };
 
-               mmc@0x15000 {
+               mmc@15000 {
                        compatible = "snps,dw-mshc";
                        reg = <0x15000 0x400>;
                        fifo-depth = <1024>;
         * Embedded Vision subsystem UIO mappings; only relevant for EV VDK
         *
         * This node is intentionally put outside of MB above becase
-        * it maps areas outside of MB's 0xEz-0xFz.
+        * it maps areas outside of MB's 0xez-0xfz.
         */
-       uio_ev: uio@0xD0000000 {
+       uio_ev: uio@d0000000 {
                compatible = "generic-uio";
-               reg = <0xD0000000 0x2000 0xD1000000 0x2000 0x90000000 0x10000000 0xC0000000 0x10000000>;
+               reg = <0xd0000000 0x2000 0xd1000000 0x2000 0x90000000 0x10000000 0xc0000000 0x10000000>;
                reg-names = "ev_gsa", "ev_ctrl", "ev_shared_mem", "ev_code_mem";
                interrupt-parent = <&mb_intc>;
                interrupts = <23>;
index 6fd3d29546afd2e2f76f40e5a0af57757a5c369a..0e5fd29ed238b5a4dc715a364bde2d9ee88edb58 100644 (file)
@@ -8,6 +8,7 @@ CONFIG_NAMESPACES=y
 # CONFIG_UTS_NS is not set
 # CONFIG_PID_NS is not set
 CONFIG_BLK_DEV_INITRD=y
+CONFIG_BLK_DEV_RAM=y
 CONFIG_EMBEDDED=y
 CONFIG_PERF_EVENTS=y
 # CONFIG_VM_EVENT_COUNTERS is not set
index b41f8881ecc811f2005b763958e779a42da15c36..decc306a3b52c2b96c2e7af7108e7aa171c51c31 100644 (file)
@@ -11,6 +11,7 @@ generic-y += hardirq.h
 generic-y += hw_irq.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += mcs_spinlock.h
index a27eafdc82602f6856b00c5fbd82db72c33cf238..a7d4be87b2f0a8440307f87b00729839d1c9ab3e 100644 (file)
@@ -82,6 +82,7 @@
 #define ECR_V_DTLB_MISS                        0x05
 #define ECR_V_PROTV                    0x06
 #define ECR_V_TRAP                     0x09
+#define ECR_V_MISALIGN                 0x0d
 #endif
 
 /* DTLB Miss and Protection Violation Cause Codes */
@@ -167,14 +168,6 @@ struct bcr_mpy {
 #endif
 };
 
-struct bcr_extn_xymem {
-#ifdef CONFIG_CPU_BIG_ENDIAN
-       unsigned int ram_org:2, num_banks:4, bank_sz:4, ver:8;
-#else
-       unsigned int ver:8, bank_sz:4, num_banks:4, ram_org:2;
-#endif
-};
-
 struct bcr_iccm_arcompact {
 #ifdef CONFIG_CPU_BIG_ENDIAN
        unsigned int base:16, pad:5, sz:3, ver:8;
@@ -312,7 +305,7 @@ struct cpuinfo_arc {
        struct cpuinfo_arc_bpu bpu;
        struct bcr_identity core;
        struct bcr_isa_arcv2 isa;
-       const char *details, *name;
+       const char *release, *name;
        unsigned int vec_base;
        struct cpuinfo_arc_ccm iccm, dccm;
        struct {
@@ -322,7 +315,6 @@ struct cpuinfo_arc {
                             timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
        } extn;
        struct bcr_mpy extn_mpy;
-       struct bcr_extn_xymem extn_xymem;
 };
 
 extern struct cpuinfo_arc cpuinfo_arc700[];
index 8a4f77ea3238e6f017ae24ab6b55e2952637fe04..e66d0339e1d8617ac30050f53d26d926243266e6 100644 (file)
 #define ARCV2_IRQ_DEF_PRIO     1
 
 /* seed value for status register */
-#define ISA_INIT_STATUS_BITS   (STATUS_IE_MASK | STATUS_AD_MASK | \
+#ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
+#define __AD_ENB       STATUS_AD_MASK
+#else
+#define __AD_ENB       0
+#endif
+
+#define ISA_INIT_STATUS_BITS   (STATUS_IE_MASK | __AD_ENB | \
                                        (ARCV2_IRQ_DEF_PRIO << 1))
 
 #ifndef __ASSEMBLY__
index 6958545390f0f847ed3a7745b7325964d7f23f17..9cd7ee4fad390e7806a812b715d2ac90bbe0e56f 100644 (file)
@@ -105,10 +105,10 @@ static const char * const arc_pmu_ev_hw_map[] = {
        [PERF_COUNT_HW_INSTRUCTIONS] = "iall",
        /* All jump instructions that are taken */
        [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmptak",
-       [PERF_COUNT_ARC_BPOK]         = "bpok",   /* NP-NT, PT-T, PNT-NT */
 #ifdef CONFIG_ISA_ARCV2
        [PERF_COUNT_HW_BRANCH_MISSES] = "bpmp",
 #else
+       [PERF_COUNT_ARC_BPOK]         = "bpok",   /* NP-NT, PT-T, PNT-NT */
        [PERF_COUNT_HW_BRANCH_MISSES] = "bpfail", /* NP-T, PT-NT, PNT-T */
 #endif
        [PERF_COUNT_ARC_LDC] = "imemrdc",       /* Instr: mem read cached */
index 2ba04a7db62128148ac303e79e95c2cb2ee2d534..daa914da796886de6a3ae3744e3428d30f3804c7 100644 (file)
@@ -21,8 +21,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
 {
        unsigned int val;
 
-       smp_mb();
-
        __asm__ __volatile__(
        "1:     llock   %[val], [%[slock]]      \n"
        "       breq    %[val], %[LOCKED], 1b   \n"     /* spin while LOCKED */
@@ -34,6 +32,14 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
          [LOCKED]      "r"     (__ARCH_SPIN_LOCK_LOCKED__)
        : "memory", "cc");
 
+       /*
+        * ACQUIRE barrier to ensure load/store after taking the lock
+        * don't "bleed-up" out of the critical section (leak-in is allowed)
+        * http://www.spinics.net/lists/kernel/msg2010409.html
+        *
+        * ARCv2 only has load-load, store-store and all-all barrier
+        * thus need the full all-all barrier
+        */
        smp_mb();
 }
 
@@ -42,8 +48,6 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
 {
        unsigned int val, got_it = 0;
 
-       smp_mb();
-
        __asm__ __volatile__(
        "1:     llock   %[val], [%[slock]]      \n"
        "       breq    %[val], %[LOCKED], 4f   \n"     /* already LOCKED, just bail */
@@ -67,9 +71,7 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
 {
        smp_mb();
 
-       lock->slock = __ARCH_SPIN_LOCK_UNLOCKED__;
-
-       smp_mb();
+       WRITE_ONCE(lock->slock, __ARCH_SPIN_LOCK_UNLOCKED__);
 }
 
 /*
@@ -81,8 +83,6 @@ static inline void arch_read_lock(arch_rwlock_t *rw)
 {
        unsigned int val;
 
-       smp_mb();
-
        /*
         * zero means writer holds the lock exclusively, deny Reader.
         * Otherwise grant lock to first/subseq reader
@@ -113,8 +113,6 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)
 {
        unsigned int val, got_it = 0;
 
-       smp_mb();
-
        __asm__ __volatile__(
        "1:     llock   %[val], [%[rwlock]]     \n"
        "       brls    %[val], %[WR_LOCKED], 4f\n"     /* <= 0: already write locked, bail */
@@ -140,8 +138,6 @@ static inline void arch_write_lock(arch_rwlock_t *rw)
 {
        unsigned int val;
 
-       smp_mb();
-
        /*
         * If reader(s) hold lock (lock < __ARCH_RW_LOCK_UNLOCKED__),
         * deny writer. Otherwise if unlocked grant to writer
@@ -175,8 +171,6 @@ static inline int arch_write_trylock(arch_rwlock_t *rw)
 {
        unsigned int val, got_it = 0;
 
-       smp_mb();
-
        __asm__ __volatile__(
        "1:     llock   %[val], [%[rwlock]]     \n"
        "       brne    %[val], %[UNLOCKED], 4f \n"     /* !UNLOCKED, bail */
@@ -217,17 +211,13 @@ static inline void arch_read_unlock(arch_rwlock_t *rw)
        : [val]         "=&r"   (val)
        : [rwlock]      "r"     (&(rw->counter))
        : "memory", "cc");
-
-       smp_mb();
 }
 
 static inline void arch_write_unlock(arch_rwlock_t *rw)
 {
        smp_mb();
 
-       rw->counter = __ARCH_RW_LOCK_UNLOCKED__;
-
-       smp_mb();
+       WRITE_ONCE(rw->counter, __ARCH_RW_LOCK_UNLOCKED__);
 }
 
 #else  /* !CONFIG_ARC_HAS_LLSC */
@@ -237,10 +227,9 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
        unsigned int val = __ARCH_SPIN_LOCK_LOCKED__;
 
        /*
-        * This smp_mb() is technically superfluous, we only need the one
-        * after the lock for providing the ACQUIRE semantics.
-        * However doing the "right" thing was regressing hackbench
-        * so keeping this, pending further investigation
+        * Per lkmm, smp_mb() is only required after _lock (and before_unlock)
+        * for ACQ and REL semantics respectively. However EX based spinlocks
+        * need the extra smp_mb to workaround a hardware quirk.
         */
        smp_mb();
 
@@ -257,14 +246,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
 #endif
        : "memory");
 
-       /*
-        * ACQUIRE barrier to ensure load/store after taking the lock
-        * don't "bleed-up" out of the critical section (leak-in is allowed)
-        * http://www.spinics.net/lists/kernel/msg2010409.html
-        *
-        * ARCv2 only has load-load, store-store and all-all barrier
-        * thus need the full all-all barrier
-        */
        smp_mb();
 }
 
@@ -309,8 +290,7 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
        : "memory");
 
        /*
-        * superfluous, but keeping for now - see pairing version in
-        * arch_spin_lock above
+        * see pairing version/comment in arch_spin_lock above
         */
        smp_mb();
 }
@@ -344,7 +324,6 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)
        arch_spin_unlock(&(rw->lock_mutex));
        local_irq_restore(flags);
 
-       smp_mb();
        return ret;
 }
 
index 755bb11323d8feb92d12349bf444f151cd8acc29..1c72f04ff75da1a7f6918f00b14116a183a79313 100644 (file)
@@ -1,2 +1 @@
-generic-y += kvm_para.h
 generic-y += ucontext.h
index 30e090625916160acb23df6bfa44e86bcad7192f..8f6e0447dd1702b571b23a3f561f8ed032ae6abf 100644 (file)
        ; gcc 7.3.1 (ARC GNU 2018.03) onwards generates unaligned access
        ; by default
        lr      r5, [status32]
+#ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
        bset    r5, r5, STATUS_AD_BIT
+#else
+       ; Although disabled at reset, bootloader might have enabled it
+       bclr    r5, r5, STATUS_AD_BIT
+#endif
        kflag   r5
 #endif
 .endm
@@ -106,6 +111,7 @@ ENTRY(stext)
        ;    r2 = pointer to uboot provided cmdline or external DTB in mem
        ; These are handled later in handle_uboot_args()
        st      r0, [@uboot_tag]
+       st      r1, [@uboot_magic]
        st      r2, [@uboot_arg]
 
        ; setup "current" tsk and optionally cache it in dedicated r25
index cf18b3e5a934d34c684edcc7aa84533a10f932bf..c0d0124de089b4a456a98c20c5ab6f78913ab36d 100644 (file)
@@ -95,7 +95,7 @@ void arc_init_IRQ(void)
 
        /* setup status32, don't enable intr yet as kernel doesn't want */
        tmp = read_aux_reg(ARC_REG_STATUS32);
-       tmp |= STATUS_AD_MASK | (ARCV2_IRQ_DEF_PRIO << 1);
+       tmp |= ARCV2_IRQ_DEF_PRIO << 1;
        tmp &= ~STATUS_IE_MASK;
        asm volatile("kflag %0  \n"::"r"(tmp));
 }
index 7b2340996cf80fc4ddc382c55d86acbe37d49bf5..a9c88b7e9182f6232b3f319a00865c8c9946b38f 100644 (file)
@@ -36,6 +36,7 @@ unsigned int intr_to_DE_cnt;
 
 /* Part of U-boot ABI: see head.S */
 int __initdata uboot_tag;
+int __initdata uboot_magic;
 char __initdata *uboot_arg;
 
 const struct machine_desc *machine_desc;
@@ -44,29 +45,24 @@ struct task_struct *_current_task[NR_CPUS]; /* For stack switching */
 
 struct cpuinfo_arc cpuinfo_arc700[NR_CPUS];
 
-static const struct id_to_str arc_cpu_rel[] = {
+static const struct id_to_str arc_legacy_rel[] = {
+       /* ID.ARCVER,   Release */
 #ifdef CONFIG_ISA_ARCOMPACT
-       { 0x34, "R4.10"},
-       { 0x35, "R4.11"},
+       { 0x34,         "R4.10"},
+       { 0x35,         "R4.11"},
 #else
-       { 0x51, "R2.0" },
-       { 0x52, "R2.1" },
-       { 0x53, "R3.0" },
-       { 0x54, "R3.10a" },
+       { 0x51,         "R2.0" },
+       { 0x52,         "R2.1" },
+       { 0x53,         "R3.0" },
 #endif
-       { 0x00, NULL   }
+       { 0x00,         NULL   }
 };
 
-static const struct id_to_str arc_cpu_nm[] = {
-#ifdef CONFIG_ISA_ARCOMPACT
-       { 0x20, "ARC 600"   },
-       { 0x30, "ARC 770"   },  /* 750 identified seperately */
-#else
-       { 0x40, "ARC EM"  },
-       { 0x50, "ARC HS38"  },
-       { 0x54, "ARC HS48"  },
-#endif
-       { 0x00, "Unknown"   }
+static const struct id_to_str arc_cpu_rel[] = {
+       /* UARCH.MAJOR, Release */
+       {  0,           "R3.10a"},
+       {  1,           "R3.50a"},
+       {  0xFF,        NULL   }
 };
 
 static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
@@ -116,31 +112,72 @@ static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
        }
 }
 
+static void decode_arc_core(struct cpuinfo_arc *cpu)
+{
+       struct bcr_uarch_build_arcv2 uarch;
+       const struct id_to_str *tbl;
+
+       /*
+        * Up until (including) the first core4 release (0x54) things were
+        * simple: AUX IDENTITY.ARCVER was sufficient to identify arc family
+        * and release: 0x50 to 0x53 was HS38, 0x54 was HS48 (dual issue)
+        */
+
+       if (cpu->core.family < 0x54) { /* includes arc700 */
+
+               for (tbl = &arc_legacy_rel[0]; tbl->id != 0; tbl++) {
+                       if (cpu->core.family == tbl->id) {
+                               cpu->release = tbl->str;
+                               break;
+                       }
+               }
+
+               if (is_isa_arcompact())
+                       cpu->name = "ARC700";
+               else if (tbl->str)
+                       cpu->name = "HS38";
+               else
+                       cpu->name = cpu->release = "Unknown";
+
+               return;
+       }
+
+       /*
+        * However the subsequent HS release (same 0x54) allow HS38 or HS48
+        * configurations and encode this info in a different BCR.
+        * The BCR was introduced in 0x54 so can't be read unconditionally.
+        */
+
+       READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch);
+
+       if (uarch.prod == 4) {
+               cpu->name = "HS48";
+               cpu->extn.dual = 1;
+
+       } else {
+               cpu->name = "HS38";
+       }
+
+       for (tbl = &arc_cpu_rel[0]; tbl->id != 0xFF; tbl++) {
+               if (uarch.maj == tbl->id) {
+                       cpu->release = tbl->str;
+                       break;
+               }
+       }
+}
+
 static void read_arc_build_cfg_regs(void)
 {
        struct bcr_timer timer;
        struct bcr_generic bcr;
        struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
-       const struct id_to_str *tbl;
        struct bcr_isa_arcv2 isa;
        struct bcr_actionpoint ap;
 
        FIX_PTR(cpu);
 
        READ_BCR(AUX_IDENTITY, cpu->core);
-
-       for (tbl = &arc_cpu_rel[0]; tbl->id != 0; tbl++) {
-               if (cpu->core.family == tbl->id) {
-                       cpu->details = tbl->str;
-                       break;
-               }
-       }
-
-       for (tbl = &arc_cpu_nm[0]; tbl->id != 0; tbl++) {
-               if ((cpu->core.family & 0xF4) == tbl->id)
-                       break;
-       }
-       cpu->name = tbl->str;
+       decode_arc_core(cpu);
 
        READ_BCR(ARC_REG_TIMERS_BCR, timer);
        cpu->extn.timer0 = timer.t0;
@@ -151,16 +188,6 @@ static void read_arc_build_cfg_regs(void)
 
        READ_BCR(ARC_REG_MUL_BCR, cpu->extn_mpy);
 
-       cpu->extn.norm = read_aux_reg(ARC_REG_NORM_BCR) > 1 ? 1 : 0; /* 2,3 */
-       cpu->extn.barrel = read_aux_reg(ARC_REG_BARREL_BCR) > 1 ? 1 : 0; /* 2,3 */
-       cpu->extn.swap = read_aux_reg(ARC_REG_SWAP_BCR) ? 1 : 0;        /* 1,3 */
-       cpu->extn.crc = read_aux_reg(ARC_REG_CRC_BCR) ? 1 : 0;
-       cpu->extn.minmax = read_aux_reg(ARC_REG_MIXMAX_BCR) > 1 ? 1 : 0; /* 2 */
-       cpu->extn.swape = (cpu->core.family >= 0x34) ? 1 :
-                               IS_ENABLED(CONFIG_ARC_HAS_SWAPE);
-
-       READ_BCR(ARC_REG_XY_MEM_BCR, cpu->extn_xymem);
-
        /* Read CCM BCRs for boot reporting even if not enabled in Kconfig */
        read_decode_ccm_bcr(cpu);
 
@@ -198,30 +225,12 @@ static void read_arc_build_cfg_regs(void)
                cpu->bpu.num_pred = 2048 << bpu.pte;
                cpu->bpu.ret_stk = 4 << bpu.rse;
 
-               if (cpu->core.family >= 0x54) {
-
-                       struct bcr_uarch_build_arcv2 uarch;
-
-                       /*
-                        * The first 0x54 core (uarch maj:min 0:1 or 0:2) was
-                        * dual issue only (HS4x). But next uarch rev (1:0)
-                        * allows it be configured for single issue (HS3x)
-                        * Ensure we fiddle with dual issue only on HS4x
-                        */
-                       READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch);
-
-                       if (uarch.prod == 4) {
-                               unsigned int exec_ctrl;
-
-                               /* dual issue hardware always present */
-                               cpu->extn.dual = 1;
-
-                               READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
+               /* if dual issue hardware, is it enabled ? */
+               if (cpu->extn.dual) {
+                       unsigned int exec_ctrl;
 
-                               /* dual issue hardware enabled ? */
-                               cpu->extn.dual_enb = !(exec_ctrl & 1);
-
-                       }
+                       READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
+                       cpu->extn.dual_enb = !(exec_ctrl & 1);
                }
        }
 
@@ -263,7 +272,8 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
 {
        struct cpuinfo_arc *cpu = &cpuinfo_arc700[cpu_id];
        struct bcr_identity *core = &cpu->core;
-       int i, n = 0, ua = 0;
+       char mpy_opt[16];
+       int n = 0;
 
        FIX_PTR(cpu);
 
@@ -272,7 +282,7 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
                       core->family, core->cpu_id, core->chip_id);
 
        n += scnprintf(buf + n, len - n, "processor [%d]\t: %s %s (%s ISA) %s%s%s\n",
-                      cpu_id, cpu->name, cpu->details,
+                      cpu_id, cpu->name, cpu->release,
                       is_isa_arcompact() ? "ARCompact" : "ARCv2",
                       IS_AVAIL1(cpu->isa.be, "[Big-Endian]"),
                       IS_AVAIL3(cpu->extn.dual, cpu->extn.dual_enb, " Dual-Issue "));
@@ -283,61 +293,50 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
                       IS_AVAIL2(cpu->extn.rtc, "RTC [UP 64-bit] ", CONFIG_ARC_TIMERS_64BIT),
                       IS_AVAIL2(cpu->extn.gfrc, "GFRC [SMP 64-bit] ", CONFIG_ARC_TIMERS_64BIT));
 
-#ifdef __ARC_UNALIGNED__
-       ua = 1;
-#endif
-       n += i = scnprintf(buf + n, len - n, "%s%s%s%s%s%s",
-                          IS_AVAIL2(cpu->isa.atomic, "atomic ", CONFIG_ARC_HAS_LLSC),
-                          IS_AVAIL2(cpu->isa.ldd, "ll64 ", CONFIG_ARC_HAS_LL64),
-                          IS_AVAIL1(cpu->isa.unalign, "unalign "), IS_USED_RUN(ua));
-
-       if (i)
-               n += scnprintf(buf + n, len - n, "\n\t\t: ");
-
        if (cpu->extn_mpy.ver) {
-               if (cpu->extn_mpy.ver <= 0x2) { /* ARCompact */
-                       n += scnprintf(buf + n, len - n, "mpy ");
+               if (is_isa_arcompact()) {
+                       scnprintf(mpy_opt, 16, "mpy");
                } else {
+
                        int opt = 2;    /* stock MPY/MPYH */
 
                        if (cpu->extn_mpy.dsp)  /* OPT 7-9 */
                                opt = cpu->extn_mpy.dsp + 6;
 
-                       n += scnprintf(buf + n, len - n, "mpy[opt %d] ", opt);
+                       scnprintf(mpy_opt, 16, "mpy[opt %d] ", opt);
                }
        }
 
        n += scnprintf(buf + n, len - n, "%s%s%s%s%s%s%s%s\n",
-                      IS_AVAIL1(cpu->isa.div_rem, "div_rem "),
-                      IS_AVAIL1(cpu->extn.norm, "norm "),
-                      IS_AVAIL1(cpu->extn.barrel, "barrel-shift "),
-                      IS_AVAIL1(cpu->extn.swap, "swap "),
-                      IS_AVAIL1(cpu->extn.minmax, "minmax "),
-                      IS_AVAIL1(cpu->extn.crc, "crc "),
-                      IS_AVAIL2(cpu->extn.swape, "swape", CONFIG_ARC_HAS_SWAPE));
-
-       if (cpu->bpu.ver)
+                      IS_AVAIL2(cpu->isa.atomic, "atomic ", CONFIG_ARC_HAS_LLSC),
+                      IS_AVAIL2(cpu->isa.ldd, "ll64 ", CONFIG_ARC_HAS_LL64),
+                      IS_AVAIL2(cpu->isa.unalign, "unalign ", CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS),
+                      IS_AVAIL1(cpu->extn_mpy.ver, mpy_opt),
+                      IS_AVAIL1(cpu->isa.div_rem, "div_rem "));
+
+       if (cpu->bpu.ver) {
                n += scnprintf(buf + n, len - n,
                              "BPU\t\t: %s%s match, cache:%d, Predict Table:%d Return stk: %d",
                              IS_AVAIL1(cpu->bpu.full, "full"),
                              IS_AVAIL1(!cpu->bpu.full, "partial"),
                              cpu->bpu.num_cache, cpu->bpu.num_pred, cpu->bpu.ret_stk);
 
-       if (is_isa_arcv2()) {
-               struct bcr_lpb lpb;
+               if (is_isa_arcv2()) {
+                       struct bcr_lpb lpb;
 
-               READ_BCR(ARC_REG_LPB_BUILD, lpb);
-               if (lpb.ver) {
-                       unsigned int ctl;
-                       ctl = read_aux_reg(ARC_REG_LPB_CTRL);
+                       READ_BCR(ARC_REG_LPB_BUILD, lpb);
+                       if (lpb.ver) {
+                               unsigned int ctl;
+                               ctl = read_aux_reg(ARC_REG_LPB_CTRL);
 
-                       n += scnprintf(buf + n, len - n, " Loop Buffer:%d %s",
-                               lpb.entries,
-                               IS_DISABLED_RUN(!ctl));
+                               n += scnprintf(buf + n, len - n, " Loop Buffer:%d %s",
+                                              lpb.entries,
+                                              IS_DISABLED_RUN(!ctl));
+                       }
                }
+               n += scnprintf(buf + n, len - n, "\n");
        }
 
-       n += scnprintf(buf + n, len - n, "\n");
        return buf;
 }
 
@@ -390,11 +389,6 @@ static char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)
                }
        }
 
-       n += scnprintf(buf + n, len - n, "OS ABI [v%d]\t: %s\n",
-                       EF_ARC_OSABI_CURRENT >> 8,
-                       EF_ARC_OSABI_CURRENT == EF_ARC_OSABI_V3 ?
-                       "no-legacy-syscalls" : "64-bit data any register aligned");
-
        return buf;
 }
 
@@ -497,6 +491,8 @@ static inline bool uboot_arg_invalid(unsigned long addr)
 #define UBOOT_TAG_NONE         0
 #define UBOOT_TAG_CMDLINE      1
 #define UBOOT_TAG_DTB          2
+/* We always pass 0 as magic from U-boot */
+#define UBOOT_MAGIC_VALUE      0
 
 void __init handle_uboot_args(void)
 {
@@ -511,6 +507,11 @@ void __init handle_uboot_args(void)
                goto ignore_uboot_args;
        }
 
+       if (uboot_magic != UBOOT_MAGIC_VALUE) {
+               pr_warn(IGNORE_ARGS "non zero uboot magic\n");
+               goto ignore_uboot_args;
+       }
+
        if (uboot_tag != UBOOT_TAG_NONE &&
             uboot_arg_invalid((unsigned long)uboot_arg)) {
                pr_warn(IGNORE_ARGS "invalid uboot arg: '%px'\n", uboot_arg);
index 215f515442e03d53ee3a18ade4c62e2a06987b3b..b0aa8c02833137c42a95d2c48a187f45fc1fc479 100644 (file)
@@ -145,7 +145,8 @@ static void show_ecr_verbose(struct pt_regs *regs)
        } else if (vec == ECR_V_PROTV) {
                if (cause_code == ECR_C_PROTV_INST_FETCH)
                        pr_cont("Execute from Non-exec Page\n");
-               else if (cause_code == ECR_C_PROTV_MISALIG_DATA)
+               else if (cause_code == ECR_C_PROTV_MISALIG_DATA &&
+                        IS_ENABLED(CONFIG_ISA_ARCOMPACT))
                        pr_cont("Misaligned r/w from 0x%08lx\n", address);
                else
                        pr_cont("%s access not allowed on page\n",
@@ -161,6 +162,8 @@ static void show_ecr_verbose(struct pt_regs *regs)
                        pr_cont("Bus Error from Data Mem\n");
                else
                        pr_cont("Bus Error, check PRM\n");
+       } else if (vec == ECR_V_MISALIGN) {
+               pr_cont("Misaligned r/w from 0x%08lx\n", address);
 #endif
        } else if (vec == ECR_V_TRAP) {
                if (regs->ecr_param == 5)
index b1656d15609750910512c9e00799c8d736f665b2..f7537b466b23dea34ca3e5772239f96f206a9124 100644 (file)
@@ -8,4 +8,10 @@
 lib-y  := strchr-700.o strcpy-700.o strlen.o memcmp.o
 
 lib-$(CONFIG_ISA_ARCOMPACT)    += memcpy-700.o memset.o strcmp.o
-lib-$(CONFIG_ISA_ARCV2)                += memcpy-archs.o memset-archs.o strcmp-archs.o
+lib-$(CONFIG_ISA_ARCV2)                += memset-archs.o strcmp-archs.o
+
+ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
+lib-$(CONFIG_ISA_ARCV2)                +=memcpy-archs-unaligned.o
+else
+lib-$(CONFIG_ISA_ARCV2)                +=memcpy-archs.o
+endif
diff --git a/arch/arc/lib/memcpy-archs-unaligned.S b/arch/arc/lib/memcpy-archs-unaligned.S
new file mode 100644 (file)
index 0000000..28993a7
--- /dev/null
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * ARCv2 memcpy implementation optimized for unaligned memory access using.
+ *
+ * Copyright (C) 2019 Synopsys
+ * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
+ */
+
+#include <linux/linkage.h>
+
+#ifdef CONFIG_ARC_HAS_LL64
+# define LOADX(DST,RX)         ldd.ab  DST, [RX, 8]
+# define STOREX(SRC,RX)                std.ab  SRC, [RX, 8]
+# define ZOLSHFT               5
+# define ZOLAND                        0x1F
+#else
+# define LOADX(DST,RX)         ld.ab   DST, [RX, 4]
+# define STOREX(SRC,RX)                st.ab   SRC, [RX, 4]
+# define ZOLSHFT               4
+# define ZOLAND                        0xF
+#endif
+
+ENTRY_CFI(memcpy)
+       mov     r3, r0          ; don;t clobber ret val
+
+       lsr.f   lp_count, r2, ZOLSHFT
+       lpnz    @.Lcopy32_64bytes
+       ;; LOOP START
+       LOADX   (r6, r1)
+       LOADX   (r8, r1)
+       LOADX   (r10, r1)
+       LOADX   (r4, r1)
+       STOREX  (r6, r3)
+       STOREX  (r8, r3)
+       STOREX  (r10, r3)
+       STOREX  (r4, r3)
+.Lcopy32_64bytes:
+
+       and.f   lp_count, r2, ZOLAND ;Last remaining 31 bytes
+       lpnz    @.Lcopyremainingbytes
+       ;; LOOP START
+       ldb.ab  r5, [r1, 1]
+       stb.ab  r5, [r3, 1]
+.Lcopyremainingbytes:
+
+       j       [blink]
+END_CFI(memcpy)
index 8eff057efcaebeae04b1fb801c003418090551eb..2eaecfb063a7336f2a78c54e31ab09f2576c63f6 100644 (file)
@@ -26,8 +26,8 @@ config EZNPS_MTM_EXT
        help
          Here we add new hierarchy for CPUs topology.
          We got:
-               Core
-               Thread
+           Core
+           Thread
          At the new thread level each CPU represent one HW thread.
          At highest hierarchy each core contain 16 threads,
          any of them seem like CPU from Linux point of view.
@@ -35,10 +35,10 @@ config EZNPS_MTM_EXT
          core and HW scheduler round robin between them.
 
 config EZNPS_MEM_ERROR_ALIGN
-       bool "ARC-EZchip Memory error as an exception"
-       depends on EZNPS_MTM_EXT
-       default n
-       help
+       bool "ARC-EZchip Memory error as an exception"
+       depends on EZNPS_MTM_EXT
+       default n
+       help
          On the real chip of the NPS, user memory errors are handled
          as a machine check exception, which is fatal, whereas on
          simulator platform for NPS, is handled as a Level 2 interrupt
index 23b4464c0995ab3ed1673f7aa36e16a3554e296a..ce8573157774dc078e49a5a2d5ccecc3ad54986d 100644 (file)
@@ -3,3 +3,4 @@
 generated-y += unistd-common.h
 generated-y += unistd-oabi.h
 generated-y += unistd-eabi.h
+generic-y += kvm_para.h
diff --git a/arch/arm/include/uapi/asm/kvm_para.h b/arch/arm/include/uapi/asm/kvm_para.h
deleted file mode 100644 (file)
index baacc49..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#include <asm-generic/kvm_para.h>
index 7d5a44a06648de2fd8e5e15beef19762d6925e81..f676592d840210558a5daf54e1f7c265be06a918 100644 (file)
@@ -90,7 +90,7 @@ void __init cns3xxx_map_io(void)
 /* used by entry-macro.S */
 void __init cns3xxx_init_irq(void)
 {
-       gic_init(0, 29, IOMEM(CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT),
+       gic_init(IOMEM(CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT),
                 IOMEM(CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT));
 }
 
index 117b2541ef3d16dfe09ba67784e9faf3b43634e6..7e34b9eba5de151572ba479d73ccf82ba18e8beb 100644 (file)
@@ -159,7 +159,6 @@ config ARM64
        select IRQ_DOMAIN
        select IRQ_FORCED_THREADING
        select MODULES_USE_ELF_RELA
-       select MULTI_IRQ_HANDLER
        select NEED_DMA_MAP_STATE
        select NEED_SG_DMA_LENGTH
        select OF
index 2afb1338b48a482c4a528a96ebda0ffb310fb987..5f1437099b9979ac983ae0896272229e2b04f1e3 100644 (file)
@@ -77,6 +77,7 @@
 #define ARM_CPU_IMP_QCOM               0x51
 #define ARM_CPU_IMP_NVIDIA             0x4E
 #define ARM_CPU_IMP_FUJITSU            0x46
+#define ARM_CPU_IMP_HISI               0x48
 
 #define ARM_CPU_PART_AEM_V8            0xD0F
 #define ARM_CPU_PART_FOUNDATION                0xD00
 
 #define FUJITSU_CPU_PART_A64FX         0x001
 
+#define HISI_CPU_PART_TSV110           0xD01
+
 #define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
 #define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
 #define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
 #define MIDR_NVIDIA_DENVER MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_DENVER)
 #define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL)
 #define MIDR_FUJITSU_A64FX MIDR_CPU_MODEL(ARM_CPU_IMP_FUJITSU, FUJITSU_CPU_PART_A64FX)
+#define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110)
 
 /* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
 #define MIDR_FUJITSU_ERRATUM_010001            MIDR_FUJITSU_A64FX
-#define MIDR_FUJITSU_ERRATUM_010001_MASK       (~MIDR_VARIANT(1))
+#define MIDR_FUJITSU_ERRATUM_010001_MASK       (~MIDR_CPU_VAR_REV(1, 0))
 #define TCR_CLEAR_FUJITSU_ERRATUM_010001       (TCR_NFD1 | TCR_NFD0)
 
 #ifndef __ASSEMBLY__
index e24e94d2876717b8ef3ac0311aa419049255134e..4061de10cea6ccb0ccaa890c4f2dd98d4a2bcd91 100644 (file)
@@ -963,6 +963,7 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
                MIDR_ALL_VERSIONS(MIDR_CORTEX_A57),
                MIDR_ALL_VERSIONS(MIDR_CORTEX_A72),
                MIDR_ALL_VERSIONS(MIDR_CORTEX_A73),
+               MIDR_ALL_VERSIONS(MIDR_HISI_TSV110),
                { /* sentinel */ }
        };
        char const *str = "command line option";
index 7fb6f3aa5ceb7172c91277067da624085b158433..7a679caf45856e75c21860aaa7522c080fb48e41 100644 (file)
@@ -91,8 +91,6 @@ static void __kprobes arch_simulate_insn(struct kprobe *p, struct pt_regs *regs)
 int __kprobes arch_prepare_kprobe(struct kprobe *p)
 {
        unsigned long probe_addr = (unsigned long)p->addr;
-       extern char __start_rodata[];
-       extern char __end_rodata[];
 
        if (probe_addr & 0x3)
                return -EINVAL;
@@ -100,10 +98,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
        /* copy instruction */
        p->opcode = le32_to_cpu(*p->addr);
 
-       if (in_exception_text(probe_addr))
-               return -EINVAL;
-       if (probe_addr >= (unsigned long) __start_rodata &&
-           probe_addr <= (unsigned long) __end_rodata)
+       if (search_exception_tables(probe_addr))
                return -EINVAL;
 
        /* decode instruction */
@@ -476,26 +471,37 @@ kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr)
        return DBG_HOOK_HANDLED;
 }
 
-bool arch_within_kprobe_blacklist(unsigned long addr)
+/*
+ * Provide a blacklist of symbols identifying ranges which cannot be kprobed.
+ * This blacklist is exposed to userspace via debugfs (kprobes/blacklist).
+ */
+int __init arch_populate_kprobe_blacklist(void)
 {
-       if ((addr >= (unsigned long)__kprobes_text_start &&
-           addr < (unsigned long)__kprobes_text_end) ||
-           (addr >= (unsigned long)__entry_text_start &&
-           addr < (unsigned long)__entry_text_end) ||
-           (addr >= (unsigned long)__idmap_text_start &&
-           addr < (unsigned long)__idmap_text_end) ||
-           (addr >= (unsigned long)__hyp_text_start &&
-           addr < (unsigned long)__hyp_text_end) ||
-           !!search_exception_tables(addr))
-               return true;
-
-       if (!is_kernel_in_hyp_mode()) {
-               if ((addr >= (unsigned long)__hyp_idmap_text_start &&
-                   addr < (unsigned long)__hyp_idmap_text_end))
-                       return true;
-       }
-
-       return false;
+       int ret;
+
+       ret = kprobe_add_area_blacklist((unsigned long)__entry_text_start,
+                                       (unsigned long)__entry_text_end);
+       if (ret)
+               return ret;
+       ret = kprobe_add_area_blacklist((unsigned long)__irqentry_text_start,
+                                       (unsigned long)__irqentry_text_end);
+       if (ret)
+               return ret;
+       ret = kprobe_add_area_blacklist((unsigned long)__exception_text_start,
+                                       (unsigned long)__exception_text_end);
+       if (ret)
+               return ret;
+       ret = kprobe_add_area_blacklist((unsigned long)__idmap_text_start,
+                                       (unsigned long)__idmap_text_end);
+       if (ret)
+               return ret;
+       ret = kprobe_add_area_blacklist((unsigned long)__hyp_text_start,
+                                       (unsigned long)__hyp_text_end);
+       if (ret || is_kernel_in_hyp_mode())
+               return ret;
+       ret = kprobe_add_area_blacklist((unsigned long)__hyp_idmap_text_start,
+                                       (unsigned long)__hyp_idmap_text_end);
+       return ret;
 }
 
 void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)
index 1a29f2695ff24849304ad1f2106203b5114c5071..d908b5e9e949c6745598abd90f6c3afef89ae040 100644 (file)
@@ -143,6 +143,7 @@ void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
        if (trace->nr_entries < trace->max_entries)
                trace->entries[trace->nr_entries++] = ULONG_MAX;
 }
+EXPORT_SYMBOL_GPL(save_stack_trace_regs);
 
 static noinline void __save_stack_trace(struct task_struct *tsk,
        struct stack_trace *trace, unsigned int nosched)
index 63b4a170518220397d22ec86cf9911f470139b97..249c9f6f26dce7c2dd2a43f9a9f20bd0d29478f3 100644 (file)
@@ -19,6 +19,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
index 755bb11323d8feb92d12349bf444f151cd8acc29..1c72f04ff75da1a7f6918f00b14116a183a79313 100644 (file)
@@ -1,2 +1 @@
-generic-y += kvm_para.h
 generic-y += ucontext.h
index 3e7c8ecf151e13841d0c3e491f3927aa1586434c..e3dead402e5fbe94ebe53063968801c8f51360b5 100644 (file)
@@ -23,6 +23,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += linkage.h
 generic-y += local.h
 generic-y += local64.h
index 755bb11323d8feb92d12349bf444f151cd8acc29..1c72f04ff75da1a7f6918f00b14116a183a79313 100644 (file)
@@ -1,2 +1 @@
-generic-y += kvm_para.h
 generic-y += ucontext.h
index b25fd42aa0f47372162decdff321f3cca2e1a4d8..d046e8ccdf786be5029237ad722d819de88d6124 100644 (file)
@@ -19,6 +19,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += mcs_spinlock.h
diff --git a/arch/hexagon/include/uapi/asm/kvm_para.h b/arch/hexagon/include/uapi/asm/kvm_para.h
deleted file mode 100644 (file)
index baacc49..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#include <asm-generic/kvm_para.h>
index 43e21fe3499c43451f2915ff1274afa76059f16b..11f191689c9e8445a77ede3555452fb8d008a3d7 100644 (file)
@@ -2,6 +2,7 @@ generated-y += syscall_table.h
 generic-y += compat.h
 generic-y += exec.h
 generic-y += irq_work.h
+generic-y += kvm_para.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
 generic-y += preempt.h
index 20018cb883a90981565284ac1d5d9df51c38e987..62a9522af51e6651f560e06f8d3c3e2602b63f20 100644 (file)
@@ -1,2 +1 @@
 generated-y += unistd_64.h
-generic-y += kvm_para.h
index 95f8f631c4df08aebc71b25d878fc29e0f89a1ba..2c359d9e80f63fe44468c29b7a48bb4033a9c31a 100644 (file)
@@ -13,6 +13,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += mcs_spinlock.h
index 8a7ad40be463656854310b85dbba06d5f9b8e189..7417847dc438e5ff6aff14f04094a1323d6b933f 100644 (file)
@@ -1,2 +1 @@
 generated-y += unistd_32.h
-generic-y += kvm_para.h
index 791cc8d54d0a9eff79b5264a74b507fc3233699c..1a8285c3f693990c8a8f3f7d5d37d240b17c4a80 100644 (file)
@@ -17,6 +17,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += linkage.h
 generic-y += local.h
 generic-y += local64.h
index 3ce84fbb2678f2194de4e81504494045a00915ed..13f59631c576c6bcd4c50357269fa42c0525e62a 100644 (file)
@@ -1,3 +1,2 @@
 generated-y += unistd_32.h
-generic-y += kvm_para.h
 generic-y += ucontext.h
index 46eddbec8d9fdec090ee273e1e5ba3cd573ba612..0ab95dd431b3c0b33fd400dd631ae183c796d8c2 100644 (file)
@@ -24,6 +24,7 @@ void __init bcm47xx_workarounds(void)
        case BCM47XX_BOARD_NETGEAR_WNR3500L:
                bcm47xx_workarounds_enable_usb_power(12);
                break;
+       case BCM47XX_BOARD_NETGEAR_WNDR3400V2:
        case BCM47XX_BOARD_NETGEAR_WNDR3400_V3:
                bcm47xx_workarounds_enable_usb_power(21);
                break;
index e77672539e8ed8f6744c03d49eaeb20c76d80b78..e4456e450f946d5c9c55b52d78aeee60d3a2a0e2 100644 (file)
 #endif
 
 #ifdef CONFIG_CPU_MICROMIPS
-#define NOP_INSN "nop32"
+#define B_INSN "b32"
 #else
-#define NOP_INSN "nop"
+#define B_INSN "b"
 #endif
 
 static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
 {
-       asm_volatile_goto("1:\t" NOP_INSN "\n\t"
-               "nop\n\t"
+       asm_volatile_goto("1:\t" B_INSN " 2f\n\t"
+               "2:\tnop\n\t"
                ".pushsection __jump_table,  \"aw\"\n\t"
                WORD_INSN " 1b, %l[l_yes], %0\n\t"
                ".popsection\n\t"
index 6aa49c10f88f7e2073bc2bd4202d02cab6b0f46a..f0ccb5b90ce95b1e927f46ad850560e3745fea74 100644 (file)
 typedef long           __kernel_daddr_t;
 #define __kernel_daddr_t __kernel_daddr_t
 
-#if (_MIPS_SZLONG == 32)
-typedef struct {
-       long    val[2];
-} __kernel_fsid_t;
-#define __kernel_fsid_t __kernel_fsid_t
-#endif
-
 #include <asm-generic/posix_types.h>
 
 #endif /* _ASM_POSIX_TYPES_H */
index cb7e9ed7a453cd8982fca4da2b3ee659d52181cb..33ee0d18fb0adc21d952c98fbf77b5ed8c514d6a 100644 (file)
@@ -140,6 +140,13 @@ SECTIONS
        PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
 #endif
 
+#ifdef CONFIG_MIPS_ELF_APPENDED_DTB
+       .appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) {
+               *(.appended_dtb)
+               KEEP(*(.appended_dtb))
+       }
+#endif
+
 #ifdef CONFIG_RELOCATABLE
        . = ALIGN(4);
 
@@ -164,11 +171,6 @@ SECTIONS
        __appended_dtb = .;
        /* leave space for appended DTB */
        . += 0x100000;
-#elif defined(CONFIG_MIPS_ELF_APPENDED_DTB)
-       .appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) {
-               *(.appended_dtb)
-               KEEP(*(.appended_dtb))
-       }
 #endif
        /*
         * Align to 64K in attempt to eliminate holes before the
index 9e33e45aa17c5d6881d6bc8cd5ca3c90d42098d0..b213cecb8e3ac4e76573e334c42cbde7c88636f4 100644 (file)
@@ -103,7 +103,7 @@ static struct irqaction ip6_irqaction = {
 static struct irqaction cascade_irqaction = {
        .handler = no_action,
        .name = "cascade",
-       .flags = IRQF_NO_THREAD,
+       .flags = IRQF_NO_THREAD | IRQF_NO_SUSPEND,
 };
 
 void __init mach_init_irq(void)
index 8fde4fa2c34f758df132e659eb69b4331c84172f..88a667d12aaa9cefafad5260f03e073fefeb1fed 100644 (file)
@@ -23,6 +23,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
index 755bb11323d8feb92d12349bf444f151cd8acc29..1c72f04ff75da1a7f6918f00b14116a183a79313 100644 (file)
@@ -1,2 +1 @@
-generic-y += kvm_para.h
 generic-y += ucontext.h
index 5a73e2956ac46953ac9e1cf2404c3d0996617602..22aa97136c0195ae2b687c0793c42e43f22888ec 100644 (file)
@@ -20,6 +20,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
index 755bb11323d8feb92d12349bf444f151cd8acc29..1c72f04ff75da1a7f6918f00b14116a183a79313 100644 (file)
@@ -1,2 +1 @@
-generic-y += kvm_para.h
 generic-y += ucontext.h
index 6f49e77d82a2a48673356355e38a411794ff51bb..9bcd0c903dbbef2aee61ade11844c5091e4bfd0c 100644 (file)
@@ -11,6 +11,7 @@ generic-y += irq_regs.h
 generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += mcs_spinlock.h
index 22fdbd08cdc8551777459efe75c49bbfa1e3f95a..2bd5b392277c2cf5c4a52f3d0b7d9aaed7382f44 100644 (file)
@@ -1,3 +1,2 @@
 generated-y += unistd_32.h
 generated-y += unistd_64.h
-generic-y += kvm_para.h
index d34ad1657d7b2c44cdb16683bfef359b651fd02d..598cdcdd13553dea4a80a9b72196dbee8987cd61 100644 (file)
@@ -352,7 +352,7 @@ static inline bool strict_kernel_rwx_enabled(void)
 #if defined(CONFIG_SPARSEMEM_VMEMMAP) && defined(CONFIG_SPARSEMEM_EXTREME) &&  \
        defined (CONFIG_PPC_64K_PAGES)
 #define MAX_PHYSMEM_BITS        51
-#else
+#elif defined(CONFIG_SPARSEMEM)
 #define MAX_PHYSMEM_BITS        46
 #endif
 
index 1afe90ade595e161016af3ca712b65f9990407f4..bbc06bd72b1f2497ef0a1120e631d4243f3f432a 100644 (file)
@@ -82,10 +82,10 @@ struct vdso_data {
        __u32 icache_block_size;                /* L1 i-cache block size     */
        __u32 dcache_log_block_size;            /* L1 d-cache log block size */
        __u32 icache_log_block_size;            /* L1 i-cache log block size */
-       __s32 wtom_clock_sec;                   /* Wall to monotonic clock */
-       __s32 wtom_clock_nsec;
-       struct timespec stamp_xtime;    /* xtime as at tb_orig_stamp */
-       __u32 stamp_sec_fraction;       /* fractional seconds of stamp_xtime */
+       __u32 stamp_sec_fraction;               /* fractional seconds of stamp_xtime */
+       __s32 wtom_clock_nsec;                  /* Wall to monotonic clock nsec */
+       __s64 wtom_clock_sec;                   /* Wall to monotonic clock sec */
+       struct timespec stamp_xtime;            /* xtime as at tb_orig_stamp */
        __u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls  */
        __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
 };
index 6f1c11e0691f2dd937f77861f08a0778f91e8a30..7534ecff5e925b434e4613298503d66435326205 100644 (file)
@@ -24,9 +24,6 @@ BEGIN_MMU_FTR_SECTION
        li      r10,0
        mtspr   SPRN_SPRG_603_LRU,r10           /* init SW LRU tracking */
 END_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU)
-       lis     r10, (swapper_pg_dir - PAGE_OFFSET)@h
-       ori     r10, r10, (swapper_pg_dir - PAGE_OFFSET)@l
-       mtspr   SPRN_SPRG_PGDIR, r10
 
 BEGIN_FTR_SECTION
        bl      __init_fpu_registers
index ce6a972f25849ea87774be809da0faa3d84d96f3..48051c8977c5603a1ac9f8b730c0283ab04497d8 100644 (file)
@@ -855,6 +855,9 @@ __secondary_start:
        li      r3,0
        stw     r3, RTAS_SP(r4)         /* 0 => not in RTAS */
 #endif
+       lis     r4, (swapper_pg_dir - PAGE_OFFSET)@h
+       ori     r4, r4, (swapper_pg_dir - PAGE_OFFSET)@l
+       mtspr   SPRN_SPRG_PGDIR, r4
 
        /* enable MMU and jump to start_secondary */
        li      r4,MSR_KERNEL
@@ -942,6 +945,9 @@ start_here:
        li      r3,0
        stw     r3, RTAS_SP(r4)         /* 0 => not in RTAS */
 #endif
+       lis     r4, (swapper_pg_dir - PAGE_OFFSET)@h
+       ori     r4, r4, (swapper_pg_dir - PAGE_OFFSET)@l
+       mtspr   SPRN_SPRG_PGDIR, r4
 
        /* stack */
        lis     r1,init_thread_union@ha
index 9b8631533e02a4559a4dfc4c23240db58e39192c..b33bafb8fcea1f7a964ad99e203ee0a2cf3103cb 100644 (file)
@@ -190,29 +190,22 @@ ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, c
        bcs = security_ftr_enabled(SEC_FTR_BCCTRL_SERIALISED);
        ccd = security_ftr_enabled(SEC_FTR_COUNT_CACHE_DISABLED);
 
-       if (bcs || ccd || count_cache_flush_type != COUNT_CACHE_FLUSH_NONE) {
-               bool comma = false;
+       if (bcs || ccd) {
                seq_buf_printf(&s, "Mitigation: ");
 
-               if (bcs) {
+               if (bcs)
                        seq_buf_printf(&s, "Indirect branch serialisation (kernel only)");
-                       comma = true;
-               }
 
-               if (ccd) {
-                       if (comma)
-                               seq_buf_printf(&s, ", ");
-                       seq_buf_printf(&s, "Indirect branch cache disabled");
-                       comma = true;
-               }
-
-               if (comma)
+               if (bcs && ccd)
                        seq_buf_printf(&s, ", ");
 
-               seq_buf_printf(&s, "Software count cache flush");
+               if (ccd)
+                       seq_buf_printf(&s, "Indirect branch cache disabled");
+       } else if (count_cache_flush_type != COUNT_CACHE_FLUSH_NONE) {
+               seq_buf_printf(&s, "Mitigation: Software count cache flush");
 
                if (count_cache_flush_type == COUNT_CACHE_FLUSH_HW)
-                       seq_buf_printf(&s, "(hardware accelerated)");
+                       seq_buf_printf(&s, " (hardware accelerated)");
        } else if (btb_flush_enabled) {
                seq_buf_printf(&s, "Mitigation: Branch predictor state flush");
        } else {
index a4ed9edfd5f0b694288478683858f0ed3f306516..1f324c28705bc799b48172c232d6f193e6520eae 100644 (file)
@@ -92,7 +92,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
         * At this point, r4,r5 contain our sec/nsec values.
         */
 
-       lwa     r6,WTOM_CLOCK_SEC(r3)
+       l     r6,WTOM_CLOCK_SEC(r3)
        lwa     r9,WTOM_CLOCK_NSEC(r3)
 
        /* We now have our result in r6,r9. We create a fake dependency
@@ -125,7 +125,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
        bne     cr6,75f
 
        /* CLOCK_MONOTONIC_COARSE */
-       lwa     r6,WTOM_CLOCK_SEC(r3)
+       l     r6,WTOM_CLOCK_SEC(r3)
        lwa     r9,WTOM_CLOCK_NSEC(r3)
 
        /* check if counter has updated */
index 1f13494efb2bfa9b50996ce6fda0711b9e933008..a6c491f18a04e2cfee3e61fbb6a0e37f955f5f16 100644 (file)
@@ -70,12 +70,12 @@ _GLOBAL(hash_page)
        lis     r0,KERNELBASE@h         /* check if kernel address */
        cmplw   0,r4,r0
        ori     r3,r3,_PAGE_USER|_PAGE_PRESENT /* test low addresses as user */
-       mfspr   r5, SPRN_SPRG_PGDIR     /* virt page-table root */
+       mfspr   r5, SPRN_SPRG_PGDIR     /* phys page-table root */
        blt+    112f                    /* assume user more likely */
-       lis     r5,swapper_pg_dir@ha    /* if kernel address, use */
-       addi    r5,r5,swapper_pg_dir@l  /* kernel page table */
+       lis     r5, (swapper_pg_dir - PAGE_OFFSET)@ha   /* if kernel address, use */
+       addi    r5 ,r5 ,(swapper_pg_dir - PAGE_OFFSET)@l        /* kernel page table */
        rlwimi  r3,r9,32-12,29,29       /* MSR_PR -> _PAGE_USER */
-112:   tophys(r5, r5)
+112:
 #ifndef CONFIG_PTE_64BIT
        rlwimi  r5,r4,12,20,29          /* insert top 10 bits of address */
        lwz     r8,0(r5)                /* get pmd entry */
index a6ef3fee5f85714f69e6692e563491960372ab75..7bf2cb680d328462c4e621eae24005f1c9f35afc 100644 (file)
@@ -9,6 +9,7 @@ generic-y += emergency-restart.h
 generic-y += exec.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += mcs_spinlock.h
index ecfbd40924dd948f97985e65daa18216c123c424..b8812c74c1dee1ec8dc80bac7ec4f80a4cc454a4 100644 (file)
@@ -1,5 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
 
 generated-y += unistd_32.h
-generic-y += kvm_para.h
 generic-y += ucontext.h
index b82f64e28f55c12fc36f56897bcb5e80f44c9e2d..a22cfd5c0ee8665d96f40dcdfacd2c784a2fad62 100644 (file)
@@ -9,6 +9,7 @@ generic-y += exec.h
 generic-y += export.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
+generic-y += kvm_para.h
 generic-y += linkage.h
 generic-y += local.h
 generic-y += local64.h
diff --git a/arch/sparc/include/uapi/asm/kvm_para.h b/arch/sparc/include/uapi/asm/kvm_para.h
deleted file mode 100644 (file)
index baacc49..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#include <asm-generic/kvm_para.h>
index 1d1544b6ca74ce96e765c68cfa2f1a86a7ef7ac8..d77d953c04c1cfbe039bf207fa4db8b362e65f22 100644 (file)
@@ -18,6 +18,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
index 755bb11323d8feb92d12349bf444f151cd8acc29..1c72f04ff75da1a7f6918f00b14116a183a79313 100644 (file)
@@ -1,2 +1 @@
-generic-y += kvm_para.h
 generic-y += ucontext.h
index 315a67b8896b9588c78b6128014f4702cdf965af..90154df8f12504e501a2c2b287e4fabba955f033 100644 (file)
@@ -13,8 +13,9 @@
  */
 
 #include <linux/types.h>
-#include <linux/kernel.h>
+#include <linux/compiler.h>
 #include <linux/errno.h>
+#include <linux/limits.h>
 #include <asm/asm.h>
 #include "ctype.h"
 #include "string.h"
index 6461a16b45594b144f8fe2390fe42973e4fc8725..e4ba467a9fc65b0ec21d7c9f868c9d013a8fddd9 100644 (file)
@@ -103,9 +103,13 @@ static int hv_cpu_init(unsigned int cpu)
        u64 msr_vp_index;
        struct hv_vp_assist_page **hvp = &hv_vp_assist_page[smp_processor_id()];
        void **input_arg;
+       struct page *pg;
 
        input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg);
-       *input_arg = page_address(alloc_page(GFP_KERNEL));
+       pg = alloc_page(GFP_KERNEL);
+       if (unlikely(!pg))
+               return -ENOMEM;
+       *input_arg = page_address(pg);
 
        hv_get_vp_index(msr_vp_index);
 
index 3417110574c12212f7185213bfe566ac2b541a1e..31c379c1da41c48b7f4ee89d3c100d62895ff5b2 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _CPU_DEVICE_ID
-#define _CPU_DEVICE_ID 1
+#ifndef _ASM_X86_CPU_DEVICE_ID
+#define _ASM_X86_CPU_DEVICE_ID
 
 /*
  * Declare drivers belonging to specific x86 CPUs
@@ -9,8 +9,6 @@
 
 #include <linux/mod_devicetable.h>
 
-extern const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match);
-
 /*
  * Match specific microcode revisions.
  *
@@ -22,21 +20,22 @@ extern const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match);
  */
 
 struct x86_cpu_desc {
-       __u8    x86_family;
-       __u8    x86_vendor;
-       __u8    x86_model;
-       __u8    x86_stepping;
-       __u32   x86_microcode_rev;
+       u8      x86_family;
+       u8      x86_vendor;
+       u8      x86_model;
+       u8      x86_stepping;
+       u32     x86_microcode_rev;
 };
 
-#define INTEL_CPU_DESC(mod, step, rev) {                       \
-       .x86_family = 6,                                        \
-       .x86_vendor = X86_VENDOR_INTEL,                         \
-       .x86_model = mod,                                       \
-       .x86_stepping = step,                                   \
-       .x86_microcode_rev = rev,                               \
+#define INTEL_CPU_DESC(model, stepping, revision) {            \
+       .x86_family             = 6,                            \
+       .x86_vendor             = X86_VENDOR_INTEL,             \
+       .x86_model              = (model),                      \
+       .x86_stepping           = (stepping),                   \
+       .x86_microcode_rev      = (revision),                   \
 }
 
+extern const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match);
 extern bool x86_cpu_has_min_microcode_rev(const struct x86_cpu_desc *table);
 
-#endif
+#endif /* _ASM_X86_CPU_DEVICE_ID */
index a5db4475e72db63031284ecb986c445d7c835eb8..159b5988292f33ec2d1a079bf7d10ba2bc999d4b 100644 (file)
@@ -253,14 +253,14 @@ struct kvm_mmu_memory_cache {
  * kvm_memory_slot.arch.gfn_track which is 16 bits, so the role bits used
  * by indirect shadow page can not be more than 15 bits.
  *
- * Currently, we used 14 bits that are @level, @cr4_pae, @quadrant, @access,
+ * Currently, we used 14 bits that are @level, @gpte_is_8_bytes, @quadrant, @access,
  * @nxe, @cr0_wp, @smep_andnot_wp and @smap_andnot_wp.
  */
 union kvm_mmu_page_role {
        u32 word;
        struct {
                unsigned level:4;
-               unsigned cr4_pae:1;
+               unsigned gpte_is_8_bytes:1;
                unsigned quadrant:2;
                unsigned direct:1;
                unsigned access:3;
@@ -350,6 +350,7 @@ struct kvm_mmu_page {
 };
 
 struct kvm_pio_request {
+       unsigned long linear_rip;
        unsigned long count;
        int in;
        int port;
@@ -568,6 +569,7 @@ struct kvm_vcpu_arch {
        bool tpr_access_reporting;
        u64 ia32_xss;
        u64 microcode_version;
+       u64 arch_capabilities;
 
        /*
         * Paging state of the vcpu
@@ -1192,6 +1194,8 @@ struct kvm_x86_ops {
        int (*nested_enable_evmcs)(struct kvm_vcpu *vcpu,
                                   uint16_t *vmcs_version);
        uint16_t (*nested_get_evmcs_version)(struct kvm_vcpu *vcpu);
+
+       bool (*need_emulation_on_page_fault)(struct kvm_vcpu *vcpu);
 };
 
 struct kvm_arch_async_pf {
@@ -1252,7 +1256,7 @@ void kvm_mmu_clear_dirty_pt_masked(struct kvm *kvm,
                                   gfn_t gfn_offset, unsigned long mask);
 void kvm_mmu_zap_all(struct kvm *kvm);
 void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen);
-unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm);
+unsigned int kvm_mmu_calculate_default_mmu_pages(struct kvm *kvm);
 void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages);
 
 int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3);
index aaedd73ea2c66a21c2456e8519841ebd6c56b18e..df700a6cc869bb6309bc1069e3e3c030b47281f7 100644 (file)
@@ -3,19 +3,6 @@
  * NSC/Cyrix CPU indexed register access. Must be inlined instead of
  * macros to ensure correct access ordering
  * Access order is always 0x22 (=offset), 0x23 (=value)
- *
- * When using the old macros a line like
- *   setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
- * gets expanded to:
- *  do {
- *    outb((CX86_CCR2), 0x22);
- *    outb((({
- *        outb((CX86_CCR2), 0x22);
- *        inb(0x23);
- *    }) | 0x88), 0x23);
- *  } while (0);
- *
- * which in fact violates the access order (= 0x22, 0x22, 0x23, 0x23).
  */
 
 static inline u8 getCx86(u8 reg)
@@ -29,11 +16,3 @@ static inline void setCx86(u8 reg, u8 data)
        outb(reg, 0x22);
        outb(data, 0x23);
 }
-
-#define getCx86_old(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86_old(reg, data) do { \
-       outb((reg), 0x22); \
-       outb((data), 0x23); \
-} while (0)
-
index 58176b56354e4977ff20fb6140ef119f912f9fb8..294ed4392a0ecd965b6b527ba499d3c1be1d1fce 100644 (file)
@@ -14,6 +14,7 @@
 #define pr_fmt(fmt) "AGP: " fmt
 
 #include <linux/kernel.h>
+#include <linux/kcore.h>
 #include <linux/types.h>
 #include <linux/init.h>
 #include <linux/memblock.h>
@@ -57,7 +58,7 @@ int fallback_aper_force __initdata;
 
 int fix_aperture __initdata = 1;
 
-#ifdef CONFIG_PROC_VMCORE
+#if defined(CONFIG_PROC_VMCORE) || defined(CONFIG_PROC_KCORE)
 /*
  * If the first kernel maps the aperture over e820 RAM, the kdump kernel will
  * use the same range because it will remain configured in the northbridge.
@@ -66,20 +67,25 @@ int fix_aperture __initdata = 1;
  */
 static unsigned long aperture_pfn_start, aperture_page_count;
 
-static int gart_oldmem_pfn_is_ram(unsigned long pfn)
+static int gart_mem_pfn_is_ram(unsigned long pfn)
 {
        return likely((pfn < aperture_pfn_start) ||
                      (pfn >= aperture_pfn_start + aperture_page_count));
 }
 
-static void exclude_from_vmcore(u64 aper_base, u32 aper_order)
+static void __init exclude_from_core(u64 aper_base, u32 aper_order)
 {
        aperture_pfn_start = aper_base >> PAGE_SHIFT;
        aperture_page_count = (32 * 1024 * 1024) << aper_order >> PAGE_SHIFT;
-       WARN_ON(register_oldmem_pfn_is_ram(&gart_oldmem_pfn_is_ram));
+#ifdef CONFIG_PROC_VMCORE
+       WARN_ON(register_oldmem_pfn_is_ram(&gart_mem_pfn_is_ram));
+#endif
+#ifdef CONFIG_PROC_KCORE
+       WARN_ON(register_mem_pfn_is_ram(&gart_mem_pfn_is_ram));
+#endif
 }
 #else
-static void exclude_from_vmcore(u64 aper_base, u32 aper_order)
+static void exclude_from_core(u64 aper_base, u32 aper_order)
 {
 }
 #endif
@@ -474,7 +480,7 @@ out:
                         * may have allocated the range over its e820 RAM
                         * and fixed up the northbridge
                         */
-                       exclude_from_vmcore(last_aper_base, last_aper_order);
+                       exclude_from_core(last_aper_base, last_aper_order);
 
                        return 1;
                }
@@ -520,7 +526,7 @@ out:
         * overlap with the first kernel's memory. We can't access the
         * range through vmcore even though it should be part of the dump.
         */
-       exclude_from_vmcore(aper_alloc, aper_order);
+       exclude_from_core(aper_alloc, aper_order);
 
        /* Fix up the north bridges */
        for (i = 0; i < amd_nb_bus_dev_ranges[i].dev_limit; i++) {
index d12226f60168e1d844be6dded3c666509326e7a2..1d9b8aaea06c8c9c7d14b0c30d51ded3bac83d7d 100644 (file)
@@ -124,7 +124,7 @@ static void set_cx86_reorder(void)
        setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */
 
        /* Load/Store Serialize to mem access disable (=reorder it) */
-       setCx86_old(CX86_PCR0, getCx86_old(CX86_PCR0) & ~0x80);
+       setCx86(CX86_PCR0, getCx86(CX86_PCR0) & ~0x80);
        /* set load/store serialize from 1GB to 4GB */
        ccr3 |= 0xe0;
        setCx86(CX86_CCR3, ccr3);
@@ -135,11 +135,11 @@ static void set_cx86_memwb(void)
        pr_info("Enable Memory-Write-back mode on Cyrix/NSC processor.\n");
 
        /* CCR2 bit 2: unlock NW bit */
-       setCx86_old(CX86_CCR2, getCx86_old(CX86_CCR2) & ~0x04);
+       setCx86(CX86_CCR2, getCx86(CX86_CCR2) & ~0x04);
        /* set 'Not Write-through' */
        write_cr0(read_cr0() | X86_CR0_NW);
        /* CCR2 bit 2: lock NW bit and set WT1 */
-       setCx86_old(CX86_CCR2, getCx86_old(CX86_CCR2) | 0x14);
+       setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x14);
 }
 
 /*
@@ -153,14 +153,14 @@ static void geode_configure(void)
        local_irq_save(flags);
 
        /* Suspend on halt power saving and enable #SUSP pin */
-       setCx86_old(CX86_CCR2, getCx86_old(CX86_CCR2) | 0x88);
+       setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
 
        ccr3 = getCx86(CX86_CCR3);
        setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10);       /* enable MAPEN */
 
 
        /* FPU fast, DTE cache, Mem bypass */
-       setCx86_old(CX86_CCR4, getCx86_old(CX86_CCR4) | 0x38);
+       setCx86(CX86_CCR4, getCx86(CX86_CCR4) | 0x38);
        setCx86(CX86_CCR3, ccr3);                       /* disable MAPEN */
 
        set_cx86_memwb();
@@ -296,7 +296,7 @@ static void init_cyrix(struct cpuinfo_x86 *c)
                /* GXm supports extended cpuid levels 'ala' AMD */
                if (c->cpuid_level == 2) {
                        /* Enable cxMMX extensions (GX1 Datasheet 54) */
-                       setCx86_old(CX86_CCR7, getCx86_old(CX86_CCR7) | 1);
+                       setCx86(CX86_CCR7, getCx86(CX86_CCR7) | 1);
 
                        /*
                         * GXm : 0x30 ... 0x5f GXm  datasheet 51
@@ -319,7 +319,7 @@ static void init_cyrix(struct cpuinfo_x86 *c)
                if (dir1 > 7) {
                        dir0_msn++;  /* M II */
                        /* Enable MMX extensions (App note 108) */
-                       setCx86_old(CX86_CCR7, getCx86_old(CX86_CCR7)|1);
+                       setCx86(CX86_CCR7, getCx86(CX86_CCR7)|1);
                } else {
                        /* A 6x86MX - it has the bug. */
                        set_cpu_bug(c, X86_BUG_COMA);
index 97f9ada9cedaf4e7cde47e819f7b4a0d6ac39d77..5260185cbf7ba1a77ecc30bdd61a99a2338b159b 100644 (file)
@@ -608,6 +608,8 @@ static int microcode_reload_late(void)
        if (ret > 0)
                microcode_check();
 
+       pr_info("Reload completed, microcode revision: 0x%x\n", boot_cpu_data.microcode);
+
        return ret;
 }
 
index dfd3aca82c61cbe345f462a62ea6b52fa0b81516..fb32925a2e62bc462c22429c4a5a5c73fca3c028 100644 (file)
@@ -905,6 +905,8 @@ int __init hpet_enable(void)
                return 0;
 
        hpet_set_mapping();
+       if (!hpet_virt_address)
+               return 0;
 
        /*
         * Read the period and check for a sane value:
index ff9bfd40429efeb7b4868d370628356e28265ec1..d7308302100276539e5c78798ee7ff013d719aa8 100644 (file)
@@ -354,6 +354,7 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,
 #endif
        default:
                WARN_ON_ONCE(1);
+               return -EINVAL;
        }
 
        /*
index 3482460d984d0395830c6227a39e639a5aa87b07..1bfe5c6e6cfe1a1e414b20dc4c92bce29ef9fbf7 100644 (file)
@@ -598,8 +598,8 @@ static int __init smp_scan_config(unsigned long base, unsigned long length)
                        mpf_base = base;
                        mpf_found = true;
 
-                       pr_info("found SMP MP-table at [mem %#010lx-%#010lx] mapped at [%p]\n",
-                               base, base + sizeof(*mpf) - 1, mpf);
+                       pr_info("found SMP MP-table at [mem %#010lx-%#010lx]\n",
+                               base, base + sizeof(*mpf) - 1);
 
                        memblock_reserve(base, sizeof(*mpf));
                        if (mpf->physptr)
index 27c43525a05f1afabeb705b27f955eba5fe5356d..421899f6ad7bfe28237f37bcee6fbee0485eb510 100644 (file)
@@ -526,7 +526,9 @@ static int stimer_set_config(struct kvm_vcpu_hv_stimer *stimer, u64 config,
                new_config.enable = 0;
        stimer->config.as_uint64 = new_config.as_uint64;
 
-       stimer_mark_pending(stimer, false);
+       if (stimer->config.enable)
+               stimer_mark_pending(stimer, false);
+
        return 0;
 }
 
@@ -542,7 +544,10 @@ static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count,
                stimer->config.enable = 0;
        else if (stimer->config.auto_enable)
                stimer->config.enable = 1;
-       stimer_mark_pending(stimer, false);
+
+       if (stimer->config.enable)
+               stimer_mark_pending(stimer, false);
+
        return 0;
 }
 
index 7837ab001d806f2f3ffd3a56e30d1bae916f7b03..eee455a8a612d00a516bfe892a690bcd8bc91e39 100644 (file)
@@ -182,7 +182,7 @@ struct kvm_shadow_walk_iterator {
 
 static const union kvm_mmu_page_role mmu_base_role_mask = {
        .cr0_wp = 1,
-       .cr4_pae = 1,
+       .gpte_is_8_bytes = 1,
        .nxe = 1,
        .smep_andnot_wp = 1,
        .smap_andnot_wp = 1,
@@ -2205,6 +2205,7 @@ static bool kvm_mmu_prepare_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp,
 static void kvm_mmu_commit_zap_page(struct kvm *kvm,
                                    struct list_head *invalid_list);
 
+
 #define for_each_valid_sp(_kvm, _sp, _gfn)                             \
        hlist_for_each_entry(_sp,                                       \
          &(_kvm)->arch.mmu_page_hash[kvm_page_table_hashfn(_gfn)], hash_link) \
@@ -2215,12 +2216,17 @@ static void kvm_mmu_commit_zap_page(struct kvm *kvm,
        for_each_valid_sp(_kvm, _sp, _gfn)                              \
                if ((_sp)->gfn != (_gfn) || (_sp)->role.direct) {} else
 
+static inline bool is_ept_sp(struct kvm_mmu_page *sp)
+{
+       return sp->role.cr0_wp && sp->role.smap_andnot_wp;
+}
+
 /* @sp->gfn should be write-protected at the call site */
 static bool __kvm_sync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
                            struct list_head *invalid_list)
 {
-       if (sp->role.cr4_pae != !!is_pae(vcpu)
-           || vcpu->arch.mmu->sync_page(vcpu, sp) == 0) {
+       if ((!is_ept_sp(sp) && sp->role.gpte_is_8_bytes != !!is_pae(vcpu)) ||
+           vcpu->arch.mmu->sync_page(vcpu, sp) == 0) {
                kvm_mmu_prepare_zap_page(vcpu->kvm, sp, invalid_list);
                return false;
        }
@@ -2423,7 +2429,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,
        role.level = level;
        role.direct = direct;
        if (role.direct)
-               role.cr4_pae = 0;
+               role.gpte_is_8_bytes = true;
        role.access = access;
        if (!vcpu->arch.mmu->direct_map
            && vcpu->arch.mmu->root_level <= PT32_ROOT_LEVEL) {
@@ -4794,7 +4800,6 @@ static union kvm_mmu_role kvm_calc_mmu_role_common(struct kvm_vcpu *vcpu,
 
        role.base.access = ACC_ALL;
        role.base.nxe = !!is_nx(vcpu);
-       role.base.cr4_pae = !!is_pae(vcpu);
        role.base.cr0_wp = is_write_protection(vcpu);
        role.base.smm = is_smm(vcpu);
        role.base.guest_mode = is_guest_mode(vcpu);
@@ -4815,6 +4820,7 @@ kvm_calc_tdp_mmu_root_page_role(struct kvm_vcpu *vcpu, bool base_only)
        role.base.ad_disabled = (shadow_accessed_mask == 0);
        role.base.level = kvm_x86_ops->get_tdp_level(vcpu);
        role.base.direct = true;
+       role.base.gpte_is_8_bytes = true;
 
        return role;
 }
@@ -4879,6 +4885,7 @@ kvm_calc_shadow_mmu_root_page_role(struct kvm_vcpu *vcpu, bool base_only)
        role.base.smap_andnot_wp = role.ext.cr4_smap &&
                !is_write_protection(vcpu);
        role.base.direct = !is_paging(vcpu);
+       role.base.gpte_is_8_bytes = !!is_pae(vcpu);
 
        if (!is_long_mode(vcpu))
                role.base.level = PT32E_ROOT_LEVEL;
@@ -4918,18 +4925,26 @@ static union kvm_mmu_role
 kvm_calc_shadow_ept_root_page_role(struct kvm_vcpu *vcpu, bool accessed_dirty,
                                   bool execonly)
 {
-       union kvm_mmu_role role;
+       union kvm_mmu_role role = {0};
 
-       /* Base role is inherited from root_mmu */
-       role.base.word = vcpu->arch.root_mmu.mmu_role.base.word;
-       role.ext = kvm_calc_mmu_role_ext(vcpu);
+       /* SMM flag is inherited from root_mmu */
+       role.base.smm = vcpu->arch.root_mmu.mmu_role.base.smm;
 
        role.base.level = PT64_ROOT_4LEVEL;
+       role.base.gpte_is_8_bytes = true;
        role.base.direct = false;
        role.base.ad_disabled = !accessed_dirty;
        role.base.guest_mode = true;
        role.base.access = ACC_ALL;
 
+       /*
+        * WP=1 and NOT_WP=1 is an impossible combination, use WP and the
+        * SMAP variation to denote shadow EPT entries.
+        */
+       role.base.cr0_wp = true;
+       role.base.smap_andnot_wp = true;
+
+       role.ext = kvm_calc_mmu_role_ext(vcpu);
        role.ext.execonly = execonly;
 
        return role;
@@ -5179,7 +5194,7 @@ static bool detect_write_misaligned(struct kvm_mmu_page *sp, gpa_t gpa,
                 gpa, bytes, sp->role.word);
 
        offset = offset_in_page(gpa);
-       pte_size = sp->role.cr4_pae ? 8 : 4;
+       pte_size = sp->role.gpte_is_8_bytes ? 8 : 4;
 
        /*
         * Sometimes, the OS only writes the last one bytes to update status
@@ -5203,7 +5218,7 @@ static u64 *get_written_sptes(struct kvm_mmu_page *sp, gpa_t gpa, int *nspte)
        page_offset = offset_in_page(gpa);
        level = sp->role.level;
        *nspte = 1;
-       if (!sp->role.cr4_pae) {
+       if (!sp->role.gpte_is_8_bytes) {
                page_offset <<= 1;      /* 32->64 */
                /*
                 * A 32-bit pde maps 4MB while the shadow pdes map
@@ -5393,10 +5408,12 @@ emulate:
         * This can happen if a guest gets a page-fault on data access but the HW
         * table walker is not able to read the instruction page (e.g instruction
         * page is not present in memory). In those cases we simply restart the
-        * guest.
+        * guest, with the exception of AMD Erratum 1096 which is unrecoverable.
         */
-       if (unlikely(insn && !insn_len))
-               return 1;
+       if (unlikely(insn && !insn_len)) {
+               if (!kvm_x86_ops->need_emulation_on_page_fault(vcpu))
+                       return 1;
+       }
 
        er = x86_emulate_instruction(vcpu, cr2, emulation_type, insn, insn_len);
 
@@ -5509,7 +5526,9 @@ slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot,
 
                if (need_resched() || spin_needbreak(&kvm->mmu_lock)) {
                        if (flush && lock_flush_tlb) {
-                               kvm_flush_remote_tlbs(kvm);
+                               kvm_flush_remote_tlbs_with_address(kvm,
+                                               start_gfn,
+                                               iterator.gfn - start_gfn + 1);
                                flush = false;
                        }
                        cond_resched_lock(&kvm->mmu_lock);
@@ -5517,7 +5536,8 @@ slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot,
        }
 
        if (flush && lock_flush_tlb) {
-               kvm_flush_remote_tlbs(kvm);
+               kvm_flush_remote_tlbs_with_address(kvm, start_gfn,
+                                                  end_gfn - start_gfn + 1);
                flush = false;
        }
 
@@ -6011,7 +6031,7 @@ out:
 /*
  * Calculate mmu pages needed for kvm.
  */
-unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm)
+unsigned int kvm_mmu_calculate_default_mmu_pages(struct kvm *kvm)
 {
        unsigned int nr_mmu_pages;
        unsigned int  nr_pages = 0;
index 9f6c855a00439a58f5c4ea58e099d935d65e22d9..dd30dccd2ad5e250aef10e889e150011fece3468 100644 (file)
                                                                        \
        role.word = __entry->role;                                      \
                                                                        \
-       trace_seq_printf(p, "sp gfn %llx l%u%s q%u%s %s%s"              \
+       trace_seq_printf(p, "sp gfn %llx l%u %u-byte q%u%s %s%s"        \
                         " %snxe %sad root %u %s%c",                    \
                         __entry->gfn, role.level,                      \
-                        role.cr4_pae ? " pae" : "",                    \
+                        role.gpte_is_8_bytes ? 8 : 4,                  \
                         role.quadrant,                                 \
                         role.direct ? " direct" : "",                  \
                         access_str[role.access],                       \
index b5b128a0a05124d275af1f103fe3e40315df80f5..426039285fd1fc5b10796c79278dd784af788545 100644 (file)
@@ -7098,6 +7098,36 @@ static int nested_enable_evmcs(struct kvm_vcpu *vcpu,
        return -ENODEV;
 }
 
+static bool svm_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
+{
+       bool is_user, smap;
+
+       is_user = svm_get_cpl(vcpu) == 3;
+       smap = !kvm_read_cr4_bits(vcpu, X86_CR4_SMAP);
+
+       /*
+        * Detect and workaround Errata 1096 Fam_17h_00_0Fh
+        *
+        * In non SEV guest, hypervisor will be able to read the guest
+        * memory to decode the instruction pointer when insn_len is zero
+        * so we return true to indicate that decoding is possible.
+        *
+        * But in the SEV guest, the guest memory is encrypted with the
+        * guest specific key and hypervisor will not be able to decode the
+        * instruction pointer so we will not able to workaround it. Lets
+        * print the error and request to kill the guest.
+        */
+       if (is_user && smap) {
+               if (!sev_guest(vcpu->kvm))
+                       return true;
+
+               pr_err_ratelimited("KVM: Guest triggered AMD Erratum 1096\n");
+               kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
+       }
+
+       return false;
+}
+
 static struct kvm_x86_ops svm_x86_ops __ro_after_init = {
        .cpu_has_kvm_support = has_svm,
        .disabled_by_bios = is_disabled,
@@ -7231,6 +7261,8 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = {
 
        .nested_enable_evmcs = nested_enable_evmcs,
        .nested_get_evmcs_version = nested_get_evmcs_version,
+
+       .need_emulation_on_page_fault = svm_need_emulation_on_page_fault,
 };
 
 static int __init svm_init(void)
index f24a2c2250706f24741e4503ed5ba60232b3613e..153e539c29c92fcb3c55c3737ec7e0533c13e1e2 100644 (file)
@@ -2585,6 +2585,11 @@ static int nested_check_host_control_regs(struct kvm_vcpu *vcpu,
            !nested_host_cr4_valid(vcpu, vmcs12->host_cr4) ||
            !nested_cr3_valid(vcpu, vmcs12->host_cr3))
                return -EINVAL;
+
+       if (is_noncanonical_address(vmcs12->host_ia32_sysenter_esp, vcpu) ||
+           is_noncanonical_address(vmcs12->host_ia32_sysenter_eip, vcpu))
+               return -EINVAL;
+
        /*
         * If the load IA32_EFER VM-exit control is 1, bits reserved in the
         * IA32_EFER MSR must be 0 in the field for that register. In addition,
index c73375e01ab8c4ca52d5d87e2ca9b3648906485a..ab432a930ae865d0000d8273643de236d0738fb8 100644 (file)
@@ -1683,12 +1683,6 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 
                msr_info->data = to_vmx(vcpu)->spec_ctrl;
                break;
-       case MSR_IA32_ARCH_CAPABILITIES:
-               if (!msr_info->host_initiated &&
-                   !guest_cpuid_has(vcpu, X86_FEATURE_ARCH_CAPABILITIES))
-                       return 1;
-               msr_info->data = to_vmx(vcpu)->arch_capabilities;
-               break;
        case MSR_IA32_SYSENTER_CS:
                msr_info->data = vmcs_read32(GUEST_SYSENTER_CS);
                break;
@@ -1895,11 +1889,6 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD,
                                              MSR_TYPE_W);
                break;
-       case MSR_IA32_ARCH_CAPABILITIES:
-               if (!msr_info->host_initiated)
-                       return 1;
-               vmx->arch_capabilities = data;
-               break;
        case MSR_IA32_CR_PAT:
                if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
                        if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data))
@@ -4088,8 +4077,6 @@ static void vmx_vcpu_setup(struct vcpu_vmx *vmx)
                ++vmx->nmsrs;
        }
 
-       vmx->arch_capabilities = kvm_get_arch_capabilities();
-
        vm_exit_controls_init(vmx, vmx_vmexit_ctrl());
 
        /* 22.2.1, 20.8.1 */
@@ -7409,6 +7396,11 @@ static int enable_smi_window(struct kvm_vcpu *vcpu)
        return 0;
 }
 
+static bool vmx_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
+{
+       return 0;
+}
+
 static __init int hardware_setup(void)
 {
        unsigned long host_bndcfgs;
@@ -7711,6 +7703,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = {
        .set_nested_state = NULL,
        .get_vmcs12_pages = NULL,
        .nested_enable_evmcs = NULL,
+       .need_emulation_on_page_fault = vmx_need_emulation_on_page_fault,
 };
 
 static void vmx_cleanup_l1d_flush(void)
index 1554cb45b3931a6de9d91b0092de1ff85d4c993f..a1e00d0a2482c16b81be561c30a4d10d3233975b 100644 (file)
@@ -190,7 +190,6 @@ struct vcpu_vmx {
        u64                   msr_guest_kernel_gs_base;
 #endif
 
-       u64                   arch_capabilities;
        u64                   spec_ctrl;
 
        u32 vm_entry_controls_shadow;
index 65e4559eef2fc8589e0a4277077e766ceead3994..099b851dabafd7e2980f96472209777f9cc8f77b 100644 (file)
@@ -1125,7 +1125,7 @@ static u32 msrs_to_save[] = {
 #endif
        MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA,
        MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, MSR_TSC_AUX,
-       MSR_IA32_SPEC_CTRL, MSR_IA32_ARCH_CAPABILITIES,
+       MSR_IA32_SPEC_CTRL,
        MSR_IA32_RTIT_CTL, MSR_IA32_RTIT_STATUS, MSR_IA32_RTIT_CR3_MATCH,
        MSR_IA32_RTIT_OUTPUT_BASE, MSR_IA32_RTIT_OUTPUT_MASK,
        MSR_IA32_RTIT_ADDR0_A, MSR_IA32_RTIT_ADDR0_B,
@@ -1158,6 +1158,7 @@ static u32 emulated_msrs[] = {
 
        MSR_IA32_TSC_ADJUST,
        MSR_IA32_TSCDEADLINE,
+       MSR_IA32_ARCH_CAPABILITIES,
        MSR_IA32_MISC_ENABLE,
        MSR_IA32_MCG_STATUS,
        MSR_IA32_MCG_CTL,
@@ -2443,6 +2444,11 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                if (msr_info->host_initiated)
                        vcpu->arch.microcode_version = data;
                break;
+       case MSR_IA32_ARCH_CAPABILITIES:
+               if (!msr_info->host_initiated)
+                       return 1;
+               vcpu->arch.arch_capabilities = data;
+               break;
        case MSR_EFER:
                return set_efer(vcpu, data);
        case MSR_K7_HWCR:
@@ -2747,6 +2753,12 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
        case MSR_IA32_UCODE_REV:
                msr_info->data = vcpu->arch.microcode_version;
                break;
+       case MSR_IA32_ARCH_CAPABILITIES:
+               if (!msr_info->host_initiated &&
+                   !guest_cpuid_has(vcpu, X86_FEATURE_ARCH_CAPABILITIES))
+                       return 1;
+               msr_info->data = vcpu->arch.arch_capabilities;
+               break;
        case MSR_IA32_TSC:
                msr_info->data = kvm_scale_tsc(vcpu, rdtsc()) + vcpu->arch.tsc_offset;
                break;
@@ -6523,14 +6535,27 @@ int kvm_emulate_instruction_from_buffer(struct kvm_vcpu *vcpu,
 }
 EXPORT_SYMBOL_GPL(kvm_emulate_instruction_from_buffer);
 
+static int complete_fast_pio_out(struct kvm_vcpu *vcpu)
+{
+       vcpu->arch.pio.count = 0;
+
+       if (unlikely(!kvm_is_linear_rip(vcpu, vcpu->arch.pio.linear_rip)))
+               return 1;
+
+       return kvm_skip_emulated_instruction(vcpu);
+}
+
 static int kvm_fast_pio_out(struct kvm_vcpu *vcpu, int size,
                            unsigned short port)
 {
        unsigned long val = kvm_register_read(vcpu, VCPU_REGS_RAX);
        int ret = emulator_pio_out_emulated(&vcpu->arch.emulate_ctxt,
                                            size, port, &val, 1);
-       /* do not return to emulator after return from userspace */
-       vcpu->arch.pio.count = 0;
+
+       if (!ret) {
+               vcpu->arch.pio.linear_rip = kvm_get_linear_rip(vcpu);
+               vcpu->arch.complete_userspace_io = complete_fast_pio_out;
+       }
        return ret;
 }
 
@@ -6541,6 +6566,11 @@ static int complete_fast_pio_in(struct kvm_vcpu *vcpu)
        /* We should only ever be called with arch.pio.count equal to 1 */
        BUG_ON(vcpu->arch.pio.count != 1);
 
+       if (unlikely(!kvm_is_linear_rip(vcpu, vcpu->arch.pio.linear_rip))) {
+               vcpu->arch.pio.count = 0;
+               return 1;
+       }
+
        /* For size less than 4 we merge, else we zero extend */
        val = (vcpu->arch.pio.size < 4) ? kvm_register_read(vcpu, VCPU_REGS_RAX)
                                        : 0;
@@ -6553,7 +6583,7 @@ static int complete_fast_pio_in(struct kvm_vcpu *vcpu)
                                 vcpu->arch.pio.port, &val, 1);
        kvm_register_write(vcpu, VCPU_REGS_RAX, val);
 
-       return 1;
+       return kvm_skip_emulated_instruction(vcpu);
 }
 
 static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size,
@@ -6572,6 +6602,7 @@ static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size,
                return ret;
        }
 
+       vcpu->arch.pio.linear_rip = kvm_get_linear_rip(vcpu);
        vcpu->arch.complete_userspace_io = complete_fast_pio_in;
 
        return 0;
@@ -6579,16 +6610,13 @@ static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size,
 
 int kvm_fast_pio(struct kvm_vcpu *vcpu, int size, unsigned short port, int in)
 {
-       int ret = kvm_skip_emulated_instruction(vcpu);
+       int ret;
 
-       /*
-        * TODO: we might be squashing a KVM_GUESTDBG_SINGLESTEP-triggered
-        * KVM_EXIT_DEBUG here.
-        */
        if (in)
-               return kvm_fast_pio_in(vcpu, size, port) && ret;
+               ret = kvm_fast_pio_in(vcpu, size, port);
        else
-               return kvm_fast_pio_out(vcpu, size, port) && ret;
+               ret = kvm_fast_pio_out(vcpu, size, port);
+       return ret && kvm_skip_emulated_instruction(vcpu);
 }
 EXPORT_SYMBOL_GPL(kvm_fast_pio);
 
@@ -8733,6 +8761,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
 
 int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
+       vcpu->arch.arch_capabilities = kvm_get_arch_capabilities();
        vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT;
        kvm_vcpu_mtrr_init(vcpu);
        vcpu_load(vcpu);
@@ -9429,13 +9458,9 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
                                const struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
 {
-       int nr_mmu_pages = 0;
-
        if (!kvm->arch.n_requested_mmu_pages)
-               nr_mmu_pages = kvm_mmu_calculate_mmu_pages(kvm);
-
-       if (nr_mmu_pages)
-               kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
+               kvm_mmu_change_mmu_pages(kvm,
+                               kvm_mmu_calculate_default_mmu_pages(kvm));
 
        /*
         * Dirty logging tracks sptes in 4k granularity, meaning that large
index 9baca3e054bef32acd14a538d14289adee71fee0..e7925d668b680269fb2442766deaf416dc42f9a1 100644 (file)
@@ -94,7 +94,7 @@ static unsigned do_csum(const unsigned char *buff, unsigned len)
                                    : "m" (*(unsigned long *)buff), 
                                    "r" (zero),  "0" (result));
                                --count; 
-                                       buff += 8;
+                               buff += 8;
                        }
                        result = add32_with_carry(result>>32,
                                                  result&0xffffffff); 
index 4fee5c3003ed78ab9566fe92f09e0d14968c9865..139b28a01ce47f90b770b0eea4a98f35664a6ef5 100644 (file)
@@ -77,7 +77,7 @@ static void __init pti_print_if_secure(const char *reason)
                pr_info("%s\n", reason);
 }
 
-enum pti_mode {
+static enum pti_mode {
        PTI_AUTO = 0,
        PTI_FORCE_OFF,
        PTI_FORCE_ON
@@ -602,7 +602,7 @@ static void pti_clone_kernel_text(void)
        set_memory_global(start, (end_global - start) >> PAGE_SHIFT);
 }
 
-void pti_set_kernel_image_nonglobal(void)
+static void pti_set_kernel_image_nonglobal(void)
 {
        /*
         * The identity map is created with PMDs, regardless of the
index 42b6cb3d16f7b9666baf44daf0a63757786d729b..3843198e03d4ba1b8772caeada4897d2cc1fbad1 100644 (file)
@@ -15,6 +15,7 @@ generic-y += irq_work.h
 generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += kprobes.h
+generic-y += kvm_para.h
 generic-y += local.h
 generic-y += local64.h
 generic-y += mcs_spinlock.h
index 8a7ad40be463656854310b85dbba06d5f9b8e189..7417847dc438e5ff6aff14f04094a1323d6b933f 100644 (file)
@@ -1,2 +1 @@
 generated-y += unistd_32.h
-generic-y += kvm_para.h
index 71a78d9fb8b722d767f9062813e344a3bc8b90b7..b64cedc7f87cf1cf5f24bf4c50c808ae6a59f210 100644 (file)
@@ -849,20 +849,14 @@ static int __bio_iov_bvec_add_pages(struct bio *bio, struct iov_iter *iter)
        size = bio_add_page(bio, bv->bv_page, len,
                                bv->bv_offset + iter->iov_offset);
        if (size == len) {
-               struct page *page;
-               int i;
+               if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {
+                       struct page *page;
+                       int i;
+
+                       mp_bvec_for_each_page(page, bv, i)
+                               get_page(page);
+               }
 
-               /*
-                * For the normal O_DIRECT case, we could skip grabbing this
-                * reference and then not have to put them again when IO
-                * completes. But this breaks some in-kernel users, like
-                * splicing to/from a loop device, where we release the pipe
-                * pages unconditionally. If we can fix that case, we can
-                * get rid of the get here and the need to call
-                * bio_release_pages() at IO completion time.
-                */
-               mp_bvec_for_each_page(page, bv, i)
-                       get_page(page);
                iov_iter_advance(iter, size);
                return 0;
        }
@@ -925,10 +919,12 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
  * This takes either an iterator pointing to user memory, or one pointing to
  * kernel pages (BVEC iterator). If we're adding user pages, we pin them and
  * map them into the kernel. On IO completion, the caller should put those
- * pages. For now, when adding kernel pages, we still grab a reference to the
- * page. This isn't strictly needed for the common case, but some call paths
- * end up releasing pages from eg a pipe and we can't easily control these.
- * See comment in __bio_iov_bvec_add_pages().
+ * pages. If we're adding kernel pages, and the caller told us it's safe to
+ * do so, we just have to add the pages to the bio directly. We don't grab an
+ * extra reference to those pages (the user should already have that), and we
+ * don't put the page on IO completion. The caller needs to check if the bio is
+ * flagged BIO_NO_PAGE_REF on IO completion. If it isn't, then pages should be
+ * released.
  *
  * The function tries, but does not guarantee, to pin as many pages as
  * fit into the bio, or are requested in *iter, whatever is smaller. If
@@ -940,6 +936,13 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
        const bool is_bvec = iov_iter_is_bvec(iter);
        unsigned short orig_vcnt = bio->bi_vcnt;
 
+       /*
+        * If this is a BVEC iter, then the pages are kernel pages. Don't
+        * release them on IO completion, if the caller asked us to.
+        */
+       if (is_bvec && iov_iter_bvec_no_ref(iter))
+               bio_set_flag(bio, BIO_NO_PAGE_REF);
+
        do {
                int ret;
 
@@ -1696,7 +1699,8 @@ static void bio_dirty_fn(struct work_struct *work)
                next = bio->bi_private;
 
                bio_set_pages_dirty(bio);
-               bio_release_pages(bio);
+               if (!bio_flagged(bio, BIO_NO_PAGE_REF))
+                       bio_release_pages(bio);
                bio_put(bio);
        }
 }
@@ -1713,7 +1717,8 @@ void bio_check_pages_dirty(struct bio *bio)
                        goto defer;
        }
 
-       bio_release_pages(bio);
+       if (!bio_flagged(bio, BIO_NO_PAGE_REF))
+               bio_release_pages(bio);
        bio_put(bio);
        return;
 defer:
index 77f37ef8ef06a68da12d380eec7f790030313ad4..617a2b3f758219b3dc7d9b6a592a68eea8edb060 100644 (file)
@@ -1736,8 +1736,8 @@ out:
 
 /**
  * blkcg_schedule_throttle - this task needs to check for throttling
- * @q - the request queue IO was submitted on
- * @use_memdelay - do we charge this to memory delay for PSI
+ * @q: the request queue IO was submitted on
+ * @use_memdelay: do we charge this to memory delay for PSI
  *
  * This is called by the IO controller when we know there's delay accumulated
  * for the blkg for this task.  We do not pass the blkg because there are places
@@ -1769,8 +1769,9 @@ void blkcg_schedule_throttle(struct request_queue *q, bool use_memdelay)
 
 /**
  * blkcg_add_delay - add delay to this blkg
- * @now - the current time in nanoseconds
- * @delta - how many nanoseconds of delay to add
+ * @blkg: blkg of interest
+ * @now: the current time in nanoseconds
+ * @delta: how many nanoseconds of delay to add
  *
  * Charge @delta to the blkg's current delay accumulation.  This is used to
  * throttle tasks if an IO controller thinks we need more throttling.
index 2620baa1f6993db5e6706a36240ab4c6a2931038..507212d75ee2c473c1ca8fd38f9eeedc1d6894ee 100644 (file)
@@ -75,6 +75,7 @@
 #include <linux/blk-mq.h>
 #include "blk-rq-qos.h"
 #include "blk-stat.h"
+#include "blk.h"
 
 #define DEFAULT_SCALE_COOKIE 1000000U
 
index a9c181603cbda2df9f9b59d9c447b19d3f9c2889..70b210a308c452b43abd1a270e759f5e331ab55f 100644 (file)
@@ -782,7 +782,6 @@ void blk_mq_add_to_requeue_list(struct request *rq, bool at_head,
        if (kick_requeue_list)
                blk_mq_kick_requeue_list(q);
 }
-EXPORT_SYMBOL(blk_mq_add_to_requeue_list);
 
 void blk_mq_kick_requeue_list(struct request_queue *q)
 {
@@ -1093,8 +1092,7 @@ static bool blk_mq_mark_tag_wait(struct blk_mq_hw_ctx *hctx,
        bool ret;
 
        if (!(hctx->flags & BLK_MQ_F_TAG_SHARED)) {
-               if (!test_bit(BLK_MQ_S_SCHED_RESTART, &hctx->state))
-                       set_bit(BLK_MQ_S_SCHED_RESTART, &hctx->state);
+               blk_mq_sched_mark_restart_hctx(hctx);
 
                /*
                 * It's possible that a tag was freed in the window between the
@@ -2857,7 +2855,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
        /*
         * Default to classic polling
         */
-       q->poll_nsec = -1;
+       q->poll_nsec = BLK_MQ_POLL_CLASSIC;
 
        blk_mq_init_cpu_queues(q, set->nr_hw_queues);
        blk_mq_add_queue_tag_set(set, q);
@@ -3392,7 +3390,7 @@ static bool blk_mq_poll_hybrid(struct request_queue *q,
 {
        struct request *rq;
 
-       if (q->poll_nsec == -1)
+       if (q->poll_nsec == BLK_MQ_POLL_CLASSIC)
                return false;
 
        if (!blk_qc_t_is_internal(cookie))
index c11353a3749dc3422cb564e848e7225634414a6c..0ed8e5a8729fccd39d5da0e58854bdb5c5de42da 100644 (file)
@@ -41,6 +41,8 @@ void blk_mq_free_queue(struct request_queue *q);
 int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr);
 void blk_mq_wake_waiters(struct request_queue *q);
 bool blk_mq_dispatch_rq_list(struct request_queue *, struct list_head *, bool);
+void blk_mq_add_to_requeue_list(struct request *rq, bool at_head,
+                               bool kick_requeue_list);
 void blk_mq_flush_busy_ctxs(struct blk_mq_hw_ctx *hctx, struct list_head *list);
 bool blk_mq_get_driver_tag(struct request *rq);
 struct request *blk_mq_dequeue_from_ctx(struct blk_mq_hw_ctx *hctx,
index 59685918167e51d80a2808861b3f2f7744dec3a7..422327089e0fd963dbfaf346be68f7951da15df2 100644 (file)
@@ -360,8 +360,8 @@ static ssize_t queue_poll_delay_show(struct request_queue *q, char *page)
 {
        int val;
 
-       if (q->poll_nsec == -1)
-               val = -1;
+       if (q->poll_nsec == BLK_MQ_POLL_CLASSIC)
+               val = BLK_MQ_POLL_CLASSIC;
        else
                val = q->poll_nsec / 1000;
 
@@ -380,10 +380,12 @@ static ssize_t queue_poll_delay_store(struct request_queue *q, const char *page,
        if (err < 0)
                return err;
 
-       if (val == -1)
-               q->poll_nsec = -1;
-       else
+       if (val == BLK_MQ_POLL_CLASSIC)
+               q->poll_nsec = BLK_MQ_POLL_CLASSIC;
+       else if (val >= 0)
                q->poll_nsec = val * 1000;
+       else
+               return -EINVAL;
 
        return count;
 }
index 78db97687f26a1512130ffadda01f3372dd4ae34..c4b06cc075f937f8a4c8b4c7b76cb3344b25d0f0 100644 (file)
@@ -800,6 +800,7 @@ bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
        match.hrv = hrv;
 
        dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb);
+       put_device(dev);
        return !!dev;
 }
 EXPORT_SYMBOL(acpi_dev_present);
index 57410f9c5d44cc11b9156159a49bacf6173168ab..c52c738e554a2dfe8e660973ce8a2685d9a1934b 100644 (file)
@@ -164,9 +164,7 @@ config ARM_CHARLCD
          line and the Linux version on the second line, but that's
          still useful.
 
-endif # AUXDISPLAY
-
-menuconfig PANEL
+menuconfig PARPORT_PANEL
        tristate "Parallel port LCD/Keypad Panel support"
        depends on PARPORT
        select CHARLCD
@@ -178,7 +176,7 @@ menuconfig PANEL
          compiled as a module, or linked into the kernel and started at boot.
          If you don't understand what all this is about, say N.
 
-if PANEL
+if PARPORT_PANEL
 
 config PANEL_PARPORT
        int "Default parallel port number (0=LPT1)"
@@ -419,8 +417,11 @@ config PANEL_LCD_PIN_BL
 
          Default for the 'BL' pin in custom profile is '0' (uncontrolled).
 
+endif # PARPORT_PANEL
+
 config PANEL_CHANGE_MESSAGE
        bool "Change LCD initialization message ?"
+       depends on CHARLCD
        default "n"
        ---help---
          This allows you to replace the boot message indicating the kernel version
@@ -444,7 +445,34 @@ config PANEL_BOOT_MESSAGE
          An empty message will only clear the display at driver init time. Any other
          printf()-formatted message is valid with newline and escape codes.
 
-endif # PANEL
+choice
+       prompt "Backlight initial state"
+       default CHARLCD_BL_FLASH
+
+       config CHARLCD_BL_OFF
+               bool "Off"
+               help
+                 Backlight is initially turned off
+
+       config CHARLCD_BL_ON
+               bool "On"
+               help
+                 Backlight is initially turned on
+
+       config CHARLCD_BL_FLASH
+               bool "Flash"
+               help
+                 Backlight is flashed briefly on init
+
+endchoice
+
+endif # AUXDISPLAY
+
+config PANEL
+       tristate "Parallel port LCD/Keypad Panel support (OLD OPTION)"
+       depends on PARPORT
+       select AUXDISPLAY
+       select PARPORT_PANEL
 
 config CHARLCD
        tristate "Character LCD core support" if COMPILE_TEST
index 7ac6776ca3f674683c538aca2d7473198e01a3a9..cf54b5efb07e00ae1249dfbc95ef4c88a0f08386 100644 (file)
@@ -10,4 +10,4 @@ obj-$(CONFIG_CFAG12864B)      += cfag12864b.o cfag12864bfb.o
 obj-$(CONFIG_IMG_ASCII_LCD)    += img-ascii-lcd.o
 obj-$(CONFIG_HD44780)          += hd44780.o
 obj-$(CONFIG_HT16K33)          += ht16k33.o
-obj-$(CONFIG_PANEL)             += panel.o
+obj-$(CONFIG_PARPORT_PANEL)    += panel.o
index 60e0b772673f3bd0c631efb6e45b0f624f75aa8a..92745efefb540e5d723f5bbaa3aefd11735b0f29 100644 (file)
@@ -91,7 +91,7 @@ struct charlcd_priv {
        unsigned long long drvdata[0];
 };
 
-#define to_priv(p)     container_of(p, struct charlcd_priv, lcd)
+#define charlcd_to_priv(p)     container_of(p, struct charlcd_priv, lcd)
 
 /* Device single-open policy control */
 static atomic_t charlcd_available = ATOMIC_INIT(1);
@@ -105,7 +105,7 @@ static void long_sleep(int ms)
 /* turn the backlight on or off */
 static void charlcd_backlight(struct charlcd *lcd, int on)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        if (!lcd->ops->backlight)
                return;
@@ -134,7 +134,7 @@ static void charlcd_bl_off(struct work_struct *work)
 /* turn the backlight on for a little while */
 void charlcd_poke(struct charlcd *lcd)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        if (!lcd->ops->backlight)
                return;
@@ -152,7 +152,7 @@ EXPORT_SYMBOL_GPL(charlcd_poke);
 
 static void charlcd_gotoxy(struct charlcd *lcd)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
        unsigned int addr;
 
        /*
@@ -170,7 +170,7 @@ static void charlcd_gotoxy(struct charlcd *lcd)
 
 static void charlcd_home(struct charlcd *lcd)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        priv->addr.x = 0;
        priv->addr.y = 0;
@@ -179,7 +179,7 @@ static void charlcd_home(struct charlcd *lcd)
 
 static void charlcd_print(struct charlcd *lcd, char c)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        if (priv->addr.x < lcd->bwidth) {
                if (lcd->char_conv)
@@ -211,7 +211,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
 /* clears the display and resets X/Y */
 static void charlcd_clear_display(struct charlcd *lcd)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        lcd->ops->write_cmd(lcd, LCD_CMD_DISPLAY_CLEAR);
        priv->addr.x = 0;
@@ -223,7 +223,7 @@ static void charlcd_clear_display(struct charlcd *lcd)
 static int charlcd_init_display(struct charlcd *lcd)
 {
        void (*write_cmd_raw)(struct charlcd *lcd, int cmd);
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
        u8 init;
 
        if (lcd->ifwidth != 4 && lcd->ifwidth != 8)
@@ -369,7 +369,7 @@ static bool parse_xy(const char *s, unsigned long *x, unsigned long *y)
 
 static inline int handle_lcd_special_code(struct charlcd *lcd)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        /* LCD special codes */
 
@@ -580,7 +580,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
 
 static void charlcd_write_char(struct charlcd *lcd, char c)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        /* first, we'll test if we're in escape mode */
        if ((c != '\n') && priv->esc_seq.len >= 0) {
@@ -705,7 +705,7 @@ static ssize_t charlcd_write(struct file *file, const char __user *buf,
 
 static int charlcd_open(struct inode *inode, struct file *file)
 {
-       struct charlcd_priv *priv = to_priv(the_charlcd);
+       struct charlcd_priv *priv = charlcd_to_priv(the_charlcd);
        int ret;
 
        ret = -EBUSY;
@@ -763,10 +763,24 @@ static void charlcd_puts(struct charlcd *lcd, const char *s)
        }
 }
 
+#ifdef CONFIG_PANEL_BOOT_MESSAGE
+#define LCD_INIT_TEXT CONFIG_PANEL_BOOT_MESSAGE
+#else
+#define LCD_INIT_TEXT "Linux-" UTS_RELEASE "\n"
+#endif
+
+#ifdef CONFIG_CHARLCD_BL_ON
+#define LCD_INIT_BL "\x1b[L+"
+#elif defined(CONFIG_CHARLCD_BL_FLASH)
+#define LCD_INIT_BL "\x1b[L*"
+#else
+#define LCD_INIT_BL "\x1b[L-"
+#endif
+
 /* initialize the LCD driver */
 static int charlcd_init(struct charlcd *lcd)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
        int ret;
 
        if (lcd->ops->backlight) {
@@ -784,13 +798,8 @@ static int charlcd_init(struct charlcd *lcd)
                return ret;
 
        /* display a short message */
-#ifdef CONFIG_PANEL_CHANGE_MESSAGE
-#ifdef CONFIG_PANEL_BOOT_MESSAGE
-       charlcd_puts(lcd, "\x1b[Lc\x1b[Lb\x1b[L*" CONFIG_PANEL_BOOT_MESSAGE);
-#endif
-#else
-       charlcd_puts(lcd, "\x1b[Lc\x1b[Lb\x1b[L*Linux-" UTS_RELEASE "\n");
-#endif
+       charlcd_puts(lcd, "\x1b[Lc\x1b[Lb" LCD_INIT_BL LCD_INIT_TEXT);
+
        /* clear the display on the next device opening */
        priv->must_clear = true;
        charlcd_home(lcd);
@@ -818,6 +827,12 @@ struct charlcd *charlcd_alloc(unsigned int drvdata_size)
 }
 EXPORT_SYMBOL_GPL(charlcd_alloc);
 
+void charlcd_free(struct charlcd *lcd)
+{
+       kfree(charlcd_to_priv(lcd));
+}
+EXPORT_SYMBOL_GPL(charlcd_free);
+
 static int panel_notify_sys(struct notifier_block *this, unsigned long code,
                            void *unused)
 {
@@ -866,7 +881,7 @@ EXPORT_SYMBOL_GPL(charlcd_register);
 
 int charlcd_unregister(struct charlcd *lcd)
 {
-       struct charlcd_priv *priv = to_priv(lcd);
+       struct charlcd_priv *priv = charlcd_to_priv(lcd);
 
        unregister_reboot_notifier(&panel_notifier);
        charlcd_puts(lcd, "\x0cLCD driver unloaded.\x1b[Lc\x1b[Lb\x1b[L-");
index 9ad93ea42fdc73e81242ea358ffb357612833367..ab15b64707ad22ef429a7ee6911d72ec9a284bd5 100644 (file)
@@ -271,7 +271,7 @@ static int hd44780_probe(struct platform_device *pdev)
        return 0;
 
 fail:
-       kfree(lcd);
+       charlcd_free(lcd);
        return ret;
 }
 
@@ -280,6 +280,8 @@ static int hd44780_remove(struct platform_device *pdev)
        struct charlcd *lcd = platform_get_drvdata(pdev);
 
        charlcd_unregister(lcd);
+
+       charlcd_free(lcd);
        return 0;
 }
 
index 21b9b2f2470a26d1f2d1c2d5eb4237fe3902af82..e06de63497cf8f00edde8d2d7bcffa5b25cc8e81 100644 (file)
@@ -1620,7 +1620,7 @@ err_lcd_unreg:
        if (lcd.enabled)
                charlcd_unregister(lcd.charlcd);
 err_unreg_device:
-       kfree(lcd.charlcd);
+       charlcd_free(lcd.charlcd);
        lcd.charlcd = NULL;
        parport_unregister_device(pprt);
        pprt = NULL;
@@ -1647,7 +1647,7 @@ static void panel_detach(struct parport *port)
        if (lcd.enabled) {
                charlcd_unregister(lcd.charlcd);
                lcd.initialized = false;
-               kfree(lcd.charlcd);
+               charlcd_free(lcd.charlcd);
                lcd.charlcd = NULL;
        }
 
index 76c9969b7124c11cf1638a82cc223999ae5e1b8a..96a6dc9d305c88b842258f4ed91cc7b7b569d506 100644 (file)
@@ -1469,12 +1469,12 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
        if (IS_ERR(gpd_data))
                return PTR_ERR(gpd_data);
 
-       genpd_lock(genpd);
-
        ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0;
        if (ret)
                goto out;
 
+       genpd_lock(genpd);
+
        dev_pm_domain_set(dev, &genpd->domain);
 
        genpd->device_count++;
@@ -1482,9 +1482,8 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
 
        list_add_tail(&gpd_data->base.list_node, &genpd->dev_list);
 
- out:
        genpd_unlock(genpd);
-
+ out:
        if (ret)
                genpd_free_dev_data(dev, gpd_data);
        else
@@ -1533,15 +1532,15 @@ static int genpd_remove_device(struct generic_pm_domain *genpd,
        genpd->device_count--;
        genpd->max_off_time_changed = true;
 
-       if (genpd->detach_dev)
-               genpd->detach_dev(genpd, dev);
-
        dev_pm_domain_set(dev, NULL);
 
        list_del_init(&pdd->list_node);
 
        genpd_unlock(genpd);
 
+       if (genpd->detach_dev)
+               genpd->detach_dev(genpd, dev);
+
        genpd_free_dev_data(dev, gpd_data);
 
        return 0;
index 1fad9291f6aaa6d893c45186a8a24e495f5169fc..7fc5a18e02ad5de5cf7269c79b33a7cecb3bfc21 100644 (file)
@@ -472,7 +472,7 @@ static int software_node_read_string_array(const struct fwnode_handle *fwnode,
                                                val, nval);
 }
 
-struct fwnode_handle *
+static struct fwnode_handle *
 software_node_get_parent(const struct fwnode_handle *fwnode)
 {
        struct software_node *swnode = to_software_node(fwnode);
@@ -481,7 +481,7 @@ software_node_get_parent(const struct fwnode_handle *fwnode)
                        NULL;
 }
 
-struct fwnode_handle *
+static struct fwnode_handle *
 software_node_get_next_child(const struct fwnode_handle *fwnode,
                             struct fwnode_handle *child)
 {
index 1e6edd568214f40400a5fc7eff474b316a4afda0..bf1c61cab8eb1cec135432fe52f1145653cfacd7 100644 (file)
@@ -656,7 +656,7 @@ static int loop_validate_file(struct file *file, struct block_device *bdev)
                        return -EBADF;
 
                l = f->f_mapping->host->i_bdev->bd_disk->private_data;
-               if (l->lo_state == Lo_unbound) {
+               if (l->lo_state != Lo_bound) {
                        return -EINVAL;
                }
                f = l->lo_backing_file;
index 96670eefaeb2c3458964110a39bddd942ff9fde1..377a694dc22814b9d040a64a9d3ffd7666f5a6a4 100644 (file)
@@ -749,8 +749,12 @@ static int pcd_detect(void)
                return 0;
 
        printk("%s: No CD-ROM drive found\n", name);
-       for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++)
+       for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
+               blk_cleanup_queue(cd->disk->queue);
+               cd->disk->queue = NULL;
+               blk_mq_free_tag_set(&cd->tag_set);
                put_disk(cd->disk);
+       }
        pi_unregister_driver(par_drv);
        return -1;
 }
index e92e7a8eeeb2bf066d522277ead805324aecde9e..103b617cdc3184c0a381e569fbb8d8c81894585c 100644 (file)
@@ -761,8 +761,12 @@ static int pf_detect(void)
                return 0;
 
        printk("%s: No ATAPI disk detected\n", name);
-       for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
+       for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
+               blk_cleanup_queue(pf->disk->queue);
+               pf->disk->queue = NULL;
+               blk_mq_free_tag_set(&pf->tag_set);
                put_disk(pf->disk);
+       }
        pi_unregister_driver(par_drv);
        return -1;
 }
@@ -1047,13 +1051,15 @@ static void __exit pf_exit(void)
        int unit;
        unregister_blkdev(major, name);
        for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
-               if (!pf->present)
-                       continue;
-               del_gendisk(pf->disk);
+               if (pf->present)
+                       del_gendisk(pf->disk);
+
                blk_cleanup_queue(pf->disk->queue);
                blk_mq_free_tag_set(&pf->tag_set);
                put_disk(pf->disk);
-               pi_release(pf->pi);
+
+               if (pf->present)
+                       pi_release(pf->pi);
        }
 }
 
index 4ba967d65cf963c6f2a2084a62f2dbad1935c3bf..2210c1b9491ba2e9f690dd4a26b209b64f4ad925 100644 (file)
@@ -833,7 +833,7 @@ static int parse_rbd_opts_token(char *c, void *private)
                pctx->opts->queue_depth = intval;
                break;
        case Opt_alloc_size:
-               if (intval < 1) {
+               if (intval < SECTOR_SIZE) {
                        pr_err("alloc_size out of range\n");
                        return -EINVAL;
                }
@@ -924,23 +924,6 @@ static void rbd_put_client(struct rbd_client *rbdc)
                kref_put(&rbdc->kref, rbd_client_release);
 }
 
-static int wait_for_latest_osdmap(struct ceph_client *client)
-{
-       u64 newest_epoch;
-       int ret;
-
-       ret = ceph_monc_get_version(&client->monc, "osdmap", &newest_epoch);
-       if (ret)
-               return ret;
-
-       if (client->osdc.osdmap->epoch >= newest_epoch)
-               return 0;
-