diff options
Diffstat (limited to 'arch')
58 files changed, 359 insertions, 263 deletions
| diff --git a/arch/alpha/include/asm/termios.h b/arch/alpha/include/asm/termios.h index 6a8c53dec57e..b7c77bb1bfd2 100644 --- a/arch/alpha/include/asm/termios.h +++ b/arch/alpha/include/asm/termios.h @@ -73,9 +73,15 @@  })  #define user_termios_to_kernel_termios(k, u) \ -	copy_from_user(k, u, sizeof(struct termios)) +	copy_from_user(k, u, sizeof(struct termios2))  #define kernel_termios_to_user_termios(u, k) \ +	copy_to_user(u, k, sizeof(struct termios2)) + +#define user_termios_to_kernel_termios_1(k, u) \ +	copy_from_user(k, u, sizeof(struct termios)) + +#define kernel_termios_to_user_termios_1(u, k) \  	copy_to_user(u, k, sizeof(struct termios))  #endif	/* _ALPHA_TERMIOS_H */ diff --git a/arch/alpha/include/uapi/asm/ioctls.h b/arch/alpha/include/uapi/asm/ioctls.h index 1e9121c9b3c7..971311605288 100644 --- a/arch/alpha/include/uapi/asm/ioctls.h +++ b/arch/alpha/include/uapi/asm/ioctls.h @@ -32,6 +32,11 @@  #define TCXONC		_IO('t', 30)  #define TCFLSH		_IO('t', 31) +#define TCGETS2		_IOR('T', 42, struct termios2) +#define TCSETS2		_IOW('T', 43, struct termios2) +#define TCSETSW2	_IOW('T', 44, struct termios2) +#define TCSETSF2	_IOW('T', 45, struct termios2) +  #define TIOCSWINSZ	_IOW('t', 103, struct winsize)  #define TIOCGWINSZ	_IOR('t', 104, struct winsize)  #define	TIOCSTART	_IO('t', 110)		/* start output, like ^Q */ diff --git a/arch/alpha/include/uapi/asm/termbits.h b/arch/alpha/include/uapi/asm/termbits.h index de6c8360fbe3..4575ba34a0ea 100644 --- a/arch/alpha/include/uapi/asm/termbits.h +++ b/arch/alpha/include/uapi/asm/termbits.h @@ -26,6 +26,19 @@ struct termios {  	speed_t c_ospeed;		/* output speed */  }; +/* Alpha has identical termios and termios2 */ + +struct termios2 { +	tcflag_t c_iflag;		/* input mode flags */ +	tcflag_t c_oflag;		/* output mode flags */ +	tcflag_t c_cflag;		/* control mode flags */ +	tcflag_t c_lflag;		/* local mode flags */ +	cc_t c_cc[NCCS];		/* control characters */ +	cc_t c_line;			/* line discipline (== c_cc[19]) */ +	speed_t c_ispeed;		/* input speed */ +	speed_t c_ospeed;		/* output speed */ +}; +  /* Alpha has matching termios and ktermios */  struct ktermios { @@ -152,6 +165,7 @@ struct ktermios {  #define B3000000  00034  #define B3500000  00035  #define B4000000  00036 +#define BOTHER    00037  #define CSIZE	00001400  #define   CS5	00000000 @@ -169,6 +183,9 @@ struct ktermios {  #define CMSPAR	  010000000000		/* mark or space (stick) parity */  #define CRTSCTS	  020000000000		/* flow control */ +#define CIBAUD	07600000 +#define IBSHIFT	16 +  /* c_lflag bits */  #define ISIG	0x00000080  #define ICANON	0x00000100 diff --git a/arch/arm/boot/dts/imx53-ppd.dts b/arch/arm/boot/dts/imx53-ppd.dts index b560ff88459b..5ff9a179c83c 100644 --- a/arch/arm/boot/dts/imx53-ppd.dts +++ b/arch/arm/boot/dts/imx53-ppd.dts @@ -55,7 +55,7 @@  	};  	chosen { -		stdout-path = "&uart1:115200n8"; +		stdout-path = "serial0:115200n8";  	};  	memory@70000000 { diff --git a/arch/arm/boot/dts/imx6sll.dtsi b/arch/arm/boot/dts/imx6sll.dtsi index ed9a980bce85..beefa1b2049d 100644 --- a/arch/arm/boot/dts/imx6sll.dtsi +++ b/arch/arm/boot/dts/imx6sll.dtsi @@ -740,7 +740,7 @@  			i2c1: i2c@21a0000 {  				#address-cells = <1>;  				#size-cells = <0>; -				compatible = "fs,imx6sll-i2c", "fsl,imx21-i2c"; +				compatible = "fsl,imx6sll-i2c", "fsl,imx21-i2c";  				reg = <0x021a0000 0x4000>;  				interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;  				clocks = <&clks IMX6SLL_CLK_I2C1>; diff --git a/arch/arm/boot/dts/imx6sx-sdb.dtsi b/arch/arm/boot/dts/imx6sx-sdb.dtsi index 53b3408b5fab..7d7d679945d2 100644 --- a/arch/arm/boot/dts/imx6sx-sdb.dtsi +++ b/arch/arm/boot/dts/imx6sx-sdb.dtsi @@ -117,7 +117,9 @@  		regulator-name = "enet_3v3";  		regulator-min-microvolt = <3300000>;  		regulator-max-microvolt = <3300000>; -		gpios = <&gpio2 6 GPIO_ACTIVE_LOW>; +		gpio = <&gpio2 6 GPIO_ACTIVE_LOW>; +		regulator-boot-on; +		regulator-always-on;  	};  	reg_pcie_gpio: regulator-pcie-gpio { @@ -180,6 +182,7 @@  	phy-supply = <®_enet_3v3>;  	phy-mode = "rgmii";  	phy-handle = <ðphy1>; +	phy-reset-gpios = <&gpio2 7 GPIO_ACTIVE_LOW>;  	status = "okay";  	mdio { @@ -373,6 +376,8 @@  				MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3	0x3081  				MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN	0x3081  				MX6SX_PAD_ENET2_RX_CLK__ENET2_REF_CLK_25M	0x91 +				/* phy reset */ +				MX6SX_PAD_ENET2_CRS__GPIO2_IO_7		0x10b0  			>;  		}; diff --git a/arch/arm/boot/dts/vf610m4-colibri.dts b/arch/arm/boot/dts/vf610m4-colibri.dts index 41ec66a96990..ca6249558760 100644 --- a/arch/arm/boot/dts/vf610m4-colibri.dts +++ b/arch/arm/boot/dts/vf610m4-colibri.dts @@ -50,8 +50,8 @@  	compatible = "fsl,vf610m4";  	chosen { -		bootargs = "console=ttyLP2,115200 clk_ignore_unused init=/linuxrc rw"; -		stdout-path = "&uart2"; +		bootargs = "clk_ignore_unused init=/linuxrc rw"; +		stdout-path = "serial2:115200";  	};  	memory@8c000000 { diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index 1c7616815a86..63af6234c1b6 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig @@ -1,7 +1,6 @@  CONFIG_SYSVIPC=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y -CONFIG_PREEMPT=y  CONFIG_CGROUPS=y  CONFIG_BLK_DEV_INITRD=y  CONFIG_EMBEDDED=y diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h index 92fd2c8a9af0..12659ce5c1f3 100644 --- a/arch/arm/include/asm/pgtable-2level.h +++ b/arch/arm/include/asm/pgtable-2level.h @@ -10,7 +10,7 @@  #ifndef _ASM_PGTABLE_2LEVEL_H  #define _ASM_PGTABLE_2LEVEL_H -#define __PAGETABLE_PMD_FOLDED +#define __PAGETABLE_PMD_FOLDED 1  /*   * Hardware-wise, we have a two level page table structure, where the first diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 6fe52819e014..339eb17c9808 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S @@ -112,7 +112,7 @@ ENTRY(cpu_v7_hvc_switch_mm)  	hvc	#0  	ldmfd	sp!, {r0 - r3}  	b	cpu_v7_switch_mm -ENDPROC(cpu_v7_smc_switch_mm) +ENDPROC(cpu_v7_hvc_switch_mm)  #endif  ENTRY(cpu_v7_iciallu_switch_mm)  	mov	r3, #0 diff --git a/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi b/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi index 8253a1a9e985..fef7351e9f67 100644 --- a/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi +++ b/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi @@ -139,6 +139,7 @@  			clock-names = "stmmaceth";  			tx-fifo-depth = <16384>;  			rx-fifo-depth = <16384>; +			snps,multicast-filter-bins = <256>;  			status = "disabled";  		}; @@ -154,6 +155,7 @@  			clock-names = "stmmaceth";  			tx-fifo-depth = <16384>;  			rx-fifo-depth = <16384>; +			snps,multicast-filter-bins = <256>;  			status = "disabled";  		}; @@ -169,6 +171,7 @@  			clock-names = "stmmaceth";  			tx-fifo-depth = <16384>;  			rx-fifo-depth = <16384>; +			snps,multicast-filter-bins = <256>;  			status = "disabled";  		}; diff --git a/arch/arm64/boot/dts/renesas/r8a7795.dtsi b/arch/arm64/boot/dts/renesas/r8a7795.dtsi index b5f2273caca4..a79c8d369e0b 100644 --- a/arch/arm64/boot/dts/renesas/r8a7795.dtsi +++ b/arch/arm64/boot/dts/renesas/r8a7795.dtsi @@ -652,7 +652,7 @@  			clock-names = "fck", "brg_int", "scif_clk";  			dmas = <&dmac1 0x35>, <&dmac1 0x34>,  			       <&dmac2 0x35>, <&dmac2 0x34>; -			dma-names = "tx", "rx"; +			dma-names = "tx", "rx", "tx", "rx";  			power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;  			resets = <&cpg 518>;  			status = "disabled"; diff --git a/arch/arm64/boot/dts/renesas/r8a77980-condor.dts b/arch/arm64/boot/dts/renesas/r8a77980-condor.dts index fe2e2c051cc9..5a7012be0d6a 100644 --- a/arch/arm64/boot/dts/renesas/r8a77980-condor.dts +++ b/arch/arm64/boot/dts/renesas/r8a77980-condor.dts @@ -15,7 +15,7 @@  	aliases {  		serial0 = &scif0; -		ethernet0 = &avb; +		ethernet0 = &gether;  	};  	chosen { @@ -97,23 +97,6 @@  	};  }; -&avb { -	pinctrl-0 = <&avb_pins>; -	pinctrl-names = "default"; - -	phy-mode = "rgmii-id"; -	phy-handle = <&phy0>; -	renesas,no-ether-link; -	status = "okay"; - -	phy0: ethernet-phy@0 { -		rxc-skew-ps = <1500>; -		reg = <0>; -		interrupt-parent = <&gpio1>; -		interrupts = <17 IRQ_TYPE_LEVEL_LOW>; -	}; -}; -  &canfd {  	pinctrl-0 = <&canfd0_pins>;  	pinctrl-names = "default"; @@ -139,6 +122,23 @@  	clock-frequency = <32768>;  }; +&gether { +	pinctrl-0 = <&gether_pins>; +	pinctrl-names = "default"; + +	phy-mode = "rgmii-id"; +	phy-handle = <&phy0>; +	renesas,no-ether-link; +	status = "okay"; + +	phy0: ethernet-phy@0 { +		rxc-skew-ps = <1500>; +		reg = <0>; +		interrupt-parent = <&gpio4>; +		interrupts = <23 IRQ_TYPE_LEVEL_LOW>; +	}; +}; +  &i2c0 {  	pinctrl-0 = <&i2c0_pins>;  	pinctrl-names = "default"; @@ -236,16 +236,17 @@  };  &pfc { -	avb_pins: avb { -		groups = "avb_mdio", "avb_rgmii"; -		function = "avb"; -	}; -  	canfd0_pins: canfd0 {  		groups = "canfd0_data_a";  		function = "canfd0";  	}; +	gether_pins: gether { +		groups = "gether_mdio_a", "gether_rgmii", +			 "gether_txcrefclk", "gether_txcrefclk_mega"; +		function = "gether"; +	}; +  	i2c0_pins: i2c0 {  		groups = "i2c0";  		function = "i2c0"; diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 3e2091708b8e..6b0d4dff5012 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -24,6 +24,14 @@  #define KERNEL_DS	UL(-1)  #define USER_DS		(TASK_SIZE_64 - 1) +/* + * On arm64 systems, unaligned accesses by the CPU are cheap, and so there is + * no point in shifting all network buffers by 2 bytes just to make some IP + * header fields appear aligned in memory, potentially sacrificing some DMA + * performance on some platforms. + */ +#define NET_IP_ALIGN	0 +  #ifndef __ASSEMBLY__  #ifdef __KERNEL__ diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 9d9582cac6c4..9b432d9fcada 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -483,8 +483,6 @@ void __init arm64_memblock_init(void)  	high_memory = __va(memblock_end_of_DRAM() - 1) + 1;  	dma_contiguous_reserve(arm64_dma_phys_limit); - -	memblock_allow_resize();  }  void __init bootmem_init(void) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 394b8d554def..d1d6601b385d 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -659,6 +659,8 @@ void __init paging_init(void)  	memblock_free(__pa_symbol(init_pg_dir),  		      __pa_symbol(init_pg_end) - __pa_symbol(init_pg_dir)); + +	memblock_allow_resize();  }  /* diff --git a/arch/m68k/include/asm/pgtable_mm.h b/arch/m68k/include/asm/pgtable_mm.h index 6181e4134483..fe3ddd73a0cc 100644 --- a/arch/m68k/include/asm/pgtable_mm.h +++ b/arch/m68k/include/asm/pgtable_mm.h @@ -55,12 +55,12 @@   */  #ifdef CONFIG_SUN3  #define PTRS_PER_PTE   16 -#define __PAGETABLE_PMD_FOLDED +#define __PAGETABLE_PMD_FOLDED 1  #define PTRS_PER_PMD   1  #define PTRS_PER_PGD   2048  #elif defined(CONFIG_COLDFIRE)  #define PTRS_PER_PTE	512 -#define __PAGETABLE_PMD_FOLDED +#define __PAGETABLE_PMD_FOLDED 1  #define PTRS_PER_PMD	1  #define PTRS_PER_PGD	1024  #else diff --git a/arch/microblaze/include/asm/pgtable.h b/arch/microblaze/include/asm/pgtable.h index f64ebb9c9a41..e14b6621c933 100644 --- a/arch/microblaze/include/asm/pgtable.h +++ b/arch/microblaze/include/asm/pgtable.h @@ -63,7 +63,7 @@ extern int mem_init_done;  #include <asm-generic/4level-fixup.h> -#define __PAGETABLE_PMD_FOLDED +#define __PAGETABLE_PMD_FOLDED 1  #ifdef __KERNEL__  #ifndef __ASSEMBLY__ diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper.c b/arch/mips/cavium-octeon/executive/cvmx-helper.c index 75108ec669eb..6c79e8a16a26 100644 --- a/arch/mips/cavium-octeon/executive/cvmx-helper.c +++ b/arch/mips/cavium-octeon/executive/cvmx-helper.c @@ -67,7 +67,7 @@ void (*cvmx_override_pko_queue_priority) (int pko_port,  void (*cvmx_override_ipd_port_setup) (int ipd_port);  /* Port count per interface */ -static int interface_port_count[5]; +static int interface_port_count[9];  /**   * Return the number of interfaces the chip has. Each interface diff --git a/arch/mips/mm/dma-noncoherent.c b/arch/mips/mm/dma-noncoherent.c index e6c9485cadcf..cb38461391cb 100644 --- a/arch/mips/mm/dma-noncoherent.c +++ b/arch/mips/mm/dma-noncoherent.c @@ -50,7 +50,7 @@ void *arch_dma_alloc(struct device *dev, size_t size,  	void *ret;  	ret = dma_direct_alloc_pages(dev, size, dma_handle, gfp, attrs); -	if (!ret && !(attrs & DMA_ATTR_NON_CONSISTENT)) { +	if (ret && !(attrs & DMA_ATTR_NON_CONSISTENT)) {  		dma_cache_wback_inv((unsigned long) ret, size);  		ret = (void *)UNCAC_ADDR(ret);  	} diff --git a/arch/nds32/include/asm/pgtable.h b/arch/nds32/include/asm/pgtable.h index d3e19a55cf53..9f52db930c00 100644 --- a/arch/nds32/include/asm/pgtable.h +++ b/arch/nds32/include/asm/pgtable.h @@ -4,7 +4,7 @@  #ifndef _ASMNDS32_PGTABLE_H  #define _ASMNDS32_PGTABLE_H -#define __PAGETABLE_PMD_FOLDED +#define __PAGETABLE_PMD_FOLDED 1  #include <asm-generic/4level-fixup.h>  #include <asm-generic/sizes.h> diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h index b941ac7d4e70..c7bb74e22436 100644 --- a/arch/parisc/include/asm/pgtable.h +++ b/arch/parisc/include/asm/pgtable.h @@ -111,7 +111,7 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)  #if CONFIG_PGTABLE_LEVELS == 3  #define BITS_PER_PMD	(PAGE_SHIFT + PMD_ORDER - BITS_PER_PMD_ENTRY)  #else -#define __PAGETABLE_PMD_FOLDED +#define __PAGETABLE_PMD_FOLDED 1  #define BITS_PER_PMD	0  #endif  #define PTRS_PER_PMD    (1UL << BITS_PER_PMD) diff --git a/arch/s390/Makefile b/arch/s390/Makefile index 0b33577932c3..e21053e5e0da 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile @@ -27,7 +27,7 @@ KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-option,-ffreestanding)  KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),-g)  KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))  UTS_MACHINE	:= s390x -STACK_SIZE	:= $(if $(CONFIG_KASAN),32768,16384) +STACK_SIZE	:= $(if $(CONFIG_KASAN),65536,16384)  CHECKFLAGS	+= -D__s390__ -D__s390x__  export LD_BFD diff --git a/arch/s390/boot/compressed/Makefile b/arch/s390/boot/compressed/Makefile index 593039620487..b1bdd15e3429 100644 --- a/arch/s390/boot/compressed/Makefile +++ b/arch/s390/boot/compressed/Makefile @@ -22,10 +22,10 @@ OBJCOPYFLAGS :=  OBJECTS := $(addprefix $(obj)/,$(obj-y))  LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T -$(obj)/vmlinux: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS) +$(obj)/vmlinux: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS) FORCE  	$(call if_changed,ld) -OBJCOPYFLAGS_info.bin := -O binary --only-section=.vmlinux.info +OBJCOPYFLAGS_info.bin := -O binary --only-section=.vmlinux.info --set-section-flags .vmlinux.info=load  $(obj)/info.bin: vmlinux FORCE  	$(call if_changed,objcopy) @@ -46,17 +46,17 @@ suffix-$(CONFIG_KERNEL_LZMA)  := .lzma  suffix-$(CONFIG_KERNEL_LZO)  := .lzo  suffix-$(CONFIG_KERNEL_XZ)  := .xz -$(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) +$(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) FORCE  	$(call if_changed,gzip) -$(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) +$(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE  	$(call if_changed,bzip2) -$(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) +$(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE  	$(call if_changed,lz4) -$(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) +$(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE  	$(call if_changed,lzma) -$(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) +$(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE  	$(call if_changed,lzo) -$(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) +$(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE  	$(call if_changed,xzkern)  OBJCOPYFLAGS_piggy.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section .data=.vmlinux.bin.compressed diff --git a/arch/s390/configs/debug_defconfig b/arch/s390/configs/debug_defconfig index 259d1698ac50..c69cb04b7a59 100644 --- a/arch/s390/configs/debug_defconfig +++ b/arch/s390/configs/debug_defconfig @@ -64,6 +64,8 @@ CONFIG_NUMA=y  CONFIG_PREEMPT=y  CONFIG_HZ_100=y  CONFIG_KEXEC_FILE=y +CONFIG_EXPOLINE=y +CONFIG_EXPOLINE_AUTO=y  CONFIG_MEMORY_HOTPLUG=y  CONFIG_MEMORY_HOTREMOVE=y  CONFIG_KSM=y @@ -84,9 +86,11 @@ CONFIG_PCI_DEBUG=y  CONFIG_HOTPLUG_PCI=y  CONFIG_HOTPLUG_PCI_S390=y  CONFIG_CHSC_SCH=y +CONFIG_VFIO_AP=m  CONFIG_CRASH_DUMP=y  CONFIG_BINFMT_MISC=m  CONFIG_HIBERNATION=y +CONFIG_PM_DEBUG=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_PACKET_DIAG=m @@ -161,8 +165,6 @@ CONFIG_NF_CONNTRACK_TFTP=m  CONFIG_NF_CT_NETLINK=m  CONFIG_NF_CT_NETLINK_TIMEOUT=m  CONFIG_NF_TABLES=m -CONFIG_NFT_EXTHDR=m -CONFIG_NFT_META=m  CONFIG_NFT_CT=m  CONFIG_NFT_COUNTER=m  CONFIG_NFT_LOG=m @@ -365,6 +367,8 @@ CONFIG_NET_ACT_SKBEDIT=m  CONFIG_NET_ACT_CSUM=m  CONFIG_DNS_RESOLVER=y  CONFIG_OPENVSWITCH=m +CONFIG_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS=m  CONFIG_NETLINK_DIAG=m  CONFIG_CGROUP_NET_PRIO=y  CONFIG_BPF_JIT=y @@ -461,6 +465,7 @@ CONFIG_PPTP=m  CONFIG_PPPOL2TP=m  CONFIG_PPP_ASYNC=m  CONFIG_PPP_SYNC_TTY=m +CONFIG_ISM=m  CONFIG_INPUT_EVDEV=y  # CONFIG_INPUT_KEYBOARD is not set  # CONFIG_INPUT_MOUSE is not set @@ -486,9 +491,12 @@ CONFIG_MLX4_INFINIBAND=m  CONFIG_MLX5_INFINIBAND=m  CONFIG_VFIO=m  CONFIG_VFIO_PCI=m +CONFIG_VFIO_MDEV=m +CONFIG_VFIO_MDEV_DEVICE=m  CONFIG_VIRTIO_PCI=m  CONFIG_VIRTIO_BALLOON=m  CONFIG_VIRTIO_INPUT=y +CONFIG_S390_AP_IOMMU=y  CONFIG_EXT4_FS=y  CONFIG_EXT4_FS_POSIX_ACL=y  CONFIG_EXT4_FS_SECURITY=y @@ -615,7 +623,6 @@ CONFIG_DEBUG_CREDENTIALS=y  CONFIG_RCU_TORTURE_TEST=m  CONFIG_RCU_CPU_STALL_TIMEOUT=300  CONFIG_NOTIFIER_ERROR_INJECTION=m -CONFIG_PM_NOTIFIER_ERROR_INJECT=m  CONFIG_NETDEV_NOTIFIER_ERROR_INJECT=m  CONFIG_FAULT_INJECTION=y  CONFIG_FAILSLAB=y @@ -727,3 +734,4 @@ CONFIG_APPLDATA_BASE=y  CONFIG_KVM=m  CONFIG_KVM_S390_UCONTROL=y  CONFIG_VHOST_NET=m +CONFIG_VHOST_VSOCK=m diff --git a/arch/s390/configs/performance_defconfig b/arch/s390/configs/performance_defconfig index 37fd60c20e22..32f539dc9c19 100644 --- a/arch/s390/configs/performance_defconfig +++ b/arch/s390/configs/performance_defconfig @@ -65,6 +65,8 @@ CONFIG_NR_CPUS=512  CONFIG_NUMA=y  CONFIG_HZ_100=y  CONFIG_KEXEC_FILE=y +CONFIG_EXPOLINE=y +CONFIG_EXPOLINE_AUTO=y  CONFIG_MEMORY_HOTPLUG=y  CONFIG_MEMORY_HOTREMOVE=y  CONFIG_KSM=y @@ -82,9 +84,11 @@ CONFIG_PCI=y  CONFIG_HOTPLUG_PCI=y  CONFIG_HOTPLUG_PCI_S390=y  CONFIG_CHSC_SCH=y +CONFIG_VFIO_AP=m  CONFIG_CRASH_DUMP=y  CONFIG_BINFMT_MISC=m  CONFIG_HIBERNATION=y +CONFIG_PM_DEBUG=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_PACKET_DIAG=m @@ -159,8 +163,6 @@ CONFIG_NF_CONNTRACK_TFTP=m  CONFIG_NF_CT_NETLINK=m  CONFIG_NF_CT_NETLINK_TIMEOUT=m  CONFIG_NF_TABLES=m -CONFIG_NFT_EXTHDR=m -CONFIG_NFT_META=m  CONFIG_NFT_CT=m  CONFIG_NFT_COUNTER=m  CONFIG_NFT_LOG=m @@ -362,6 +364,8 @@ CONFIG_NET_ACT_SKBEDIT=m  CONFIG_NET_ACT_CSUM=m  CONFIG_DNS_RESOLVER=y  CONFIG_OPENVSWITCH=m +CONFIG_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS=m  CONFIG_NETLINK_DIAG=m  CONFIG_CGROUP_NET_PRIO=y  CONFIG_BPF_JIT=y @@ -458,6 +462,7 @@ CONFIG_PPTP=m  CONFIG_PPPOL2TP=m  CONFIG_PPP_ASYNC=m  CONFIG_PPP_SYNC_TTY=m +CONFIG_ISM=m  CONFIG_INPUT_EVDEV=y  # CONFIG_INPUT_KEYBOARD is not set  # CONFIG_INPUT_MOUSE is not set @@ -483,9 +488,12 @@ CONFIG_MLX4_INFINIBAND=m  CONFIG_MLX5_INFINIBAND=m  CONFIG_VFIO=m  CONFIG_VFIO_PCI=m +CONFIG_VFIO_MDEV=m +CONFIG_VFIO_MDEV_DEVICE=m  CONFIG_VIRTIO_PCI=m  CONFIG_VIRTIO_BALLOON=m  CONFIG_VIRTIO_INPUT=y +CONFIG_S390_AP_IOMMU=y  CONFIG_EXT4_FS=y  CONFIG_EXT4_FS_POSIX_ACL=y  CONFIG_EXT4_FS_SECURITY=y @@ -666,3 +674,4 @@ CONFIG_APPLDATA_BASE=y  CONFIG_KVM=m  CONFIG_KVM_S390_UCONTROL=y  CONFIG_VHOST_NET=m +CONFIG_VHOST_VSOCK=m diff --git a/arch/s390/defconfig b/arch/s390/defconfig index 7cb6a52f727d..4d58a92b5d97 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig @@ -26,14 +26,23 @@ CONFIG_CGROUP_CPUACCT=y  CONFIG_CGROUP_PERF=y  CONFIG_NAMESPACES=y  CONFIG_USER_NS=y +CONFIG_CHECKPOINT_RESTORE=y  CONFIG_BLK_DEV_INITRD=y  CONFIG_EXPERT=y  # CONFIG_SYSFS_SYSCALL is not set -CONFIG_CHECKPOINT_RESTORE=y  CONFIG_BPF_SYSCALL=y  CONFIG_USERFAULTFD=y  # CONFIG_COMPAT_BRK is not set  CONFIG_PROFILING=y +CONFIG_LIVEPATCH=y +CONFIG_NR_CPUS=256 +CONFIG_NUMA=y +CONFIG_HZ_100=y +CONFIG_KEXEC_FILE=y +CONFIG_CRASH_DUMP=y +CONFIG_HIBERNATION=y +CONFIG_PM_DEBUG=y +CONFIG_CMM=m  CONFIG_OPROFILE=y  CONFIG_KPROBES=y  CONFIG_JUMP_LABEL=y @@ -44,11 +53,7 @@ CONFIG_BLK_DEV_INTEGRITY=y  CONFIG_PARTITION_ADVANCED=y  CONFIG_IBM_PARTITION=y  CONFIG_DEFAULT_DEADLINE=y -CONFIG_LIVEPATCH=y -CONFIG_NR_CPUS=256 -CONFIG_NUMA=y -CONFIG_HZ_100=y -CONFIG_KEXEC_FILE=y +CONFIG_BINFMT_MISC=m  CONFIG_MEMORY_HOTPLUG=y  CONFIG_MEMORY_HOTREMOVE=y  CONFIG_KSM=y @@ -60,9 +65,6 @@ CONFIG_ZBUD=m  CONFIG_ZSMALLOC=m  CONFIG_ZSMALLOC_STAT=y  CONFIG_IDLE_PAGE_TRACKING=y -CONFIG_CRASH_DUMP=y -CONFIG_BINFMT_MISC=m -CONFIG_HIBERNATION=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_UNIX=y @@ -98,6 +100,7 @@ CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_VIRTIO_BLK=y  CONFIG_SCSI=y +# CONFIG_SCSI_MQ_DEFAULT is not set  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_ST=y  CONFIG_BLK_DEV_SR=y @@ -131,6 +134,7 @@ CONFIG_EQUALIZER=m  CONFIG_TUN=m  CONFIG_VIRTIO_NET=y  # CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_NET_VENDOR_AURORA is not set  # CONFIG_NET_VENDOR_CORTINA is not set  # CONFIG_NET_VENDOR_SOLARFLARE is not set  # CONFIG_NET_VENDOR_SOCIONEXT is not set @@ -157,33 +161,6 @@ CONFIG_TMPFS=y  CONFIG_TMPFS_POSIX_ACL=y  CONFIG_HUGETLBFS=y  # CONFIG_NETWORK_FILESYSTEMS is not set -CONFIG_DEBUG_INFO=y -CONFIG_DEBUG_INFO_DWARF4=y -CONFIG_GDB_SCRIPTS=y -CONFIG_UNUSED_SYMBOLS=y -CONFIG_DEBUG_SECTION_MISMATCH=y -CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y -CONFIG_MAGIC_SYSRQ=y -CONFIG_DEBUG_PAGEALLOC=y -CONFIG_DETECT_HUNG_TASK=y -CONFIG_PANIC_ON_OOPS=y -CONFIG_PROVE_LOCKING=y -CONFIG_LOCK_STAT=y -CONFIG_DEBUG_LOCKDEP=y -CONFIG_DEBUG_ATOMIC_SLEEP=y -CONFIG_DEBUG_LIST=y -CONFIG_DEBUG_SG=y -CONFIG_DEBUG_NOTIFIERS=y -CONFIG_RCU_CPU_STALL_TIMEOUT=60 -CONFIG_LATENCYTOP=y -CONFIG_SCHED_TRACER=y -CONFIG_FTRACE_SYSCALLS=y -CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y -CONFIG_STACK_TRACER=y -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_FUNCTION_PROFILER=y -# CONFIG_RUNTIME_TESTING_MENU is not set -CONFIG_S390_PTDUMP=y  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_AUTHENC=m  CONFIG_CRYPTO_TEST=m @@ -193,6 +170,7 @@ CONFIG_CRYPTO_CBC=y  CONFIG_CRYPTO_CFB=m  CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m +CONFIG_CRYPTO_OFB=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m  CONFIG_CRYPTO_CMAC=m @@ -231,7 +209,6 @@ CONFIG_CRYPTO_USER_API_HASH=m  CONFIG_CRYPTO_USER_API_SKCIPHER=m  CONFIG_CRYPTO_USER_API_RNG=m  CONFIG_ZCRYPT=m -CONFIG_ZCRYPT_MULTIDEVNODES=y  CONFIG_PKEY=m  CONFIG_CRYPTO_PAES_S390=m  CONFIG_CRYPTO_SHA1_S390=m @@ -247,4 +224,30 @@ CONFIG_CRC7=m  # CONFIG_XZ_DEC_ARM is not set  # CONFIG_XZ_DEC_ARMTHUMB is not set  # CONFIG_XZ_DEC_SPARC is not set -CONFIG_CMM=m +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_INFO_DWARF4=y +CONFIG_GDB_SCRIPTS=y +CONFIG_UNUSED_SYMBOLS=y +CONFIG_DEBUG_SECTION_MISMATCH=y +CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_PAGEALLOC=y +CONFIG_DETECT_HUNG_TASK=y +CONFIG_PANIC_ON_OOPS=y +CONFIG_PROVE_LOCKING=y +CONFIG_LOCK_STAT=y +CONFIG_DEBUG_LOCKDEP=y +CONFIG_DEBUG_ATOMIC_SLEEP=y +CONFIG_DEBUG_LIST=y +CONFIG_DEBUG_SG=y +CONFIG_DEBUG_NOTIFIERS=y +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_LATENCYTOP=y +CONFIG_SCHED_TRACER=y +CONFIG_FTRACE_SYSCALLS=y +CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y +CONFIG_STACK_TRACER=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_FUNCTION_PROFILER=y +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_S390_PTDUMP=y diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h index dbd689d556ce..ccbb53e22024 100644 --- a/arch/s390/include/asm/mmu_context.h +++ b/arch/s390/include/asm/mmu_context.h @@ -46,8 +46,6 @@ static inline int init_new_context(struct task_struct *tsk,  		mm->context.asce_limit = STACK_TOP_MAX;  		mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |  				   _ASCE_USER_BITS | _ASCE_TYPE_REGION3; -		/* pgd_alloc() did not account this pud */ -		mm_inc_nr_puds(mm);  		break;  	case -PAGE_SIZE:  		/* forked 5-level task, set new asce with new_mm->pgd */ @@ -63,9 +61,6 @@ static inline int init_new_context(struct task_struct *tsk,  		/* forked 2-level compat task, set new asce with new mm->pgd */  		mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |  				   _ASCE_USER_BITS | _ASCE_TYPE_SEGMENT; -		/* pgd_alloc() did not account this pmd */ -		mm_inc_nr_pmds(mm); -		mm_inc_nr_puds(mm);  	}  	crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));  	return 0; diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h index f0f9bcf94c03..5ee733720a57 100644 --- a/arch/s390/include/asm/pgalloc.h +++ b/arch/s390/include/asm/pgalloc.h @@ -36,11 +36,11 @@ static inline void crst_table_init(unsigned long *crst, unsigned long entry)  static inline unsigned long pgd_entry_type(struct mm_struct *mm)  { -	if (mm->context.asce_limit <= _REGION3_SIZE) +	if (mm_pmd_folded(mm))  		return _SEGMENT_ENTRY_EMPTY; -	if (mm->context.asce_limit <= _REGION2_SIZE) +	if (mm_pud_folded(mm))  		return _REGION3_ENTRY_EMPTY; -	if (mm->context.asce_limit <= _REGION1_SIZE) +	if (mm_p4d_folded(mm))  		return _REGION2_ENTRY_EMPTY;  	return _REGION1_ENTRY_EMPTY;  } diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 411d435e7a7d..063732414dfb 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h @@ -493,6 +493,24 @@ static inline int is_module_addr(void *addr)  				   _REGION_ENTRY_PROTECT | \  				   _REGION_ENTRY_NOEXEC) +static inline bool mm_p4d_folded(struct mm_struct *mm) +{ +	return mm->context.asce_limit <= _REGION1_SIZE; +} +#define mm_p4d_folded(mm) mm_p4d_folded(mm) + +static inline bool mm_pud_folded(struct mm_struct *mm) +{ +	return mm->context.asce_limit <= _REGION2_SIZE; +} +#define mm_pud_folded(mm) mm_pud_folded(mm) + +static inline bool mm_pmd_folded(struct mm_struct *mm) +{ +	return mm->context.asce_limit <= _REGION3_SIZE; +} +#define mm_pmd_folded(mm) mm_pmd_folded(mm) +  static inline int mm_has_pgste(struct mm_struct *mm)  {  #ifdef CONFIG_PGSTE diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h index 302795c47c06..81038ab357ce 100644 --- a/arch/s390/include/asm/processor.h +++ b/arch/s390/include/asm/processor.h @@ -236,7 +236,7 @@ static inline unsigned long current_stack_pointer(void)  	return sp;  } -static __no_sanitize_address_or_inline unsigned short stap(void) +static __no_kasan_or_inline unsigned short stap(void)  {  	unsigned short cpu_address; @@ -330,7 +330,7 @@ static inline void __load_psw(psw_t psw)   * Set PSW mask to specified value, while leaving the   * PSW addr pointing to the next instruction.   */ -static __no_sanitize_address_or_inline void __load_psw_mask(unsigned long mask) +static __no_kasan_or_inline void __load_psw_mask(unsigned long mask)  {  	unsigned long addr;  	psw_t psw; diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h index 27248f42a03c..ce4e17c9aad6 100644 --- a/arch/s390/include/asm/thread_info.h +++ b/arch/s390/include/asm/thread_info.h @@ -14,7 +14,7 @@   * General size of kernel stacks   */  #ifdef CONFIG_KASAN -#define THREAD_SIZE_ORDER 3 +#define THREAD_SIZE_ORDER 4  #else  #define THREAD_SIZE_ORDER 2  #endif diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h index 457b7ba0fbb6..b31c779cf581 100644 --- a/arch/s390/include/asm/tlb.h +++ b/arch/s390/include/asm/tlb.h @@ -136,7 +136,7 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,  static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,  				unsigned long address)  { -	if (tlb->mm->context.asce_limit <= _REGION3_SIZE) +	if (mm_pmd_folded(tlb->mm))  		return;  	pgtable_pmd_page_dtor(virt_to_page(pmd));  	tlb_remove_table(tlb, pmd); @@ -152,7 +152,7 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,  static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,  				unsigned long address)  { -	if (tlb->mm->context.asce_limit <= _REGION1_SIZE) +	if (mm_p4d_folded(tlb->mm))  		return;  	tlb_remove_table(tlb, p4d);  } @@ -167,7 +167,7 @@ static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,  static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,  				unsigned long address)  { -	if (tlb->mm->context.asce_limit <= _REGION2_SIZE) +	if (mm_pud_folded(tlb->mm))  		return;  	tlb_remove_table(tlb, pud);  } diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 724fba4d09d2..39191a0feed1 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S @@ -236,10 +236,10 @@ ENTRY(__switch_to)  	stmg	%r6,%r15,__SF_GPRS(%r15)	# store gprs of prev task  	lghi	%r4,__TASK_stack  	lghi	%r1,__TASK_thread -	lg	%r5,0(%r4,%r3)			# start of kernel stack of next +	llill	%r5,STACK_INIT  	stg	%r15,__THREAD_ksp(%r1,%r2)	# store kernel stack of prev -	lgr	%r15,%r5 -	aghi	%r15,STACK_INIT			# end of kernel stack of next +	lg	%r15,0(%r4,%r3)			# start of kernel stack of next +	agr	%r15,%r5			# end of kernel stack of next  	stg	%r3,__LC_CURRENT		# store task struct of next  	stg	%r15,__LC_KERNEL_STACK		# store end of kernel stack  	lg	%r15,__THREAD_ksp(%r1,%r3)	# load kernel stack of next diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c index cc085e2d2ce9..74091fd3101e 100644 --- a/arch/s390/kernel/perf_cpum_cf.c +++ b/arch/s390/kernel/perf_cpum_cf.c @@ -373,7 +373,7 @@ static int __hw_perf_event_init(struct perf_event *event)  		return -ENOENT;  	if (ev > PERF_CPUM_CF_MAX_CTR) -		return -EINVAL; +		return -ENOENT;  	/* Obtain the counter set to which the specified counter belongs */  	set = get_counter_set(ev); diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c index 7bf604ff50a1..bfabeb1889cc 100644 --- a/arch/s390/kernel/perf_cpum_sf.c +++ b/arch/s390/kernel/perf_cpum_sf.c @@ -1842,10 +1842,30 @@ static void cpumsf_pmu_del(struct perf_event *event, int flags)  CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC, PERF_EVENT_CPUM_SF);  CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC_DIAG, PERF_EVENT_CPUM_SF_DIAG); -static struct attribute *cpumsf_pmu_events_attr[] = { -	CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC), -	NULL, -	NULL, +/* Attribute list for CPU_SF. + * + * The availablitiy depends on the CPU_MF sampling facility authorization + * for basic + diagnositic samples. This is determined at initialization + * time by the sampling facility device driver. + * If the authorization for basic samples is turned off, it should be + * also turned off for diagnostic sampling. + * + * During initialization of the device driver, check the authorization + * level for diagnostic sampling and installs the attribute + * file for diagnostic sampling if necessary. + * + * For now install a placeholder to reference all possible attributes: + * SF_CYCLES_BASIC and SF_CYCLES_BASIC_DIAG. + * Add another entry for the final NULL pointer. + */ +enum { +	SF_CYCLES_BASIC_ATTR_IDX = 0, +	SF_CYCLES_BASIC_DIAG_ATTR_IDX, +	SF_CYCLES_ATTR_MAX +}; + +static struct attribute *cpumsf_pmu_events_attr[SF_CYCLES_ATTR_MAX + 1] = { +	[SF_CYCLES_BASIC_ATTR_IDX] = CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC)  };  PMU_FORMAT_ATTR(event, "config:0-63"); @@ -2040,7 +2060,10 @@ static int __init init_cpum_sampling_pmu(void)  	if (si.ad) {  		sfb_set_limits(CPUM_SF_MIN_SDB, CPUM_SF_MAX_SDB); -		cpumsf_pmu_events_attr[1] = +		/* Sampling of diagnostic data authorized, +		 * install event into attribute list of PMU device. +		 */ +		cpumsf_pmu_events_attr[SF_CYCLES_BASIC_DIAG_ATTR_IDX] =  			CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC_DIAG);  	} diff --git a/arch/s390/kernel/vdso32/Makefile b/arch/s390/kernel/vdso32/Makefile index eb8aebea3ea7..e76309fbbcb3 100644 --- a/arch/s390/kernel/vdso32/Makefile +++ b/arch/s390/kernel/vdso32/Makefile @@ -37,7 +37,7 @@ KASAN_SANITIZE := n  $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so  # link rule for the .so file, .lds has to be first -$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) +$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) FORCE  	$(call if_changed,vdso32ld)  # strip rule for the .so file @@ -46,12 +46,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE  	$(call if_changed,objcopy)  # assembly rules for the .S files -$(obj-vdso32): %.o: %.S +$(obj-vdso32): %.o: %.S FORCE  	$(call if_changed_dep,vdso32as)  # actual build commands  quiet_cmd_vdso32ld = VDSO32L $@ -      cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $^ -o $@ +      cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@  quiet_cmd_vdso32as = VDSO32A $@        cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $< diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile index a22b2cf86eec..f849ac61c5da 100644 --- a/arch/s390/kernel/vdso64/Makefile +++ b/arch/s390/kernel/vdso64/Makefile @@ -37,7 +37,7 @@ KASAN_SANITIZE := n  $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so  # link rule for the .so file, .lds has to be first -$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) +$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE  	$(call if_changed,vdso64ld)  # strip rule for the .so file @@ -46,12 +46,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE  	$(call if_changed,objcopy)  # assembly rules for the .S files -$(obj-vdso64): %.o: %.S +$(obj-vdso64): %.o: %.S FORCE  	$(call if_changed_dep,vdso64as)  # actual build commands  quiet_cmd_vdso64ld = VDSO64L $@ -      cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@ +      cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@  quiet_cmd_vdso64as = VDSO64A $@        cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $< diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 21eb7407d51b..8429ab079715 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S @@ -154,14 +154,14 @@ SECTIONS  	 * uncompressed image info used by the decompressor  	 * it should match struct vmlinux_info  	 */ -	.vmlinux.info 0 : { +	.vmlinux.info 0 (INFO) : {  		QUAD(_stext)					/* default_lma */  		QUAD(startup_continue)				/* entry */  		QUAD(__bss_start - _stext)			/* image_size */  		QUAD(__bss_stop - __bss_start)			/* bss_size */  		QUAD(__boot_data_start)				/* bootdata_off */  		QUAD(__boot_data_end - __boot_data_start)	/* bootdata_size */ -	} +	} :NONE  	/* Debugging sections.	*/  	STABS_DEBUG diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c index 76d89ee8b428..814f26520aa2 100644 --- a/arch/s390/mm/pgalloc.c +++ b/arch/s390/mm/pgalloc.c @@ -101,6 +101,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)  			mm->context.asce_limit = _REGION1_SIZE;  			mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |  				_ASCE_USER_BITS | _ASCE_TYPE_REGION2; +			mm_inc_nr_puds(mm);  		} else {  			crst_table_init(table, _REGION1_ENTRY_EMPTY);  			pgd_populate(mm, (pgd_t *) table, (p4d_t *) pgd); diff --git a/arch/s390/numa/numa.c b/arch/s390/numa/numa.c index ae0d9e889534..d31bde0870d8 100644 --- a/arch/s390/numa/numa.c +++ b/arch/s390/numa/numa.c @@ -53,6 +53,7 @@ int __node_distance(int a, int b)  {  	return mode->distance ? mode->distance(a, b) : 0;  } +EXPORT_SYMBOL(__node_distance);  int numa_debug_enabled; diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index 74c002ddc0ce..28c40624bcb6 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c @@ -1305,6 +1305,7 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,  		io_req->fds[0] = dev->cow.fd;  	else  		io_req->fds[0] = dev->fd; +	io_req->error = 0;  	if (req_op(req) == REQ_OP_FLUSH) {  		io_req->op = UBD_FLUSH; @@ -1313,9 +1314,7 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,  		io_req->cow_offset = -1;  		io_req->offset = off;  		io_req->length = bvec->bv_len; -		io_req->error = 0;  		io_req->sector_mask = 0; -  		io_req->op = rq_data_dir(req) == READ ? UBD_READ : UBD_WRITE;  		io_req->offsets[0] = 0;  		io_req->offsets[1] = dev->cow.data_offset; @@ -1341,11 +1340,14 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,  static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,  				 const struct blk_mq_queue_data *bd)  { +	struct ubd *ubd_dev = hctx->queue->queuedata;  	struct request *req = bd->rq;  	int ret = 0;  	blk_mq_start_request(req); +	spin_lock_irq(&ubd_dev->lock); +  	if (req_op(req) == REQ_OP_FLUSH) {  		ret = ubd_queue_one_vec(hctx, req, 0, NULL);  	} else { @@ -1361,9 +1363,11 @@ static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,  		}  	}  out: -	if (ret < 0) { +	spin_unlock_irq(&ubd_dev->lock); + +	if (ret < 0)  		blk_mq_requeue_request(req, true); -	} +  	return BLK_STS_OK;  } diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ba7e3464ee92..9d734f3c8234 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -525,7 +525,6 @@ config X86_VSMP  	bool "ScaleMP vSMP"  	select HYPERVISOR_GUEST  	select PARAVIRT -	select PARAVIRT_XXL  	depends on X86_64 && PCI  	depends on X86_EXTENDED_PLATFORM  	depends on SMP diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 5b562e464009..88398fdf8129 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -213,8 +213,6 @@ ifdef CONFIG_X86_64  KBUILD_LDFLAGS += $(call ld-option, -z max-page-size=0x200000)  endif -# Speed up the build -KBUILD_CFLAGS += -pipe  # Workaround for a gcc prelease that unfortunately was shipped in a suse release  KBUILD_CFLAGS += -Wno-sign-compare  # @@ -239,7 +237,7 @@ archheaders:  archmacros:  	$(Q)$(MAKE) $(build)=arch/x86/kernel arch/x86/kernel/macros.s -ASM_MACRO_FLAGS = -Wa,arch/x86/kernel/macros.s -Wa,- +ASM_MACRO_FLAGS = -Wa,arch/x86/kernel/macros.s  export ASM_MACRO_FLAGS  KBUILD_CFLAGS += $(ASM_MACRO_FLAGS) diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h index 4da9b1c58d28..c1a812bd5a27 100644 --- a/arch/x86/include/asm/mce.h +++ b/arch/x86/include/asm/mce.h @@ -221,6 +221,8 @@ static inline void mce_hygon_feature_init(struct cpuinfo_x86 *c) { return mce_am  int mce_available(struct cpuinfo_x86 *c);  bool mce_is_memory_error(struct mce *m); +bool mce_is_correctable(struct mce *m); +int mce_usable_address(struct mce *m);  DECLARE_PER_CPU(unsigned, mce_exception_count);  DECLARE_PER_CPU(unsigned, mce_poll_count); diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index 0d6271cce198..1d0a7778e163 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -232,7 +232,7 @@ static inline u64 hv_do_fast_hypercall16(u16 code, u64 input1, u64 input2)  				      : "cc");  	}  #endif -		return hv_status; +	return hv_status;  }  /* diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h index cd0cf1c568b4..8f657286d599 100644 --- a/arch/x86/include/asm/page_64_types.h +++ b/arch/x86/include/asm/page_64_types.h @@ -33,12 +33,14 @@  /*   * Set __PAGE_OFFSET to the most negative possible address + - * PGDIR_SIZE*16 (pgd slot 272).  The gap is to allow a space for a - * hypervisor to fit.  Choosing 16 slots here is arbitrary, but it's - * what Xen requires. + * PGDIR_SIZE*17 (pgd slot 273). + * + * The gap is to allow a space for LDT remap for PTI (1 pgd slot) and space for + * a hypervisor (16 slots). Choosing 16 slots for a hypervisor is arbitrary, + * but it's what Xen requires.   */ -#define __PAGE_OFFSET_BASE_L5	_AC(0xff10000000000000, UL) -#define __PAGE_OFFSET_BASE_L4	_AC(0xffff880000000000, UL) +#define __PAGE_OFFSET_BASE_L5	_AC(0xff11000000000000, UL) +#define __PAGE_OFFSET_BASE_L4	_AC(0xffff888000000000, UL)  #ifdef CONFIG_DYNAMIC_MEMORY_LAYOUT  #define __PAGE_OFFSET           page_offset_base diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h index 04edd2d58211..84bd9bdc1987 100644 --- a/arch/x86/include/asm/pgtable_64_types.h +++ b/arch/x86/include/asm/pgtable_64_types.h @@ -111,9 +111,7 @@ extern unsigned int ptrs_per_p4d;   */  #define MAXMEM			(1UL << MAX_PHYSMEM_BITS) -#define LDT_PGD_ENTRY_L4	-3UL -#define LDT_PGD_ENTRY_L5	-112UL -#define LDT_PGD_ENTRY		(pgtable_l5_enabled() ? LDT_PGD_ENTRY_L5 : LDT_PGD_ENTRY_L4) +#define LDT_PGD_ENTRY		-240UL  #define LDT_BASE_ADDR		(LDT_PGD_ENTRY << PGDIR_SHIFT)  #define LDT_END_ADDR		(LDT_BASE_ADDR + PGDIR_SIZE) diff --git a/arch/x86/include/asm/qspinlock.h b/arch/x86/include/asm/qspinlock.h index 87623c6b13db..bd5ac6cc37db 100644 --- a/arch/x86/include/asm/qspinlock.h +++ b/arch/x86/include/asm/qspinlock.h @@ -13,12 +13,15 @@  #define queued_fetch_set_pending_acquire queued_fetch_set_pending_acquire  static __always_inline u32 queued_fetch_set_pending_acquire(struct qspinlock *lock)  { -	u32 val = 0; - -	if (GEN_BINARY_RMWcc(LOCK_PREFIX "btsl", lock->val.counter, c, -			     "I", _Q_PENDING_OFFSET)) -		val |= _Q_PENDING_VAL; +	u32 val; +	/* +	 * We can't use GEN_BINARY_RMWcc() inside an if() stmt because asm goto +	 * and CONFIG_PROFILE_ALL_BRANCHES=y results in a label inside a +	 * statement expression, which GCC doesn't like. +	 */ +	val = GEN_BINARY_RMWcc(LOCK_PREFIX "btsl", lock->val.counter, c, +			       "I", _Q_PENDING_OFFSET) * _Q_PENDING_VAL;  	val |= atomic_read(&lock->val) & ~_Q_PENDING_MASK;  	return val; diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index 123e669bf363..790ce08e41f2 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h @@ -9,7 +9,7 @@  #include <linux/mm.h>  #include <linux/device.h> -#include <linux/uaccess.h> +#include <asm/extable.h>  #include <asm/page.h>  #include <asm/pgtable.h> @@ -93,12 +93,39 @@ clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,   */  static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val)  { -	return __put_user(val, (unsigned long __user *)addr); +	int ret = 0; + +	asm volatile("1: mov %[val], %[ptr]\n" +		     "2:\n" +		     ".section .fixup, \"ax\"\n" +		     "3: sub $1, %[ret]\n" +		     "   jmp 2b\n" +		     ".previous\n" +		     _ASM_EXTABLE(1b, 3b) +		     : [ret] "+r" (ret), [ptr] "=m" (*addr) +		     : [val] "r" (val)); + +	return ret;  } -static inline int xen_safe_read_ulong(unsigned long *addr, unsigned long *val) +static inline int xen_safe_read_ulong(const unsigned long *addr, +				      unsigned long *val)  { -	return __get_user(*val, (unsigned long __user *)addr); +	int ret = 0; +	unsigned long rval = ~0ul; + +	asm volatile("1: mov %[ptr], %[rval]\n" +		     "2:\n" +		     ".section .fixup, \"ax\"\n" +		     "3: sub $1, %[ret]\n" +		     "   jmp 2b\n" +		     ".previous\n" +		     _ASM_EXTABLE(1b, 3b) +		     : [ret] "+r" (ret), [rval] "+r" (rval) +		     : [ptr] "m" (*addr)); +	*val = rval; + +	return ret;  }  #ifdef CONFIG_XEN_PV diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 8c66d2fc8f81..36d2696c9563 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c @@ -485,7 +485,7 @@ static void mce_report_event(struct pt_regs *regs)   * be somewhat complicated (e.g. segment offset would require an instruction   * parser). So only support physical addresses up to page granuality for now.   */ -static int mce_usable_address(struct mce *m) +int mce_usable_address(struct mce *m)  {  	if (!(m->status & MCI_STATUS_ADDRV))  		return 0; @@ -505,6 +505,7 @@ static int mce_usable_address(struct mce *m)  	return 1;  } +EXPORT_SYMBOL_GPL(mce_usable_address);  bool mce_is_memory_error(struct mce *m)  { @@ -534,7 +535,7 @@ bool mce_is_memory_error(struct mce *m)  }  EXPORT_SYMBOL_GPL(mce_is_memory_error); -static bool mce_is_correctable(struct mce *m) +bool mce_is_correctable(struct mce *m)  {  	if (m->cpuvendor == X86_VENDOR_AMD && m->status & MCI_STATUS_DEFERRED)  		return false; @@ -547,6 +548,7 @@ static bool mce_is_correctable(struct mce *m)  	return true;  } +EXPORT_SYMBOL_GPL(mce_is_correctable);  static bool cec_add_mce(struct mce *m)  { diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 1c72f3819eb1..e81a2db42df7 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -20,6 +20,7 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/kexec.h> +#include <linux/i8253.h>  #include <asm/processor.h>  #include <asm/hypervisor.h>  #include <asm/hyperv-tlfs.h> @@ -295,6 +296,16 @@ static void __init ms_hyperv_init_platform(void)  	if (efi_enabled(EFI_BOOT))  		x86_platform.get_nmi_reason = hv_get_nmi_reason; +	/* +	 * Hyper-V VMs have a PIT emulation quirk such that zeroing the +	 * counter register during PIT shutdown restarts the PIT. So it +	 * continues to interrupt @18.2 HZ. Setting i8253_clear_counter +	 * to false tells pit_shutdown() not to zero the counter so that +	 * the PIT really is shutdown. Generation 2 VMs don't have a PIT, +	 * and setting this value has no effect. +	 */ +	i8253_clear_counter_on_shutdown = false; +  #if IS_ENABLED(CONFIG_HYPERV)  	/*  	 * Setup the hook to get control post apic initialization. diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index d9ab49bed8af..0eda91f8eeac 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -77,7 +77,7 @@ static __init int setup_vmw_sched_clock(char *s)  }  early_param("no-vmw-sched-clock", setup_vmw_sched_clock); -static unsigned long long vmware_sched_clock(void) +static unsigned long long notrace vmware_sched_clock(void)  {  	unsigned long long ns; diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c index ab18e0884dc6..6135ae8ce036 100644 --- a/arch/x86/kernel/ldt.c +++ b/arch/x86/kernel/ldt.c @@ -199,14 +199,6 @@ static void sanity_check_ldt_mapping(struct mm_struct *mm)  /*   * If PTI is enabled, this maps the LDT into the kernelmode and   * usermode tables for the given mm. - * - * There is no corresponding unmap function.  Even if the LDT is freed, we - * leave the PTEs around until the slot is reused or the mm is destroyed. - * This is harmless: the LDT is always in ordinary memory, and no one will - * access the freed slot. - * - * If we wanted to unmap freed LDTs, we'd also need to do a flush to make - * it useful, and the flush would slow down modify_ldt().   */  static int  map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot) @@ -214,8 +206,7 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)  	unsigned long va;  	bool is_vmalloc;  	spinlock_t *ptl; -	pgd_t *pgd; -	int i; +	int i, nr_pages;  	if (!static_cpu_has(X86_FEATURE_PTI))  		return 0; @@ -229,16 +220,11 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)  	/* Check if the current mappings are sane */  	sanity_check_ldt_mapping(mm); -	/* -	 * Did we already have the top level entry allocated?  We can't -	 * use pgd_none() for this because it doens't do anything on -	 * 4-level page table kernels. -	 */ -	pgd = pgd_offset(mm, LDT_BASE_ADDR); -  	is_vmalloc = is_vmalloc_addr(ldt->entries); -	for (i = 0; i * PAGE_SIZE < ldt->nr_entries * LDT_ENTRY_SIZE; i++) { +	nr_pages = DIV_ROUND_UP(ldt->nr_entries * LDT_ENTRY_SIZE, PAGE_SIZE); + +	for (i = 0; i < nr_pages; i++) {  		unsigned long offset = i << PAGE_SHIFT;  		const void *src = (char *)ldt->entries + offset;  		unsigned long pfn; @@ -272,13 +258,39 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)  	/* Propagate LDT mapping to the user page-table */  	map_ldt_struct_to_user(mm); -	va = (unsigned long)ldt_slot_va(slot); -	flush_tlb_mm_range(mm, va, va + LDT_SLOT_STRIDE, PAGE_SHIFT, false); -  	ldt->slot = slot;  	return 0;  } +static void unmap_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt) +{ +	unsigned long va; +	int i, nr_pages; + +	if (!ldt) +		return; + +	/* LDT map/unmap is only required for PTI */ +	if (!static_cpu_has(X86_FEATURE_PTI)) +		return; + +	nr_pages = DIV_ROUND_UP(ldt->nr_entries * LDT_ENTRY_SIZE, PAGE_SIZE); + +	for (i = 0; i < nr_pages; i++) { +		unsigned long offset = i << PAGE_SHIFT; +		spinlock_t *ptl; +		pte_t *ptep; + +		va = (unsigned long)ldt_slot_va(ldt->slot) + offset; +		ptep = get_locked_pte(mm, va, &ptl); +		pte_clear(mm, va, ptep); +		pte_unmap_unlock(ptep, ptl); +	} + +	va = (unsigned long)ldt_slot_va(ldt->slot); +	flush_tlb_mm_range(mm, va, va + nr_pages * PAGE_SIZE, PAGE_SHIFT, false); +} +  #else /* !CONFIG_PAGE_TABLE_ISOLATION */  static int @@ -286,6 +298,10 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)  {  	return 0;  } + +static void unmap_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt) +{ +}  #endif /* CONFIG_PAGE_TABLE_ISOLATION */  static void free_ldt_pgtables(struct mm_struct *mm) @@ -524,6 +540,7 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)  	}  	install_ldt(mm, new_ldt); +	unmap_ldt_struct(mm, old_ldt);  	free_ldt_struct(old_ldt);  	error = 0; diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c index 1eae5af491c2..891a75dbc131 100644 --- a/arch/x86/kernel/vsmp_64.c +++ b/arch/x86/kernel/vsmp_64.c @@ -26,65 +26,8 @@  #define TOPOLOGY_REGISTER_OFFSET 0x10 -#if defined CONFIG_PCI && defined CONFIG_PARAVIRT_XXL -/* - * Interrupt control on vSMPowered systems: - * ~AC is a shadow of IF.  If IF is 'on' AC should be 'off' - * and vice versa. - */ - -asmlinkage __visible unsigned long vsmp_save_fl(void) -{ -	unsigned long flags = native_save_fl(); - -	if (!(flags & X86_EFLAGS_IF) || (flags & X86_EFLAGS_AC)) -		flags &= ~X86_EFLAGS_IF; -	return flags; -} -PV_CALLEE_SAVE_REGS_THUNK(vsmp_save_fl); - -__visible void vsmp_restore_fl(unsigned long flags) -{ -	if (flags & X86_EFLAGS_IF) -		flags &= ~X86_EFLAGS_AC; -	else -		flags |= X86_EFLAGS_AC; -	native_restore_fl(flags); -} -PV_CALLEE_SAVE_REGS_THUNK(vsmp_restore_fl); - -asmlinkage __visible void vsmp_irq_disable(void) -{ -	unsigned long flags = native_save_fl(); - -	native_restore_fl((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC); -} -PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_disable); - -asmlinkage __visible void vsmp_irq_enable(void) -{ -	unsigned long flags = native_save_fl(); - -	native_restore_fl((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC)); -} -PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_enable); - -static unsigned __init vsmp_patch(u8 type, void *ibuf, -				  unsigned long addr, unsigned len) -{ -	switch (type) { -	case PARAVIRT_PATCH(irq.irq_enable): -	case PARAVIRT_PATCH(irq.irq_disable): -	case PARAVIRT_PATCH(irq.save_fl): -	case PARAVIRT_PATCH(irq.restore_fl): -		return paravirt_patch_default(type, ibuf, addr, len); -	default: -		return native_patch(type, ibuf, addr, len); -	} - -} - -static void __init set_vsmp_pv_ops(void) +#ifdef CONFIG_PCI +static void __init set_vsmp_ctl(void)  {  	void __iomem *address;  	unsigned int cap, ctl, cfg; @@ -109,28 +52,12 @@ static void __init set_vsmp_pv_ops(void)  	}  #endif -	if (cap & ctl & (1 << 4)) { -		/* Setup irq ops and turn on vSMP  IRQ fastpath handling */ -		pv_ops.irq.irq_disable = PV_CALLEE_SAVE(vsmp_irq_disable); -		pv_ops.irq.irq_enable = PV_CALLEE_SAVE(vsmp_irq_enable); -		pv_ops.irq.save_fl = PV_CALLEE_SAVE(vsmp_save_fl); -		pv_ops.irq.restore_fl = PV_CALLEE_SAVE(vsmp_restore_fl); -		pv_ops.init.patch = vsmp_patch; -		ctl &= ~(1 << 4); -	}  	writel(ctl, address + 4);  	ctl = readl(address + 4);  	pr_info("vSMP CTL: control set to:0x%08x\n", ctl);  	early_iounmap(address, 8);  } -#else -static void __init set_vsmp_pv_ops(void) -{ -} -#endif - -#ifdef CONFIG_PCI  static int is_vsmp = -1;  static void __init detect_vsmp_box(void) @@ -164,11 +91,14 @@ static int is_vsmp_box(void)  {  	return 0;  } +static void __init set_vsmp_ctl(void) +{ +}  #endif  static void __init vsmp_cap_cpus(void)  { -#if !defined(CONFIG_X86_VSMP) && defined(CONFIG_SMP) +#if !defined(CONFIG_X86_VSMP) && defined(CONFIG_SMP) && defined(CONFIG_PCI)  	void __iomem *address;  	unsigned int cfg, topology, node_shift, maxcpus; @@ -221,6 +151,6 @@ void __init vsmp_init(void)  	vsmp_cap_cpus(); -	set_vsmp_pv_ops(); +	set_vsmp_ctl();  	return;  } diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c index 0d7b3ae4960b..a5d7ed125337 100644 --- a/arch/x86/xen/mmu_pv.c +++ b/arch/x86/xen/mmu_pv.c @@ -1905,7 +1905,7 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)  	init_top_pgt[0] = __pgd(0);  	/* Pre-constructed entries are in pfn, so convert to mfn */ -	/* L4[272] -> level3_ident_pgt  */ +	/* L4[273] -> level3_ident_pgt  */  	/* L4[511] -> level3_kernel_pgt */  	convert_pfn_mfn(init_top_pgt); @@ -1925,8 +1925,8 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)  	addr[0] = (unsigned long)pgd;  	addr[1] = (unsigned long)l3;  	addr[2] = (unsigned long)l2; -	/* Graft it onto L4[272][0]. Note that we creating an aliasing problem: -	 * Both L4[272][0] and L4[511][510] have entries that point to the same +	/* Graft it onto L4[273][0]. Note that we creating an aliasing problem: +	 * Both L4[273][0] and L4[511][510] have entries that point to the same  	 * L2 (PMD) tables. Meaning that if you modify it in __va space  	 * it will be also modified in the __ka space! (But if you just  	 * modify the PMD table to point to other PTE's or none, then you diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index b06731705529..055e37e43541 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c @@ -656,8 +656,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn)  	/*  	 * The interface requires atomic updates on p2m elements. -	 * xen_safe_write_ulong() is using __put_user which does an atomic -	 * store via asm(). +	 * xen_safe_write_ulong() is using an atomic store via asm().  	 */  	if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))  		return true; diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c index 441c88262169..1c8a8816a402 100644 --- a/arch/x86/xen/spinlock.c +++ b/arch/x86/xen/spinlock.c @@ -9,6 +9,7 @@  #include <linux/log2.h>  #include <linux/gfp.h>  #include <linux/slab.h> +#include <linux/atomic.h>  #include <asm/paravirt.h>  #include <asm/qspinlock.h> @@ -21,6 +22,7 @@  static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;  static DEFINE_PER_CPU(char *, irq_name); +static DEFINE_PER_CPU(atomic_t, xen_qlock_wait_nest);  static bool xen_pvspin = true;  static void xen_qlock_kick(int cpu) @@ -39,25 +41,25 @@ static void xen_qlock_kick(int cpu)   */  static void xen_qlock_wait(u8 *byte, u8 val)  { -	unsigned long flags;  	int irq = __this_cpu_read(lock_kicker_irq); +	atomic_t *nest_cnt = this_cpu_ptr(&xen_qlock_wait_nest);  	/* If kicker interrupts not initialized yet, just spin */  	if (irq == -1 || in_nmi())  		return; -	/* Guard against reentry. */ -	local_irq_save(flags); +	/* Detect reentry. */ +	atomic_inc(nest_cnt); -	/* If irq pending already clear it. */ -	if (xen_test_irq_pending(irq)) { +	/* If irq pending already and no nested call clear it. */ +	if (atomic_read(nest_cnt) == 1 && xen_test_irq_pending(irq)) {  		xen_clear_irq_pending(irq);  	} else if (READ_ONCE(*byte) == val) {  		/* Block until irq becomes pending (or a spurious wakeup) */  		xen_poll_irq(irq);  	} -	local_irq_restore(flags); +	atomic_dec(nest_cnt);  }  static irqreturn_t dummy_handler(int irq, void *dev_id) |