diff options
author | David S. Miller <davem@davemloft.net> | 2014-08-05 21:57:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-05 21:57:18 -0400 |
commit | e9011d086674caeedb0ffb6eb5b8bc5920821df3 (patch) | |
tree | ed5d06353d8dc1fa5f6da349808f8345ca2291a5 | |
parent | cfcfe22256d5a8a14924a1145d56017b043b554f (diff) | |
parent | c78f77e20d2ba5d4d5e478e85a6fb42556893e2d (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
Conflicts:
arch/sparc/mm/init_64.c
Conflict was simple non-overlapping additions.
Signed-off-by: David S. Miller <davem@davemloft.net>
173 files changed, 1476 insertions, 663 deletions
diff --git a/Documentation/input/event-codes.txt b/Documentation/input/event-codes.txt index f1ea2c69648d..c587a966413e 100644 --- a/Documentation/input/event-codes.txt +++ b/Documentation/input/event-codes.txt | |||
@@ -281,6 +281,19 @@ gestures can normally be extracted from it. | |||
281 | If INPUT_PROP_SEMI_MT is not set, the device is assumed to be a true MT | 281 | If INPUT_PROP_SEMI_MT is not set, the device is assumed to be a true MT |
282 | device. | 282 | device. |
283 | 283 | ||
284 | INPUT_PROP_TOPBUTTONPAD: | ||
285 | ----------------------- | ||
286 | Some laptops, most notably the Lenovo *40 series provide a trackstick | ||
287 | device but do not have physical buttons associated with the trackstick | ||
288 | device. Instead, the top area of the touchpad is marked to show | ||
289 | visual/haptic areas for left, middle, right buttons intended to be used | ||
290 | with the trackstick. | ||
291 | |||
292 | If INPUT_PROP_TOPBUTTONPAD is set, userspace should emulate buttons | ||
293 | accordingly. This property does not affect kernel behavior. | ||
294 | The kernel does not provide button emulation for such devices but treats | ||
295 | them as any other INPUT_PROP_BUTTONPAD device. | ||
296 | |||
284 | Guidelines: | 297 | Guidelines: |
285 | ========== | 298 | ========== |
286 | The guidelines below ensure proper single-touch and multi-finger functionality. | 299 | The guidelines below ensure proper single-touch and multi-finger functionality. |
diff --git a/MAINTAINERS b/MAINTAINERS index 61a8f486306b..86efa7e213c2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -6956,6 +6956,12 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | |||
6956 | S: Maintained | 6956 | S: Maintained |
6957 | F: drivers/pinctrl/pinctrl-at91.c | 6957 | F: drivers/pinctrl/pinctrl-at91.c |
6958 | 6958 | ||
6959 | PIN CONTROLLER - RENESAS | ||
6960 | M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> | ||
6961 | L: linux-sh@vger.kernel.org | ||
6962 | S: Maintained | ||
6963 | F: drivers/pinctrl/sh-pfc/ | ||
6964 | |||
6959 | PIN CONTROLLER - SAMSUNG | 6965 | PIN CONTROLLER - SAMSUNG |
6960 | M: Tomasz Figa <t.figa@samsung.com> | 6966 | M: Tomasz Figa <t.figa@samsung.com> |
6961 | M: Thomas Abraham <thomas.abraham@linaro.org> | 6967 | M: Thomas Abraham <thomas.abraham@linaro.org> |
@@ -8019,6 +8025,16 @@ F: drivers/ata/ | |||
8019 | F: include/linux/ata.h | 8025 | F: include/linux/ata.h |
8020 | F: include/linux/libata.h | 8026 | F: include/linux/libata.h |
8021 | 8027 | ||
8028 | SERIAL ATA AHCI PLATFORM devices support | ||
8029 | M: Hans de Goede <hdegoede@redhat.com> | ||
8030 | M: Tejun Heo <tj@kernel.org> | ||
8031 | L: linux-ide@vger.kernel.org | ||
8032 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
8033 | S: Supported | ||
8034 | F: drivers/ata/ahci_platform.c | ||
8035 | F: drivers/ata/libahci_platform.c | ||
8036 | F: include/linux/ahci_platform.h | ||
8037 | |||
8022 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER | 8038 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER |
8023 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> | 8039 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> |
8024 | L: linux-scsi@vger.kernel.org | 8040 | L: linux-scsi@vger.kernel.org |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 16 | 2 | PATCHLEVEL = 16 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc6 | 4 | EXTRAVERSION = -rc7 |
5 | NAME = Shuffling Zombie Juror | 5 | NAME = Shuffling Zombie Juror |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
@@ -688,6 +688,8 @@ KBUILD_CFLAGS += -fomit-frame-pointer | |||
688 | endif | 688 | endif |
689 | endif | 689 | endif |
690 | 690 | ||
691 | KBUILD_CFLAGS += $(call cc-option, -fno-var-tracking-assignments) | ||
692 | |||
691 | ifdef CONFIG_DEBUG_INFO | 693 | ifdef CONFIG_DEBUG_INFO |
692 | KBUILD_CFLAGS += -g | 694 | KBUILD_CFLAGS += -g |
693 | KBUILD_AFLAGS += -Wa,-gdwarf-2 | 695 | KBUILD_AFLAGS += -Wa,-gdwarf-2 |
diff --git a/arch/arm/crypto/aesbs-glue.c b/arch/arm/crypto/aesbs-glue.c index 4522366da759..15468fbbdea3 100644 --- a/arch/arm/crypto/aesbs-glue.c +++ b/arch/arm/crypto/aesbs-glue.c | |||
@@ -137,7 +137,7 @@ static int aesbs_cbc_encrypt(struct blkcipher_desc *desc, | |||
137 | dst += AES_BLOCK_SIZE; | 137 | dst += AES_BLOCK_SIZE; |
138 | } while (--blocks); | 138 | } while (--blocks); |
139 | } | 139 | } |
140 | err = blkcipher_walk_done(desc, &walk, 0); | 140 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
141 | } | 141 | } |
142 | return err; | 142 | return err; |
143 | } | 143 | } |
@@ -158,7 +158,7 @@ static int aesbs_cbc_decrypt(struct blkcipher_desc *desc, | |||
158 | bsaes_cbc_encrypt(walk.src.virt.addr, walk.dst.virt.addr, | 158 | bsaes_cbc_encrypt(walk.src.virt.addr, walk.dst.virt.addr, |
159 | walk.nbytes, &ctx->dec, walk.iv); | 159 | walk.nbytes, &ctx->dec, walk.iv); |
160 | kernel_neon_end(); | 160 | kernel_neon_end(); |
161 | err = blkcipher_walk_done(desc, &walk, 0); | 161 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
162 | } | 162 | } |
163 | while (walk.nbytes) { | 163 | while (walk.nbytes) { |
164 | u32 blocks = walk.nbytes / AES_BLOCK_SIZE; | 164 | u32 blocks = walk.nbytes / AES_BLOCK_SIZE; |
@@ -182,7 +182,7 @@ static int aesbs_cbc_decrypt(struct blkcipher_desc *desc, | |||
182 | dst += AES_BLOCK_SIZE; | 182 | dst += AES_BLOCK_SIZE; |
183 | src += AES_BLOCK_SIZE; | 183 | src += AES_BLOCK_SIZE; |
184 | } while (--blocks); | 184 | } while (--blocks); |
185 | err = blkcipher_walk_done(desc, &walk, 0); | 185 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
186 | } | 186 | } |
187 | return err; | 187 | return err; |
188 | } | 188 | } |
@@ -268,7 +268,7 @@ static int aesbs_xts_encrypt(struct blkcipher_desc *desc, | |||
268 | bsaes_xts_encrypt(walk.src.virt.addr, walk.dst.virt.addr, | 268 | bsaes_xts_encrypt(walk.src.virt.addr, walk.dst.virt.addr, |
269 | walk.nbytes, &ctx->enc, walk.iv); | 269 | walk.nbytes, &ctx->enc, walk.iv); |
270 | kernel_neon_end(); | 270 | kernel_neon_end(); |
271 | err = blkcipher_walk_done(desc, &walk, 0); | 271 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
272 | } | 272 | } |
273 | return err; | 273 | return err; |
274 | } | 274 | } |
@@ -292,7 +292,7 @@ static int aesbs_xts_decrypt(struct blkcipher_desc *desc, | |||
292 | bsaes_xts_decrypt(walk.src.virt.addr, walk.dst.virt.addr, | 292 | bsaes_xts_decrypt(walk.src.virt.addr, walk.dst.virt.addr, |
293 | walk.nbytes, &ctx->dec, walk.iv); | 293 | walk.nbytes, &ctx->dec, walk.iv); |
294 | kernel_neon_end(); | 294 | kernel_neon_end(); |
295 | err = blkcipher_walk_done(desc, &walk, 0); | 295 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
296 | } | 296 | } |
297 | return err; | 297 | return err; |
298 | } | 298 | } |
diff --git a/arch/arm64/crypto/aes-glue.c b/arch/arm64/crypto/aes-glue.c index 60f2f4c12256..79cd911ef88c 100644 --- a/arch/arm64/crypto/aes-glue.c +++ b/arch/arm64/crypto/aes-glue.c | |||
@@ -106,7 +106,7 @@ static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
106 | for (first = 1; (blocks = (walk.nbytes / AES_BLOCK_SIZE)); first = 0) { | 106 | for (first = 1; (blocks = (walk.nbytes / AES_BLOCK_SIZE)); first = 0) { |
107 | aes_ecb_encrypt(walk.dst.virt.addr, walk.src.virt.addr, | 107 | aes_ecb_encrypt(walk.dst.virt.addr, walk.src.virt.addr, |
108 | (u8 *)ctx->key_enc, rounds, blocks, first); | 108 | (u8 *)ctx->key_enc, rounds, blocks, first); |
109 | err = blkcipher_walk_done(desc, &walk, 0); | 109 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
110 | } | 110 | } |
111 | kernel_neon_end(); | 111 | kernel_neon_end(); |
112 | return err; | 112 | return err; |
@@ -128,7 +128,7 @@ static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
128 | for (first = 1; (blocks = (walk.nbytes / AES_BLOCK_SIZE)); first = 0) { | 128 | for (first = 1; (blocks = (walk.nbytes / AES_BLOCK_SIZE)); first = 0) { |
129 | aes_ecb_decrypt(walk.dst.virt.addr, walk.src.virt.addr, | 129 | aes_ecb_decrypt(walk.dst.virt.addr, walk.src.virt.addr, |
130 | (u8 *)ctx->key_dec, rounds, blocks, first); | 130 | (u8 *)ctx->key_dec, rounds, blocks, first); |
131 | err = blkcipher_walk_done(desc, &walk, 0); | 131 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
132 | } | 132 | } |
133 | kernel_neon_end(); | 133 | kernel_neon_end(); |
134 | return err; | 134 | return err; |
@@ -151,7 +151,7 @@ static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
151 | aes_cbc_encrypt(walk.dst.virt.addr, walk.src.virt.addr, | 151 | aes_cbc_encrypt(walk.dst.virt.addr, walk.src.virt.addr, |
152 | (u8 *)ctx->key_enc, rounds, blocks, walk.iv, | 152 | (u8 *)ctx->key_enc, rounds, blocks, walk.iv, |
153 | first); | 153 | first); |
154 | err = blkcipher_walk_done(desc, &walk, 0); | 154 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
155 | } | 155 | } |
156 | kernel_neon_end(); | 156 | kernel_neon_end(); |
157 | return err; | 157 | return err; |
@@ -174,7 +174,7 @@ static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
174 | aes_cbc_decrypt(walk.dst.virt.addr, walk.src.virt.addr, | 174 | aes_cbc_decrypt(walk.dst.virt.addr, walk.src.virt.addr, |
175 | (u8 *)ctx->key_dec, rounds, blocks, walk.iv, | 175 | (u8 *)ctx->key_dec, rounds, blocks, walk.iv, |
176 | first); | 176 | first); |
177 | err = blkcipher_walk_done(desc, &walk, 0); | 177 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
178 | } | 178 | } |
179 | kernel_neon_end(); | 179 | kernel_neon_end(); |
180 | return err; | 180 | return err; |
@@ -243,7 +243,7 @@ static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
243 | aes_xts_encrypt(walk.dst.virt.addr, walk.src.virt.addr, | 243 | aes_xts_encrypt(walk.dst.virt.addr, walk.src.virt.addr, |
244 | (u8 *)ctx->key1.key_enc, rounds, blocks, | 244 | (u8 *)ctx->key1.key_enc, rounds, blocks, |
245 | (u8 *)ctx->key2.key_enc, walk.iv, first); | 245 | (u8 *)ctx->key2.key_enc, walk.iv, first); |
246 | err = blkcipher_walk_done(desc, &walk, 0); | 246 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
247 | } | 247 | } |
248 | kernel_neon_end(); | 248 | kernel_neon_end(); |
249 | 249 | ||
@@ -267,7 +267,7 @@ static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
267 | aes_xts_decrypt(walk.dst.virt.addr, walk.src.virt.addr, | 267 | aes_xts_decrypt(walk.dst.virt.addr, walk.src.virt.addr, |
268 | (u8 *)ctx->key1.key_dec, rounds, blocks, | 268 | (u8 *)ctx->key1.key_dec, rounds, blocks, |
269 | (u8 *)ctx->key2.key_enc, walk.iv, first); | 269 | (u8 *)ctx->key2.key_enc, walk.iv, first); |
270 | err = blkcipher_walk_done(desc, &walk, 0); | 270 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % AES_BLOCK_SIZE); |
271 | } | 271 | } |
272 | kernel_neon_end(); | 272 | kernel_neon_end(); |
273 | 273 | ||
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index f43db8a69262..e90c5426fe14 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c | |||
@@ -60,6 +60,17 @@ static int __init early_initrd(char *p) | |||
60 | early_param("initrd", early_initrd); | 60 | early_param("initrd", early_initrd); |
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | /* | ||
64 | * Return the maximum physical address for ZONE_DMA (DMA_BIT_MASK(32)). It | ||
65 | * currently assumes that for memory starting above 4G, 32-bit devices will | ||
66 | * use a DMA offset. | ||
67 | */ | ||
68 | static phys_addr_t max_zone_dma_phys(void) | ||
69 | { | ||
70 | phys_addr_t offset = memblock_start_of_DRAM() & GENMASK_ULL(63, 32); | ||
71 | return min(offset + (1ULL << 32), memblock_end_of_DRAM()); | ||
72 | } | ||
73 | |||
63 | static void __init zone_sizes_init(unsigned long min, unsigned long max) | 74 | static void __init zone_sizes_init(unsigned long min, unsigned long max) |
64 | { | 75 | { |
65 | struct memblock_region *reg; | 76 | struct memblock_region *reg; |
@@ -70,9 +81,7 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max) | |||
70 | 81 | ||
71 | /* 4GB maximum for 32-bit only capable devices */ | 82 | /* 4GB maximum for 32-bit only capable devices */ |
72 | if (IS_ENABLED(CONFIG_ZONE_DMA)) { | 83 | if (IS_ENABLED(CONFIG_ZONE_DMA)) { |
73 | unsigned long max_dma_phys = | 84 | max_dma = PFN_DOWN(max_zone_dma_phys()); |
74 | (unsigned long)(dma_to_phys(NULL, DMA_BIT_MASK(32)) + 1); | ||
75 | max_dma = max(min, min(max, max_dma_phys >> PAGE_SHIFT)); | ||
76 | zone_size[ZONE_DMA] = max_dma - min; | 85 | zone_size[ZONE_DMA] = max_dma - min; |
77 | } | 86 | } |
78 | zone_size[ZONE_NORMAL] = max - max_dma; | 87 | zone_size[ZONE_NORMAL] = max - max_dma; |
@@ -146,7 +155,7 @@ void __init arm64_memblock_init(void) | |||
146 | 155 | ||
147 | /* 4GB maximum for 32-bit only capable devices */ | 156 | /* 4GB maximum for 32-bit only capable devices */ |
148 | if (IS_ENABLED(CONFIG_ZONE_DMA)) | 157 | if (IS_ENABLED(CONFIG_ZONE_DMA)) |
149 | dma_phys_limit = dma_to_phys(NULL, DMA_BIT_MASK(32)) + 1; | 158 | dma_phys_limit = max_zone_dma_phys(); |
150 | dma_contiguous_reserve(dma_phys_limit); | 159 | dma_contiguous_reserve(dma_phys_limit); |
151 | 160 | ||
152 | memblock_allow_resize(); | 161 | memblock_allow_resize(); |
diff --git a/arch/blackfin/configs/BF609-EZKIT_defconfig b/arch/blackfin/configs/BF609-EZKIT_defconfig index a7e9bfd84183..fcec5ce71392 100644 --- a/arch/blackfin/configs/BF609-EZKIT_defconfig +++ b/arch/blackfin/configs/BF609-EZKIT_defconfig | |||
@@ -102,7 +102,7 @@ CONFIG_I2C_CHARDEV=y | |||
102 | CONFIG_I2C_BLACKFIN_TWI=y | 102 | CONFIG_I2C_BLACKFIN_TWI=y |
103 | CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=100 | 103 | CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=100 |
104 | CONFIG_SPI=y | 104 | CONFIG_SPI=y |
105 | CONFIG_SPI_BFIN_V3=y | 105 | CONFIG_SPI_ADI_V3=y |
106 | CONFIG_GPIOLIB=y | 106 | CONFIG_GPIOLIB=y |
107 | CONFIG_GPIO_SYSFS=y | 107 | CONFIG_GPIO_SYSFS=y |
108 | # CONFIG_HWMON is not set | 108 | # CONFIG_HWMON is not set |
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index ba35864b2b74..c9eec84aa258 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
@@ -145,7 +145,7 @@ SECTIONS | |||
145 | 145 | ||
146 | .text_l1 L1_CODE_START : AT(LOADADDR(.exit.data) + SIZEOF(.exit.data)) | 146 | .text_l1 L1_CODE_START : AT(LOADADDR(.exit.data) + SIZEOF(.exit.data)) |
147 | #else | 147 | #else |
148 | .init.data : AT(__data_lma + __data_len) | 148 | .init.data : AT(__data_lma + __data_len + 32) |
149 | { | 149 | { |
150 | __sinitdata = .; | 150 | __sinitdata = .; |
151 | INIT_DATA | 151 | INIT_DATA |
diff --git a/arch/blackfin/mach-bf533/boards/blackstamp.c b/arch/blackfin/mach-bf533/boards/blackstamp.c index 63b0e4fe760c..0ccf0cf4daaf 100644 --- a/arch/blackfin/mach-bf533/boards/blackstamp.c +++ b/arch/blackfin/mach-bf533/boards/blackstamp.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/spi/spi.h> | 20 | #include <linux/spi/spi.h> |
21 | #include <linux/spi/flash.h> | 21 | #include <linux/spi/flash.h> |
22 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
23 | #include <linux/gpio.h> | ||
23 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
24 | #include <asm/dma.h> | 25 | #include <asm/dma.h> |
25 | #include <asm/bfin5xx_spi.h> | 26 | #include <asm/bfin5xx_spi.h> |
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537e.c b/arch/blackfin/mach-bf537/boards/cm_bf537e.c index c65c6dbda3da..1e7290ef3525 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537e.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537e.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #endif | 21 | #endif |
22 | #include <linux/ata_platform.h> | 22 | #include <linux/ata_platform.h> |
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/gpio.h> | ||
24 | #include <asm/dma.h> | 25 | #include <asm/dma.h> |
25 | #include <asm/bfin5xx_spi.h> | 26 | #include <asm/bfin5xx_spi.h> |
26 | #include <asm/portmux.h> | 27 | #include <asm/portmux.h> |
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537u.c b/arch/blackfin/mach-bf537/boards/cm_bf537u.c index af58454b4bff..c7495dc74690 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537u.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537u.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #endif | 21 | #endif |
22 | #include <linux/ata_platform.h> | 22 | #include <linux/ata_platform.h> |
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/gpio.h> | ||
24 | #include <asm/dma.h> | 25 | #include <asm/dma.h> |
25 | #include <asm/bfin5xx_spi.h> | 26 | #include <asm/bfin5xx_spi.h> |
26 | #include <asm/portmux.h> | 27 | #include <asm/portmux.h> |
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c index a0211225748d..6b988ad653d8 100644 --- a/arch/blackfin/mach-bf537/boards/tcm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #endif | 21 | #endif |
22 | #include <linux/ata_platform.h> | 22 | #include <linux/ata_platform.h> |
23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
24 | #include <linux/gpio.h> | ||
24 | #include <asm/dma.h> | 25 | #include <asm/dma.h> |
25 | #include <asm/bfin5xx_spi.h> | 26 | #include <asm/bfin5xx_spi.h> |
26 | #include <asm/portmux.h> | 27 | #include <asm/portmux.h> |
diff --git a/arch/blackfin/mach-bf548/boards/ezkit.c b/arch/blackfin/mach-bf548/boards/ezkit.c index 90138e6112c1..1fe7ff286619 100644 --- a/arch/blackfin/mach-bf548/boards/ezkit.c +++ b/arch/blackfin/mach-bf548/boards/ezkit.c | |||
@@ -2118,7 +2118,7 @@ static struct pinctrl_map __initdata bfin_pinmux_map[] = { | |||
2118 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-rotary", "pinctrl-adi2.0", NULL, "rotary"), | 2118 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-rotary", "pinctrl-adi2.0", NULL, "rotary"), |
2119 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_can.0", "pinctrl-adi2.0", NULL, "can0"), | 2119 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_can.0", "pinctrl-adi2.0", NULL, "can0"), |
2120 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_can.1", "pinctrl-adi2.0", NULL, "can1"), | 2120 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_can.1", "pinctrl-adi2.0", NULL, "can1"), |
2121 | PIN_MAP_MUX_GROUP_DEFAULT("bf54x-lq043", "pinctrl-adi2.0", NULL, "ppi0_24b"), | 2121 | PIN_MAP_MUX_GROUP_DEFAULT("bf54x-lq043", "pinctrl-adi2.0", "ppi0_24bgrp", "ppi0"), |
2122 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-i2s.0", "pinctrl-adi2.0", NULL, "sport0"), | 2122 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-i2s.0", "pinctrl-adi2.0", NULL, "sport0"), |
2123 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-tdm.0", "pinctrl-adi2.0", NULL, "sport0"), | 2123 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-tdm.0", "pinctrl-adi2.0", NULL, "sport0"), |
2124 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-ac97.0", "pinctrl-adi2.0", NULL, "sport0"), | 2124 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-ac97.0", "pinctrl-adi2.0", NULL, "sport0"), |
@@ -2140,7 +2140,9 @@ static struct pinctrl_map __initdata bfin_pinmux_map[] = { | |||
2140 | PIN_MAP_MUX_GROUP_DEFAULT("pata-bf54x", "pinctrl-adi2.0", NULL, "atapi_alter"), | 2140 | PIN_MAP_MUX_GROUP_DEFAULT("pata-bf54x", "pinctrl-adi2.0", NULL, "atapi_alter"), |
2141 | #endif | 2141 | #endif |
2142 | PIN_MAP_MUX_GROUP_DEFAULT("bf5xx-nand.0", "pinctrl-adi2.0", NULL, "nfc0"), | 2142 | PIN_MAP_MUX_GROUP_DEFAULT("bf5xx-nand.0", "pinctrl-adi2.0", NULL, "nfc0"), |
2143 | PIN_MAP_MUX_GROUP_DEFAULT("bf54x-keys", "pinctrl-adi2.0", NULL, "keys_4x4"), | 2143 | PIN_MAP_MUX_GROUP_DEFAULT("bf54x-keys", "pinctrl-adi2.0", "keys_4x4grp", "keys"), |
2144 | PIN_MAP_MUX_GROUP("bf54x-keys", "4bit", "pinctrl-adi2.0", "keys_4x4grp", "keys"), | ||
2145 | PIN_MAP_MUX_GROUP("bf54x-keys", "8bit", "pinctrl-adi2.0", "keys_8x8grp", "keys"), | ||
2144 | }; | 2146 | }; |
2145 | 2147 | ||
2146 | static int __init ezkit_init(void) | 2148 | static int __init ezkit_init(void) |
diff --git a/arch/blackfin/mach-bf561/boards/acvilon.c b/arch/blackfin/mach-bf561/boards/acvilon.c index 430b16d5ccb1..6ab951534d79 100644 --- a/arch/blackfin/mach-bf561/boards/acvilon.c +++ b/arch/blackfin/mach-bf561/boards/acvilon.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <linux/spi/flash.h> | 44 | #include <linux/spi/flash.h> |
45 | #include <linux/irq.h> | 45 | #include <linux/irq.h> |
46 | #include <linux/interrupt.h> | 46 | #include <linux/interrupt.h> |
47 | #include <linux/gpio.h> | ||
47 | #include <linux/jiffies.h> | 48 | #include <linux/jiffies.h> |
48 | #include <linux/i2c-pca-platform.h> | 49 | #include <linux/i2c-pca-platform.h> |
49 | #include <linux/delay.h> | 50 | #include <linux/delay.h> |
diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index 9f777df4cacc..e862f7823e68 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #endif | 18 | #endif |
19 | #include <linux/ata_platform.h> | 19 | #include <linux/ata_platform.h> |
20 | #include <linux/irq.h> | 20 | #include <linux/irq.h> |
21 | #include <linux/gpio.h> | ||
21 | #include <asm/dma.h> | 22 | #include <asm/dma.h> |
22 | #include <asm/bfin5xx_spi.h> | 23 | #include <asm/bfin5xx_spi.h> |
23 | #include <asm/portmux.h> | 24 | #include <asm/portmux.h> |
diff --git a/arch/blackfin/mach-bf561/boards/ezkit.c b/arch/blackfin/mach-bf561/boards/ezkit.c index 88dee43e7abe..2de71e8c104b 100644 --- a/arch/blackfin/mach-bf561/boards/ezkit.c +++ b/arch/blackfin/mach-bf561/boards/ezkit.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/spi/spi.h> | 14 | #include <linux/spi/spi.h> |
15 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
17 | #include <linux/gpio.h> | ||
17 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
18 | #include <asm/dma.h> | 19 | #include <asm/dma.h> |
19 | #include <asm/bfin5xx_spi.h> | 20 | #include <asm/bfin5xx_spi.h> |
diff --git a/arch/blackfin/mach-bf609/boards/ezkit.c b/arch/blackfin/mach-bf609/boards/ezkit.c index 1ba4600de69f..e2c0b024ce88 100644 --- a/arch/blackfin/mach-bf609/boards/ezkit.c +++ b/arch/blackfin/mach-bf609/boards/ezkit.c | |||
@@ -698,8 +698,6 @@ int bf609_nor_flash_init(struct platform_device *pdev) | |||
698 | { | 698 | { |
699 | #define CONFIG_SMC_GCTL_VAL 0x00000010 | 699 | #define CONFIG_SMC_GCTL_VAL 0x00000010 |
700 | 700 | ||
701 | if (!devm_pinctrl_get_select_default(&pdev->dev)) | ||
702 | return -EBUSY; | ||
703 | bfin_write32(SMC_GCTL, CONFIG_SMC_GCTL_VAL); | 701 | bfin_write32(SMC_GCTL, CONFIG_SMC_GCTL_VAL); |
704 | bfin_write32(SMC_B0CTL, 0x01002011); | 702 | bfin_write32(SMC_B0CTL, 0x01002011); |
705 | bfin_write32(SMC_B0TIM, 0x08170977); | 703 | bfin_write32(SMC_B0TIM, 0x08170977); |
@@ -709,7 +707,6 @@ int bf609_nor_flash_init(struct platform_device *pdev) | |||
709 | 707 | ||
710 | void bf609_nor_flash_exit(struct platform_device *pdev) | 708 | void bf609_nor_flash_exit(struct platform_device *pdev) |
711 | { | 709 | { |
712 | devm_pinctrl_put(pdev->dev.pins->p); | ||
713 | bfin_write32(SMC_GCTL, 0); | 710 | bfin_write32(SMC_GCTL, 0); |
714 | } | 711 | } |
715 | 712 | ||
@@ -2058,15 +2055,14 @@ static struct pinctrl_map __initdata bfin_pinmux_map[] = { | |||
2058 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-rotary", "pinctrl-adi2.0", NULL, "rotary"), | 2055 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-rotary", "pinctrl-adi2.0", NULL, "rotary"), |
2059 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_can.0", "pinctrl-adi2.0", NULL, "can0"), | 2056 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_can.0", "pinctrl-adi2.0", NULL, "can0"), |
2060 | PIN_MAP_MUX_GROUP_DEFAULT("physmap-flash.0", "pinctrl-adi2.0", NULL, "smc0"), | 2057 | PIN_MAP_MUX_GROUP_DEFAULT("physmap-flash.0", "pinctrl-adi2.0", NULL, "smc0"), |
2061 | PIN_MAP_MUX_GROUP_DEFAULT("bf609_nl8048.2", "pinctrl-adi2.0", NULL, "ppi2_16b"), | 2058 | PIN_MAP_MUX_GROUP_DEFAULT("bf609_nl8048.2", "pinctrl-adi2.0", "ppi2_16bgrp", "ppi2"), |
2062 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_display.0", "pinctrl-adi2.0", NULL, "ppi0_16b"), | 2059 | PIN_MAP_MUX_GROUP("bfin_display.0", "8bit", "pinctrl-adi2.0", "ppi2_8bgrp", "ppi2"), |
2063 | #if IS_ENABLED(CONFIG_VIDEO_MT9M114) | 2060 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_display.0", "pinctrl-adi2.0", "ppi2_16bgrp", "ppi2"), |
2064 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_capture.0", "pinctrl-adi2.0", NULL, "ppi0_8b"), | 2061 | PIN_MAP_MUX_GROUP("bfin_display.0", "16bit", "pinctrl-adi2.0", "ppi2_16bgrp", "ppi2"), |
2065 | #elif IS_ENABLED(CONFIG_VIDEO_VS6624) | 2062 | PIN_MAP_MUX_GROUP("bfin_capture.0", "8bit", "pinctrl-adi2.0", "ppi0_8bgrp", "ppi0"), |
2066 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_capture.0", "pinctrl-adi2.0", NULL, "ppi0_16b"), | 2063 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_capture.0", "pinctrl-adi2.0", "ppi0_16bgrp", "ppi0"), |
2067 | #else | 2064 | PIN_MAP_MUX_GROUP("bfin_capture.0", "16bit", "pinctrl-adi2.0", "ppi0_16bgrp", "ppi0"), |
2068 | PIN_MAP_MUX_GROUP_DEFAULT("bfin_capture.0", "pinctrl-adi2.0", NULL, "ppi0_24b"), | 2065 | PIN_MAP_MUX_GROUP("bfin_capture.0", "24bit", "pinctrl-adi2.0", "ppi0_24bgrp", "ppi0"), |
2069 | #endif | ||
2070 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-i2s.0", "pinctrl-adi2.0", NULL, "sport0"), | 2066 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-i2s.0", "pinctrl-adi2.0", NULL, "sport0"), |
2071 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-tdm.0", "pinctrl-adi2.0", NULL, "sport0"), | 2067 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-tdm.0", "pinctrl-adi2.0", NULL, "sport0"), |
2072 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-i2s.1", "pinctrl-adi2.0", NULL, "sport1"), | 2068 | PIN_MAP_MUX_GROUP_DEFAULT("bfin-i2s.1", "pinctrl-adi2.0", NULL, "sport1"), |
diff --git a/arch/blackfin/mach-bf609/include/mach/pm.h b/arch/blackfin/mach-bf609/include/mach/pm.h index 3ca0fb965636..a1efd936dd30 100644 --- a/arch/blackfin/mach-bf609/include/mach/pm.h +++ b/arch/blackfin/mach-bf609/include/mach/pm.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #define __MACH_BF609_PM_H__ | 10 | #define __MACH_BF609_PM_H__ |
11 | 11 | ||
12 | #include <linux/suspend.h> | 12 | #include <linux/suspend.h> |
13 | #include <linux/platform_device.h> | ||
13 | 14 | ||
14 | extern int bfin609_pm_enter(suspend_state_t state); | 15 | extern int bfin609_pm_enter(suspend_state_t state); |
15 | extern int bf609_pm_prepare(void); | 16 | extern int bf609_pm_prepare(void); |
@@ -19,6 +20,6 @@ void bf609_hibernate(void); | |||
19 | void bfin_sec_raise_irq(unsigned int sid); | 20 | void bfin_sec_raise_irq(unsigned int sid); |
20 | void coreb_enable(void); | 21 | void coreb_enable(void); |
21 | 22 | ||
22 | int bf609_nor_flash_init(void); | 23 | int bf609_nor_flash_init(struct platform_device *pdev); |
23 | void bf609_nor_flash_exit(void); | 24 | void bf609_nor_flash_exit(struct platform_device *pdev); |
24 | #endif | 25 | #endif |
diff --git a/arch/blackfin/mach-bf609/pm.c b/arch/blackfin/mach-bf609/pm.c index 0cdd6955c7be..b1bfcf434d16 100644 --- a/arch/blackfin/mach-bf609/pm.c +++ b/arch/blackfin/mach-bf609/pm.c | |||
@@ -291,13 +291,13 @@ static struct bfin_cpu_pm_fns bf609_cpu_pm = { | |||
291 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 291 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
292 | static int smc_pm_syscore_suspend(void) | 292 | static int smc_pm_syscore_suspend(void) |
293 | { | 293 | { |
294 | bf609_nor_flash_exit(); | 294 | bf609_nor_flash_exit(NULL); |
295 | return 0; | 295 | return 0; |
296 | } | 296 | } |
297 | 297 | ||
298 | static void smc_pm_syscore_resume(void) | 298 | static void smc_pm_syscore_resume(void) |
299 | { | 299 | { |
300 | bf609_nor_flash_init(); | 300 | bf609_nor_flash_init(NULL); |
301 | } | 301 | } |
302 | 302 | ||
303 | static struct syscore_ops smc_pm_syscore_ops = { | 303 | static struct syscore_ops smc_pm_syscore_ops = { |
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 867b7cef204c..1f94784eab6d 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c | |||
@@ -1208,8 +1208,6 @@ int __init init_arch_irq(void) | |||
1208 | 1208 | ||
1209 | bfin_sec_set_priority(CONFIG_SEC_IRQ_PRIORITY_LEVELS, sec_int_priority); | 1209 | bfin_sec_set_priority(CONFIG_SEC_IRQ_PRIORITY_LEVELS, sec_int_priority); |
1210 | 1210 | ||
1211 | bfin_sec_set_priority(CONFIG_SEC_IRQ_PRIORITY_LEVELS, sec_int_priority); | ||
1212 | |||
1213 | /* Enable interrupts IVG7-15 */ | 1211 | /* Enable interrupts IVG7-15 */ |
1214 | bfin_irq_flags |= IMASK_IVG15 | | 1212 | bfin_irq_flags |= IMASK_IVG15 | |
1215 | IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 | | 1213 | IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 | |
diff --git a/arch/parisc/include/uapi/asm/signal.h b/arch/parisc/include/uapi/asm/signal.h index a2fa297196bc..f5645d6a89f2 100644 --- a/arch/parisc/include/uapi/asm/signal.h +++ b/arch/parisc/include/uapi/asm/signal.h | |||
@@ -69,8 +69,6 @@ | |||
69 | #define SA_NOMASK SA_NODEFER | 69 | #define SA_NOMASK SA_NODEFER |
70 | #define SA_ONESHOT SA_RESETHAND | 70 | #define SA_ONESHOT SA_RESETHAND |
71 | 71 | ||
72 | #define SA_RESTORER 0x04000000 /* obsolete -- ignored */ | ||
73 | |||
74 | #define MINSIGSTKSZ 2048 | 72 | #define MINSIGSTKSZ 2048 |
75 | #define SIGSTKSZ 8192 | 73 | #define SIGSTKSZ 8192 |
76 | 74 | ||
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index ae085ad0fba0..0bef864264c0 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
@@ -728,7 +728,6 @@ static void __init pagetable_init(void) | |||
728 | #endif | 728 | #endif |
729 | 729 | ||
730 | empty_zero_page = alloc_bootmem_pages(PAGE_SIZE); | 730 | empty_zero_page = alloc_bootmem_pages(PAGE_SIZE); |
731 | memset(empty_zero_page, 0, PAGE_SIZE); | ||
732 | } | 731 | } |
733 | 732 | ||
734 | static void __init gateway_init(void) | 733 | static void __init gateway_init(void) |
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index bc2347774f0a..0fdd7eece6d9 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
@@ -447,6 +447,7 @@ extern const char *powerpc_base_platform; | |||
447 | CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \ | 447 | CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \ |
448 | CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP) | 448 | CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP) |
449 | #define CPU_FTRS_POWER8E (CPU_FTRS_POWER8 | CPU_FTR_PMAO_BUG) | 449 | #define CPU_FTRS_POWER8E (CPU_FTRS_POWER8 | CPU_FTR_PMAO_BUG) |
450 | #define CPU_FTRS_POWER8_DD1 (CPU_FTRS_POWER8 & ~CPU_FTR_DBELL) | ||
450 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 451 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
451 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 452 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
452 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 453 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h index fddb72b48ce9..d645428a65a4 100644 --- a/arch/powerpc/include/asm/kvm_book3s_64.h +++ b/arch/powerpc/include/asm/kvm_book3s_64.h | |||
@@ -198,8 +198,10 @@ static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, | |||
198 | return rb; | 198 | return rb; |
199 | } | 199 | } |
200 | 200 | ||
201 | static inline unsigned long hpte_page_size(unsigned long h, unsigned long l) | 201 | static inline unsigned long __hpte_page_size(unsigned long h, unsigned long l, |
202 | bool is_base_size) | ||
202 | { | 203 | { |
204 | |||
203 | int size, a_psize; | 205 | int size, a_psize; |
204 | /* Look at the 8 bit LP value */ | 206 | /* Look at the 8 bit LP value */ |
205 | unsigned int lp = (l >> LP_SHIFT) & ((1 << LP_BITS) - 1); | 207 | unsigned int lp = (l >> LP_SHIFT) & ((1 << LP_BITS) - 1); |
@@ -214,14 +216,27 @@ static inline unsigned long hpte_page_size(unsigned long h, unsigned long l) | |||
214 | continue; | 216 | continue; |
215 | 217 | ||
216 | a_psize = __hpte_actual_psize(lp, size); | 218 | a_psize = __hpte_actual_psize(lp, size); |
217 | if (a_psize != -1) | 219 | if (a_psize != -1) { |
220 | if (is_base_size) | ||
221 | return 1ul << mmu_psize_defs[size].shift; | ||
218 | return 1ul << mmu_psize_defs[a_psize].shift; | 222 | return 1ul << mmu_psize_defs[a_psize].shift; |
223 | } | ||
219 | } | 224 | } |
220 | 225 | ||
221 | } | 226 | } |
222 | return 0; | 227 | return 0; |
223 | } | 228 | } |
224 | 229 | ||
230 | static inline unsigned long hpte_page_size(unsigned long h, unsigned long l) | ||
231 | { | ||
232 | return __hpte_page_size(h, l, 0); | ||
233 | } | ||
234 | |||
235 | static inline unsigned long hpte_base_page_size(unsigned long h, unsigned long l) | ||
236 | { | ||
237 | return __hpte_page_size(h, l, 1); | ||
238 | } | ||
239 | |||
225 | static inline unsigned long hpte_rpn(unsigned long ptel, unsigned long psize) | 240 | static inline unsigned long hpte_rpn(unsigned long ptel, unsigned long psize) |
226 | { | 241 | { |
227 | return ((ptel & HPTE_R_RPN) & ~(psize - 1)) >> PAGE_SHIFT; | 242 | return ((ptel & HPTE_R_RPN) & ~(psize - 1)) >> PAGE_SHIFT; |
diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 807014dde821..c2b4dcf23d03 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h | |||
@@ -22,6 +22,7 @@ | |||
22 | */ | 22 | */ |
23 | #include <asm/pgtable-ppc64.h> | 23 | #include <asm/pgtable-ppc64.h> |
24 | #include <asm/bug.h> | 24 | #include <asm/bug.h> |
25 | #include <asm/processor.h> | ||
25 | 26 | ||
26 | /* | 27 | /* |
27 | * Segment table | 28 | * Segment table |
@@ -496,7 +497,7 @@ extern void slb_set_size(u16 size); | |||
496 | */ | 497 | */ |
497 | struct subpage_prot_table { | 498 | struct subpage_prot_table { |
498 | unsigned long maxaddr; /* only addresses < this are protected */ | 499 | unsigned long maxaddr; /* only addresses < this are protected */ |
499 | unsigned int **protptrs[2]; | 500 | unsigned int **protptrs[(TASK_SIZE_USER64 >> 43)]; |
500 | unsigned int *low_prot[4]; | 501 | unsigned int *low_prot[4]; |
501 | }; | 502 | }; |
502 | 503 | ||
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 9ea266eae33e..7e4612528546 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
@@ -277,6 +277,8 @@ n: | |||
277 | .globl n; \ | 277 | .globl n; \ |
278 | n: | 278 | n: |
279 | 279 | ||
280 | #define _GLOBAL_TOC(name) _GLOBAL(name) | ||
281 | |||
280 | #define _KPROBE(n) \ | 282 | #define _KPROBE(n) \ |
281 | .section ".kprobes.text","a"; \ | 283 | .section ".kprobes.text","a"; \ |
282 | .globl n; \ | 284 | .globl n; \ |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 965291b4c2fa..0c157642c2a1 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -527,6 +527,26 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
527 | .machine_check_early = __machine_check_early_realmode_p8, | 527 | .machine_check_early = __machine_check_early_realmode_p8, |
528 | .platform = "power8", | 528 | .platform = "power8", |
529 | }, | 529 | }, |
530 | { /* Power8 DD1: Does not support doorbell IPIs */ | ||
531 | .pvr_mask = 0xffffff00, | ||
532 | .pvr_value = 0x004d0100, | ||
533 | .cpu_name = "POWER8 (raw)", | ||
534 | .cpu_features = CPU_FTRS_POWER8_DD1, | ||
535 | .cpu_user_features = COMMON_USER_POWER8, | ||
536 | .cpu_user_features2 = COMMON_USER2_POWER8, | ||
537 | .mmu_features = MMU_FTRS_POWER8, | ||
538 | .icache_bsize = 128, | ||
539 | .dcache_bsize = 128, | ||
540 | .num_pmcs = 6, | ||
541 | .pmc_type = PPC_PMC_IBM, | ||
542 | .oprofile_cpu_type = "ppc64/power8", | ||
543 | .oprofile_type = PPC_OPROFILE_INVALID, | ||
544 | .cpu_setup = __setup_cpu_power8, | ||
545 | .cpu_restore = __restore_cpu_power8, | ||
546 | .flush_tlb = __flush_tlb_power8, | ||
547 | .machine_check_early = __machine_check_early_realmode_p8, | ||
548 | .platform = "power8", | ||
549 | }, | ||
530 | { /* Power8 */ | 550 | { /* Power8 */ |
531 | .pvr_mask = 0xffff0000, | 551 | .pvr_mask = 0xffff0000, |
532 | .pvr_value = 0x004d0000, | 552 | .pvr_value = 0x004d0000, |
diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c index 658e89d2025b..db2b482af658 100644 --- a/arch/powerpc/kernel/rtas_flash.c +++ b/arch/powerpc/kernel/rtas_flash.c | |||
@@ -611,17 +611,19 @@ static void rtas_flash_firmware(int reboot_type) | |||
611 | for (f = flist; f; f = next) { | 611 | for (f = flist; f; f = next) { |
612 | /* Translate data addrs to absolute */ | 612 | /* Translate data addrs to absolute */ |
613 | for (i = 0; i < f->num_blocks; i++) { | 613 | for (i = 0; i < f->num_blocks; i++) { |
614 | f->blocks[i].data = (char *)__pa(f->blocks[i].data); | 614 | f->blocks[i].data = (char *)cpu_to_be64(__pa(f->blocks[i].data)); |
615 | image_size += f->blocks[i].length; | 615 | image_size += f->blocks[i].length; |
616 | f->blocks[i].length = cpu_to_be64(f->blocks[i].length); | ||
616 | } | 617 | } |
617 | next = f->next; | 618 | next = f->next; |
618 | /* Don't translate NULL pointer for last entry */ | 619 | /* Don't translate NULL pointer for last entry */ |
619 | if (f->next) | 620 | if (f->next) |
620 | f->next = (struct flash_block_list *)__pa(f->next); | 621 | f->next = (struct flash_block_list *)cpu_to_be64(__pa(f->next)); |
621 | else | 622 | else |
622 | f->next = NULL; | 623 | f->next = NULL; |
623 | /* make num_blocks into the version/length field */ | 624 | /* make num_blocks into the version/length field */ |
624 | f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16); | 625 | f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16); |
626 | f->num_blocks = cpu_to_be64(f->num_blocks); | ||
625 | } | 627 | } |
626 | 628 | ||
627 | printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size); | 629 | printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size); |
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 80561074078d..68468d695f12 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
@@ -1562,7 +1562,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf, | |||
1562 | goto out; | 1562 | goto out; |
1563 | } | 1563 | } |
1564 | if (!rma_setup && is_vrma_hpte(v)) { | 1564 | if (!rma_setup && is_vrma_hpte(v)) { |
1565 | unsigned long psize = hpte_page_size(v, r); | 1565 | unsigned long psize = hpte_base_page_size(v, r); |
1566 | unsigned long senc = slb_pgsize_encoding(psize); | 1566 | unsigned long senc = slb_pgsize_encoding(psize); |
1567 | unsigned long lpcr; | 1567 | unsigned long lpcr; |
1568 | 1568 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c index 6e6224318c36..5a24d3c2b6b8 100644 --- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c +++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | |||
@@ -814,13 +814,10 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v, | |||
814 | r = hpte[i+1]; | 814 | r = hpte[i+1]; |
815 | 815 | ||
816 | /* | 816 | /* |
817 | * Check the HPTE again, including large page size | 817 | * Check the HPTE again, including base page size |
818 | * Since we don't currently allow any MPSS (mixed | ||
819 | * page-size segment) page sizes, it is sufficient | ||
820 | * to check against the actual page size. | ||
821 | */ | 818 | */ |
822 | if ((v & valid) && (v & mask) == val && | 819 | if ((v & valid) && (v & mask) == val && |
823 | hpte_page_size(v, r) == (1ul << pshift)) | 820 | hpte_base_page_size(v, r) == (1ul << pshift)) |
824 | /* Return with the HPTE still locked */ | 821 | /* Return with the HPTE still locked */ |
825 | return (hash << 3) + (i >> 1); | 822 | return (hash << 3) + (i >> 1); |
826 | 823 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 868347ef09fd..558a67df8126 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -48,7 +48,7 @@ | |||
48 | * | 48 | * |
49 | * LR = return address to continue at after eventually re-enabling MMU | 49 | * LR = return address to continue at after eventually re-enabling MMU |
50 | */ | 50 | */ |
51 | _GLOBAL(kvmppc_hv_entry_trampoline) | 51 | _GLOBAL_TOC(kvmppc_hv_entry_trampoline) |
52 | mflr r0 | 52 | mflr r0 |
53 | std r0, PPC_LR_STKOFF(r1) | 53 | std r0, PPC_LR_STKOFF(r1) |
54 | stdu r1, -112(r1) | 54 | stdu r1, -112(r1) |
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S index e2c29e381dc7..d044b8b7c69d 100644 --- a/arch/powerpc/kvm/book3s_interrupts.S +++ b/arch/powerpc/kvm/book3s_interrupts.S | |||
@@ -25,7 +25,11 @@ | |||
25 | #include <asm/exception-64s.h> | 25 | #include <asm/exception-64s.h> |
26 | 26 | ||
27 | #if defined(CONFIG_PPC_BOOK3S_64) | 27 | #if defined(CONFIG_PPC_BOOK3S_64) |
28 | #if defined(_CALL_ELF) && _CALL_ELF == 2 | ||
29 | #define FUNC(name) name | ||
30 | #else | ||
28 | #define FUNC(name) GLUE(.,name) | 31 | #define FUNC(name) GLUE(.,name) |
32 | #endif | ||
29 | #define GET_SHADOW_VCPU(reg) addi reg, r13, PACA_SVCPU | 33 | #define GET_SHADOW_VCPU(reg) addi reg, r13, PACA_SVCPU |
30 | 34 | ||
31 | #elif defined(CONFIG_PPC_BOOK3S_32) | 35 | #elif defined(CONFIG_PPC_BOOK3S_32) |
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S index 9eec675220e6..16c4d88ba27d 100644 --- a/arch/powerpc/kvm/book3s_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_rmhandlers.S | |||
@@ -36,7 +36,11 @@ | |||
36 | 36 | ||
37 | #if defined(CONFIG_PPC_BOOK3S_64) | 37 | #if defined(CONFIG_PPC_BOOK3S_64) |
38 | 38 | ||
39 | #if defined(_CALL_ELF) && _CALL_ELF == 2 | ||
40 | #define FUNC(name) name | ||
41 | #else | ||
39 | #define FUNC(name) GLUE(.,name) | 42 | #define FUNC(name) GLUE(.,name) |
43 | #endif | ||
40 | 44 | ||
41 | #elif defined(CONFIG_PPC_BOOK3S_32) | 45 | #elif defined(CONFIG_PPC_BOOK3S_32) |
42 | 46 | ||
@@ -146,7 +150,7 @@ kvmppc_handler_skip_ins: | |||
146 | * On entry, r4 contains the guest shadow MSR | 150 | * On entry, r4 contains the guest shadow MSR |
147 | * MSR.EE has to be 0 when calling this function | 151 | * MSR.EE has to be 0 when calling this function |
148 | */ | 152 | */ |
149 | _GLOBAL(kvmppc_entry_trampoline) | 153 | _GLOBAL_TOC(kvmppc_entry_trampoline) |
150 | mfmsr r5 | 154 | mfmsr r5 |
151 | LOAD_REG_ADDR(r7, kvmppc_handler_trampoline_enter) | 155 | LOAD_REG_ADDR(r7, kvmppc_handler_trampoline_enter) |
152 | toreal(r7) | 156 | toreal(r7) |
diff --git a/arch/powerpc/kvm/book3s_rtas.c b/arch/powerpc/kvm/book3s_rtas.c index edb14ba992b3..ef27fbd5d9c5 100644 --- a/arch/powerpc/kvm/book3s_rtas.c +++ b/arch/powerpc/kvm/book3s_rtas.c | |||
@@ -23,20 +23,20 @@ static void kvm_rtas_set_xive(struct kvm_vcpu *vcpu, struct rtas_args *args) | |||
23 | u32 irq, server, priority; | 23 | u32 irq, server, priority; |
24 | int rc; | 24 | int rc; |
25 | 25 | ||
26 | if (args->nargs != 3 || args->nret != 1) { | 26 | if (be32_to_cpu(args->nargs) != 3 || be32_to_cpu(args->nret) != 1) { |
27 | rc = -3; | 27 | rc = -3; |
28 | goto out; | 28 | goto out; |
29 | } | 29 | } |
30 | 30 | ||
31 | irq = args->args[0]; | 31 | irq = be32_to_cpu(args->args[0]); |
32 | server = args->args[1]; | 32 | server = be32_to_cpu(args->args[1]); |
33 | priority = args->args[2]; | 33 | priority = be32_to_cpu(args->args[2]); |
34 | 34 | ||
35 | rc = kvmppc_xics_set_xive(vcpu->kvm, irq, server, priority); | 35 | rc = kvmppc_xics_set_xive(vcpu->kvm, irq, server, priority); |
36 | if (rc) | 36 | if (rc) |
37 | rc = -3; | 37 | rc = -3; |
38 | out: | 38 | out: |
39 | args->rets[0] = rc; | 39 | args->rets[0] = cpu_to_be32(rc); |
40 | } | 40 | } |
41 | 41 | ||
42 | static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args) | 42 | static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args) |
@@ -44,12 +44,12 @@ static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args) | |||
44 | u32 irq, server, priority; | 44 | u32 irq, server, priority; |
45 | int rc; | 45 | int rc; |
46 | 46 | ||
47 | if (args->nargs != 1 || args->nret != 3) { | 47 | if (be32_to_cpu(args->nargs) != 1 || be32_to_cpu(args->nret) != 3) { |
48 | rc = -3; | 48 | rc = -3; |
49 | goto out; | 49 | goto out; |
50 | } | 50 | } |
51 | 51 | ||
52 | irq = args->args[0]; | 52 | irq = be32_to_cpu(args->args[0]); |
53 | 53 | ||
54 | server = priority = 0; | 54 | server = priority = 0; |
55 | rc = kvmppc_xics_get_xive(vcpu->kvm, irq, &server, &priority); | 55 | rc = kvmppc_xics_get_xive(vcpu->kvm, irq, &server, &priority); |
@@ -58,10 +58,10 @@ static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args) | |||
58 | goto out; | 58 | goto out; |
59 | } | 59 | } |
60 | 60 | ||
61 | args->rets[1] = server; | 61 | args->rets[1] = cpu_to_be32(server); |
62 | args->rets[2] = priority; | 62 | args->rets[2] = cpu_to_be32(priority); |
63 | out: | 63 | out: |
64 | args->rets[0] = rc; | 64 | args->rets[0] = cpu_to_be32(rc); |
65 | } | 65 | } |
66 | 66 | ||
67 | static void kvm_rtas_int_off(struct kvm_vcpu *vcpu, struct rtas_args *args) | 67 | static void kvm_rtas_int_off(struct kvm_vcpu *vcpu, struct rtas_args *args) |
@@ -69,18 +69,18 @@ static void kvm_rtas_int_off(struct kvm_vcpu *vcpu, struct rtas_args *args) | |||
69 | u32 irq; | 69 | u32 irq; |
70 | int rc; | 70 | int rc; |
71 | 71 | ||
72 | if (args->nargs != 1 || args->nret != 1) { | 72 | if (be32_to_cpu(args->nargs) != 1 || be32_to_cpu(args->nret) != 1) { |
73 | rc = -3; | 73 | rc = -3; |
74 | goto out; | 74 | goto out; |
75 | } | 75 | } |
76 | 76 | ||
77 | irq = args->args[0]; | 77 | irq = be32_to_cpu(args->args[0]); |
78 | 78 | ||
79 | rc = kvmppc_xics_int_off(vcpu->kvm, irq); | 79 | rc = kvmppc_xics_int_off(vcpu->kvm, irq); |
80 | if (rc) | 80 | if (rc) |
81 | rc = -3; | 81 | rc = -3; |
82 | out: | 82 | out: |
83 | args->rets[0] = rc; | 83 | args->rets[0] = cpu_to_be32(rc); |
84 | } | 84 | } |
85 | 85 | ||
86 | static void kvm_rtas_int_on(struct kvm_vcpu *vcpu, struct rtas_args *args) | 86 | static void kvm_rtas_int_on(struct kvm_vcpu *vcpu, struct rtas_args *args) |
@@ -88,18 +88,18 @@ static void kvm_rtas_int_on(struct kvm_vcpu *vcpu, struct rtas_args *args) | |||
88 | u32 irq; | 88 | u32 irq; |
89 | int rc; | 89 | int rc; |
90 | 90 | ||
91 | if (args->nargs != 1 || args->nret != 1) { | 91 | if (be32_to_cpu(args->nargs) != 1 || be32_to_cpu(args->nret) != 1) { |
92 | rc = -3; | 92 | rc = -3; |
93 | goto out; | 93 | goto out; |
94 | } | 94 | } |
95 | 95 | ||
96 | irq = args->args[0]; | 96 | irq = be32_to_cpu(args->args[0]); |
97 | 97 | ||
98 | rc = kvmppc_xics_int_on(vcpu->kvm, irq); | 98 | rc = kvmppc_xics_int_on(vcpu->kvm, irq); |
99 | if (rc) | 99 | if (rc) |
100 | rc = -3; | 100 | rc = -3; |
101 | out: | 101 | out: |
102 | args->rets[0] = rc; | 102 | args->rets[0] = cpu_to_be32(rc); |
103 | } | 103 | } |
104 | #endif /* CONFIG_KVM_XICS */ | 104 | #endif /* CONFIG_KVM_XICS */ |
105 | 105 | ||
@@ -205,32 +205,6 @@ int kvm_vm_ioctl_rtas_define_token(struct kvm *kvm, void __user *argp) | |||
205 | return rc; | 205 | return rc; |
206 | } | 206 | } |
207 | 207 | ||
208 | static void kvmppc_rtas_swap_endian_in(struct rtas_args *args) | ||
209 | { | ||
210 | #ifdef __LITTLE_ENDIAN__ | ||
211 | int i; | ||
212 | |||
213 | args->token = be32_to_cpu(args->token); | ||
214 | args->nargs = be32_to_cpu(args->nargs); | ||
215 | args->nret = be32_to_cpu(args->nret); | ||
216 | for (i = 0; i < args->nargs; i++) | ||
217 | args->args[i] = be32_to_cpu(args->args[i]); | ||
218 | #endif | ||
219 | } | ||
220 | |||
221 | static void kvmppc_rtas_swap_endian_out(struct rtas_args *args) | ||
222 | { | ||
223 | #ifdef __LITTLE_ENDIAN__ | ||
224 | int i; | ||
225 | |||
226 | for (i = 0; i < args->nret; i++) | ||
227 | args->args[i] = cpu_to_be32(args->args[i]); | ||
228 | args->token = cpu_to_be32(args->token); | ||
229 | args->nargs = cpu_to_be32(args->nargs); | ||
230 | args->nret = cpu_to_be32(args->nret); | ||
231 | #endif | ||
232 | } | ||
233 | |||
234 | int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) | 208 | int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) |
235 | { | 209 | { |
236 | struct rtas_token_definition *d; | 210 | struct rtas_token_definition *d; |
@@ -249,8 +223,6 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) | |||
249 | if (rc) | 223 | if (rc) |
250 | goto fail; | 224 | goto fail; |
251 | 225 | ||
252 | kvmppc_rtas_swap_endian_in(&args); | ||
253 | |||
254 | /* | 226 | /* |
255 | * args->rets is a pointer into args->args. Now that we've | 227 | * args->rets is a pointer into args->args. Now that we've |
256 | * copied args we need to fix it up to point into our copy, | 228 | * copied args we need to fix it up to point into our copy, |
@@ -258,13 +230,13 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) | |||
258 | * value so we can restore it on the way out. | 230 | * value so we can restore it on the way out. |
259 | */ | 231 | */ |
260 | orig_rets = args.rets; | 232 | orig_rets = args.rets; |
261 | args.rets = &args.args[args.nargs]; | 233 | args.rets = &args.args[be32_to_cpu(args.nargs)]; |
262 | 234 | ||
263 | mutex_lock(&vcpu->kvm->lock); | 235 | mutex_lock(&vcpu->kvm->lock); |
264 | 236 | ||
265 | rc = -ENOENT; | 237 | rc = -ENOENT; |
266 | list_for_each_entry(d, &vcpu->kvm->arch.rtas_tokens, list) { | 238 | list_for_each_entry(d, &vcpu->kvm->arch.rtas_tokens, list) { |
267 | if (d->token == args.token) { | 239 | if (d->token == be32_to_cpu(args.token)) { |
268 | d->handler->handler(vcpu, &args); | 240 | d->handler->handler(vcpu, &args); |
269 | rc = 0; | 241 | rc = 0; |
270 | break; | 242 | break; |
@@ -275,7 +247,6 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) | |||
275 | 247 | ||
276 | if (rc == 0) { | 248 | if (rc == 0) { |
277 | args.rets = orig_rets; | 249 | args.rets = orig_rets; |
278 | kvmppc_rtas_swap_endian_out(&args); | ||
279 | rc = kvm_write_guest(vcpu->kvm, args_phys, &args, sizeof(args)); | 250 | rc = kvm_write_guest(vcpu->kvm, args_phys, &args, sizeof(args)); |
280 | if (rc) | 251 | if (rc) |
281 | goto fail; | 252 | goto fail; |
diff --git a/arch/powerpc/kvm/e500_mmu_host.c b/arch/powerpc/kvm/e500_mmu_host.c index dd2cc03f406f..86903d3f5a03 100644 --- a/arch/powerpc/kvm/e500_mmu_host.c +++ b/arch/powerpc/kvm/e500_mmu_host.c | |||
@@ -473,7 +473,8 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500, | |||
473 | if (printk_ratelimit()) | 473 | if (printk_ratelimit()) |
474 | pr_err("%s: pte not present: gfn %lx, pfn %lx\n", | 474 | pr_err("%s: pte not present: gfn %lx, pfn %lx\n", |
475 | __func__, (long)gfn, pfn); | 475 | __func__, (long)gfn, pfn); |
476 | return -EINVAL; | 476 | ret = -EINVAL; |
477 | goto out; | ||
477 | } | 478 | } |
478 | kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg); | 479 | kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg); |
479 | 480 | ||
diff --git a/arch/powerpc/lib/mem_64.S b/arch/powerpc/lib/mem_64.S index 0738f96befbf..43435c6892fb 100644 --- a/arch/powerpc/lib/mem_64.S +++ b/arch/powerpc/lib/mem_64.S | |||
@@ -77,7 +77,7 @@ _GLOBAL(memset) | |||
77 | stb r4,0(r6) | 77 | stb r4,0(r6) |
78 | blr | 78 | blr |
79 | 79 | ||
80 | _GLOBAL(memmove) | 80 | _GLOBAL_TOC(memmove) |
81 | cmplw 0,r3,r4 | 81 | cmplw 0,r3,r4 |
82 | bgt backwards_memcpy | 82 | bgt backwards_memcpy |
83 | b memcpy | 83 | b memcpy |
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 412dd46dd0b7..5c09f365c842 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c | |||
@@ -1198,7 +1198,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1198 | sh = regs->gpr[rb] & 0x3f; | 1198 | sh = regs->gpr[rb] & 0x3f; |
1199 | ival = (signed int) regs->gpr[rd]; | 1199 | ival = (signed int) regs->gpr[rd]; |
1200 | regs->gpr[ra] = ival >> (sh < 32 ? sh : 31); | 1200 | regs->gpr[ra] = ival >> (sh < 32 ? sh : 31); |
1201 | if (ival < 0 && (sh >= 32 || (ival & ((1 << sh) - 1)) != 0)) | 1201 | if (ival < 0 && (sh >= 32 || (ival & ((1ul << sh) - 1)) != 0)) |
1202 | regs->xer |= XER_CA; | 1202 | regs->xer |= XER_CA; |
1203 | else | 1203 | else |
1204 | regs->xer &= ~XER_CA; | 1204 | regs->xer &= ~XER_CA; |
@@ -1208,7 +1208,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1208 | sh = rb; | 1208 | sh = rb; |
1209 | ival = (signed int) regs->gpr[rd]; | 1209 | ival = (signed int) regs->gpr[rd]; |
1210 | regs->gpr[ra] = ival >> sh; | 1210 | regs->gpr[ra] = ival >> sh; |
1211 | if (ival < 0 && (ival & ((1 << sh) - 1)) != 0) | 1211 | if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0) |
1212 | regs->xer |= XER_CA; | 1212 | regs->xer |= XER_CA; |
1213 | else | 1213 | else |
1214 | regs->xer &= ~XER_CA; | 1214 | regs->xer &= ~XER_CA; |
@@ -1216,7 +1216,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1216 | 1216 | ||
1217 | #ifdef __powerpc64__ | 1217 | #ifdef __powerpc64__ |
1218 | case 27: /* sld */ | 1218 | case 27: /* sld */ |
1219 | sh = regs->gpr[rd] & 0x7f; | 1219 | sh = regs->gpr[rb] & 0x7f; |
1220 | if (sh < 64) | 1220 | if (sh < 64) |
1221 | regs->gpr[ra] = regs->gpr[rd] << sh; | 1221 | regs->gpr[ra] = regs->gpr[rd] << sh; |
1222 | else | 1222 | else |
@@ -1235,7 +1235,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1235 | sh = regs->gpr[rb] & 0x7f; | 1235 | sh = regs->gpr[rb] & 0x7f; |
1236 | ival = (signed long int) regs->gpr[rd]; | 1236 | ival = (signed long int) regs->gpr[rd]; |
1237 | regs->gpr[ra] = ival >> (sh < 64 ? sh : 63); | 1237 | regs->gpr[ra] = ival >> (sh < 64 ? sh : 63); |
1238 | if (ival < 0 && (sh >= 64 || (ival & ((1 << sh) - 1)) != 0)) | 1238 | if (ival < 0 && (sh >= 64 || (ival & ((1ul << sh) - 1)) != 0)) |
1239 | regs->xer |= XER_CA; | 1239 | regs->xer |= XER_CA; |
1240 | else | 1240 | else |
1241 | regs->xer &= ~XER_CA; | 1241 | regs->xer &= ~XER_CA; |
@@ -1246,7 +1246,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1246 | sh = rb | ((instr & 2) << 4); | 1246 | sh = rb | ((instr & 2) << 4); |
1247 | ival = (signed long int) regs->gpr[rd]; | 1247 | ival = (signed long int) regs->gpr[rd]; |
1248 | regs->gpr[ra] = ival >> sh; | 1248 | regs->gpr[ra] = ival >> sh; |
1249 | if (ival < 0 && (ival & ((1 << sh) - 1)) != 0) | 1249 | if (ival < 0 && (ival & ((1ul << sh) - 1)) != 0) |
1250 | regs->xer |= XER_CA; | 1250 | regs->xer |= XER_CA; |
1251 | else | 1251 | else |
1252 | regs->xer &= ~XER_CA; | 1252 | regs->xer &= ~XER_CA; |
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 6b0641c3f03f..fe52db2eea6a 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
@@ -1307,6 +1307,9 @@ static void power_pmu_enable(struct pmu *pmu) | |||
1307 | out_enable: | 1307 | out_enable: |
1308 | pmao_restore_workaround(ebb); | 1308 | pmao_restore_workaround(ebb); |
1309 | 1309 | ||
1310 | if (ppmu->flags & PPMU_ARCH_207S) | ||
1311 | mtspr(SPRN_MMCR2, 0); | ||
1312 | |||
1310 | mmcr0 = ebb_switch_in(ebb, cpuhw->mmcr[0]); | 1313 | mmcr0 = ebb_switch_in(ebb, cpuhw->mmcr[0]); |
1311 | 1314 | ||
1312 | mb(); | 1315 | mb(); |
@@ -1315,9 +1318,6 @@ static void power_pmu_enable(struct pmu *pmu) | |||
1315 | 1318 | ||
1316 | write_mmcr0(cpuhw, mmcr0); | 1319 | write_mmcr0(cpuhw, mmcr0); |
1317 | 1320 | ||
1318 | if (ppmu->flags & PPMU_ARCH_207S) | ||
1319 | mtspr(SPRN_MMCR2, 0); | ||
1320 | |||
1321 | /* | 1321 | /* |
1322 | * Enable instruction sampling if necessary | 1322 | * Enable instruction sampling if necessary |
1323 | */ | 1323 | */ |
diff --git a/arch/powerpc/platforms/powernv/opal-elog.c b/arch/powerpc/platforms/powernv/opal-elog.c index 10268c41d830..0ad533b617f7 100644 --- a/arch/powerpc/platforms/powernv/opal-elog.c +++ b/arch/powerpc/platforms/powernv/opal-elog.c | |||
@@ -249,7 +249,7 @@ static void elog_work_fn(struct work_struct *work) | |||
249 | 249 | ||
250 | rc = opal_get_elog_size(&id, &size, &type); | 250 | rc = opal_get_elog_size(&id, &size, &type); |
251 | if (rc != OPAL_SUCCESS) { | 251 | if (rc != OPAL_SUCCESS) { |
252 | pr_err("ELOG: Opal log read failed\n"); | 252 | pr_err("ELOG: OPAL log info read failed\n"); |
253 | return; | 253 | return; |
254 | } | 254 | } |
255 | 255 | ||
@@ -257,7 +257,7 @@ static void elog_work_fn(struct work_struct *work) | |||
257 | log_id = be64_to_cpu(id); | 257 | log_id = be64_to_cpu(id); |
258 | elog_type = be64_to_cpu(type); | 258 | elog_type = be64_to_cpu(type); |
259 | 259 | ||
260 | BUG_ON(elog_size > OPAL_MAX_ERRLOG_SIZE); | 260 | WARN_ON(elog_size > OPAL_MAX_ERRLOG_SIZE); |
261 | 261 | ||
262 | if (elog_size >= OPAL_MAX_ERRLOG_SIZE) | 262 | if (elog_size >= OPAL_MAX_ERRLOG_SIZE) |
263 | elog_size = OPAL_MAX_ERRLOG_SIZE; | 263 | elog_size = OPAL_MAX_ERRLOG_SIZE; |
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c index 022b38e6a80b..2d0b4d68a40a 100644 --- a/arch/powerpc/platforms/pseries/dlpar.c +++ b/arch/powerpc/platforms/pseries/dlpar.c | |||
@@ -86,6 +86,7 @@ static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa, | |||
86 | } | 86 | } |
87 | 87 | ||
88 | of_node_set_flag(dn, OF_DYNAMIC); | 88 | of_node_set_flag(dn, OF_DYNAMIC); |
89 | of_node_init(dn); | ||
89 | 90 | ||
90 | return dn; | 91 | return dn; |
91 | } | 92 | } |
diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c index 0435bb65d0aa..1c0a60d98867 100644 --- a/arch/powerpc/platforms/pseries/reconfig.c +++ b/arch/powerpc/platforms/pseries/reconfig.c | |||
@@ -69,6 +69,7 @@ static int pSeries_reconfig_add_node(const char *path, struct property *proplist | |||
69 | 69 | ||
70 | np->properties = proplist; | 70 | np->properties = proplist; |
71 | of_node_set_flag(np, OF_DYNAMIC); | 71 | of_node_set_flag(np, OF_DYNAMIC); |
72 | of_node_init(np); | ||
72 | 73 | ||
73 | np->parent = derive_parent(path); | 74 | np->parent = derive_parent(path); |
74 | if (IS_ERR(np->parent)) { | 75 | if (IS_ERR(np->parent)) { |
diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h index df38c70cd59e..18ea9e3f8142 100644 --- a/arch/s390/include/asm/switch_to.h +++ b/arch/s390/include/asm/switch_to.h | |||
@@ -51,8 +51,8 @@ static inline int restore_fp_ctl(u32 *fpc) | |||
51 | return 0; | 51 | return 0; |
52 | 52 | ||
53 | asm volatile( | 53 | asm volatile( |
54 | "0: lfpc %1\n" | 54 | " lfpc %1\n" |
55 | " la %0,0\n" | 55 | "0: la %0,0\n" |
56 | "1:\n" | 56 | "1:\n" |
57 | EX_TABLE(0b,1b) | 57 | EX_TABLE(0b,1b) |
58 | : "=d" (rc) : "Q" (*fpc), "0" (-EINVAL)); | 58 | : "=d" (rc) : "Q" (*fpc), "0" (-EINVAL)); |
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S index 7ba7d6784510..e88d35d74950 100644 --- a/arch/s390/kernel/head.S +++ b/arch/s390/kernel/head.S | |||
@@ -437,11 +437,11 @@ ENTRY(startup_kdump) | |||
437 | 437 | ||
438 | #if defined(CONFIG_64BIT) | 438 | #if defined(CONFIG_64BIT) |
439 | #if defined(CONFIG_MARCH_ZEC12) | 439 | #if defined(CONFIG_MARCH_ZEC12) |
440 | .long 3, 0xc100efea, 0xf46ce800, 0x00400000 | 440 | .long 3, 0xc100eff2, 0xf46ce800, 0x00400000 |
441 | #elif defined(CONFIG_MARCH_Z196) | 441 | #elif defined(CONFIG_MARCH_Z196) |
442 | .long 2, 0xc100efea, 0xf46c0000 | 442 | .long 2, 0xc100eff2, 0xf46c0000 |
443 | #elif defined(CONFIG_MARCH_Z10) | 443 | #elif defined(CONFIG_MARCH_Z10) |
444 | .long 2, 0xc100efea, 0xf0680000 | 444 | .long 2, 0xc100eff2, 0xf0680000 |
445 | #elif defined(CONFIG_MARCH_Z9_109) | 445 | #elif defined(CONFIG_MARCH_Z9_109) |
446 | .long 1, 0xc100efc2 | 446 | .long 1, 0xc100efc2 |
447 | #elif defined(CONFIG_MARCH_Z990) | 447 | #elif defined(CONFIG_MARCH_Z990) |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 2d716734b5b1..5dc7ad9e2fbf 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
@@ -334,9 +334,14 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) | |||
334 | unsigned long mask = PSW_MASK_USER; | 334 | unsigned long mask = PSW_MASK_USER; |
335 | 335 | ||
336 | mask |= is_ri_task(child) ? PSW_MASK_RI : 0; | 336 | mask |= is_ri_task(child) ? PSW_MASK_RI : 0; |
337 | if ((data & ~mask) != PSW_USER_BITS) | 337 | if ((data ^ PSW_USER_BITS) & ~mask) |
338 | /* Invalid psw mask. */ | ||
339 | return -EINVAL; | ||
340 | if ((data & PSW_MASK_ASC) == PSW_ASC_HOME) | ||
341 | /* Invalid address-space-control bits */ | ||
338 | return -EINVAL; | 342 | return -EINVAL; |
339 | if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)) | 343 | if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)) |
344 | /* Invalid addressing mode bits */ | ||
340 | return -EINVAL; | 345 | return -EINVAL; |
341 | } | 346 | } |
342 | *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; | 347 | *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; |
@@ -672,9 +677,12 @@ static int __poke_user_compat(struct task_struct *child, | |||
672 | 677 | ||
673 | mask |= is_ri_task(child) ? PSW32_MASK_RI : 0; | 678 | mask |= is_ri_task(child) ? PSW32_MASK_RI : 0; |
674 | /* Build a 64 bit psw mask from 31 bit mask. */ | 679 | /* Build a 64 bit psw mask from 31 bit mask. */ |
675 | if ((tmp & ~mask) != PSW32_USER_BITS) | 680 | if ((tmp ^ PSW32_USER_BITS) & ~mask) |
676 | /* Invalid psw mask. */ | 681 | /* Invalid psw mask. */ |
677 | return -EINVAL; | 682 | return -EINVAL; |
683 | if ((data & PSW32_MASK_ASC) == PSW32_ASC_HOME) | ||
684 | /* Invalid address-space-control bits */ | ||
685 | return -EINVAL; | ||
678 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 686 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | |
679 | (regs->psw.mask & PSW_MASK_BA) | | 687 | (regs->psw.mask & PSW_MASK_BA) | |
680 | (__u64)(tmp & mask) << 32; | 688 | (__u64)(tmp & mask) << 32; |
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 9ddc51eeb8d6..30de42730b2f 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c | |||
@@ -48,13 +48,10 @@ | |||
48 | static LIST_HEAD(zpci_list); | 48 | static LIST_HEAD(zpci_list); |
49 | static DEFINE_SPINLOCK(zpci_list_lock); | 49 | static DEFINE_SPINLOCK(zpci_list_lock); |
50 | 50 | ||
51 | static void zpci_enable_irq(struct irq_data *data); | ||
52 | static void zpci_disable_irq(struct irq_data *data); | ||
53 | |||
54 | static struct irq_chip zpci_irq_chip = { | 51 | static struct irq_chip zpci_irq_chip = { |
55 | .name = "zPCI", | 52 | .name = "zPCI", |
56 | .irq_unmask = zpci_enable_irq, | 53 | .irq_unmask = unmask_msi_irq, |
57 | .irq_mask = zpci_disable_irq, | 54 | .irq_mask = mask_msi_irq, |
58 | }; | 55 | }; |
59 | 56 | ||
60 | static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES); | 57 | static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES); |
@@ -244,43 +241,6 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len) | |||
244 | return rc; | 241 | return rc; |
245 | } | 242 | } |
246 | 243 | ||
247 | static int zpci_msi_set_mask_bits(struct msi_desc *msi, u32 mask, u32 flag) | ||
248 | { | ||
249 | int offset, pos; | ||
250 | u32 mask_bits; | ||
251 | |||
252 | if (msi->msi_attrib.is_msix) { | ||
253 | offset = msi->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + | ||
254 | PCI_MSIX_ENTRY_VECTOR_CTRL; | ||
255 | msi->masked = readl(msi->mask_base + offset); | ||
256 | writel(flag, msi->mask_base + offset); | ||
257 | } else if (msi->msi_attrib.maskbit) { | ||
258 | pos = (long) msi->mask_base; | ||
259 | pci_read_config_dword(msi->dev, pos, &mask_bits); | ||
260 | mask_bits &= ~(mask); | ||
261 | mask_bits |= flag & mask; | ||
262 | pci_write_config_dword(msi->dev, pos, mask_bits); | ||
263 | } else | ||
264 | return 0; | ||
265 | |||
266 | msi->msi_attrib.maskbit = !!flag; | ||
267 | return 1; | ||
268 | } | ||
269 | |||
270 | static void zpci_enable_irq(struct irq_data *data) | ||
271 | { | ||
272 | struct msi_desc *msi = irq_get_msi_desc(data->irq); | ||
273 | |||
274 | zpci_msi_set_mask_bits(msi, 1, 0); | ||
275 | } | ||
276 | |||
277 | static void zpci_disable_irq(struct irq_data *data) | ||
278 | { | ||
279 | struct msi_desc *msi = irq_get_msi_desc(data->irq); | ||
280 | |||
281 | zpci_msi_set_mask_bits(msi, 1, 1); | ||
282 | } | ||
283 | |||
284 | void pcibios_fixup_bus(struct pci_bus *bus) | 244 | void pcibios_fixup_bus(struct pci_bus *bus) |
285 | { | 245 | { |
286 | } | 246 | } |
@@ -487,7 +447,10 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev) | |||
487 | 447 | ||
488 | /* Release MSI interrupts */ | 448 | /* Release MSI interrupts */ |
489 | list_for_each_entry(msi, &pdev->msi_list, list) { | 449 | list_for_each_entry(msi, &pdev->msi_list, list) { |
490 | zpci_msi_set_mask_bits(msi, 1, 1); | 450 | if (msi->msi_attrib.is_msix) |
451 | default_msix_mask_irq(msi, 1); | ||
452 | else | ||
453 | default_msi_mask_irq(msi, 1, 1); | ||
491 | irq_set_msi_desc(msi->irq, NULL); | 454 | irq_set_msi_desc(msi->irq, NULL); |
492 | irq_free_desc(msi->irq); | 455 | irq_free_desc(msi->irq); |
493 | msi->msg.address_lo = 0; | 456 | msi->msg.address_lo = 0; |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index d4d16e4be07c..bf5b3f5f4962 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -32,7 +32,8 @@ endif | |||
32 | 32 | ||
33 | cflags-$(CONFIG_CPU_SH2) := $(call cc-option,-m2,) | 33 | cflags-$(CONFIG_CPU_SH2) := $(call cc-option,-m2,) |
34 | cflags-$(CONFIG_CPU_SH2A) += $(call cc-option,-m2a,) \ | 34 | cflags-$(CONFIG_CPU_SH2A) += $(call cc-option,-m2a,) \ |
35 | $(call cc-option,-m2a-nofpu,) | 35 | $(call cc-option,-m2a-nofpu,) \ |
36 | $(call cc-option,-m4-nofpu,) | ||
36 | cflags-$(CONFIG_CPU_SH3) := $(call cc-option,-m3,) | 37 | cflags-$(CONFIG_CPU_SH3) := $(call cc-option,-m3,) |
37 | cflags-$(CONFIG_CPU_SH4) := $(call cc-option,-m4,) \ | 38 | cflags-$(CONFIG_CPU_SH4) := $(call cc-option,-m4,) \ |
38 | $(call cc-option,-mno-implicit-fp,-m4-nofpu) | 39 | $(call cc-option,-mno-implicit-fp,-m4-nofpu) |
diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile index 9ff423678cbc..eaee14637d93 100644 --- a/arch/sparc/Makefile +++ b/arch/sparc/Makefile | |||
@@ -68,6 +68,9 @@ all: zImage | |||
68 | image zImage uImage tftpboot.img vmlinux.aout: vmlinux | 68 | image zImage uImage tftpboot.img vmlinux.aout: vmlinux |
69 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ | 69 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ |
70 | 70 | ||
71 | install: | ||
72 | $(Q)$(MAKE) $(build)=$(boot) $@ | ||
73 | |||
71 | archclean: | 74 | archclean: |
72 | $(Q)$(MAKE) $(clean)=$(boot) | 75 | $(Q)$(MAKE) $(clean)=$(boot) |
73 | 76 | ||
diff --git a/arch/sparc/boot/Makefile b/arch/sparc/boot/Makefile index 6e63afb128d9..6a4ceae5ec67 100644 --- a/arch/sparc/boot/Makefile +++ b/arch/sparc/boot/Makefile | |||
@@ -69,3 +69,7 @@ $(obj)/image: vmlinux FORCE | |||
69 | $(obj)/tftpboot.img: $(obj)/image $(obj)/piggyback System.map $(ROOT_IMG) FORCE | 69 | $(obj)/tftpboot.img: $(obj)/image $(obj)/piggyback System.map $(ROOT_IMG) FORCE |
70 | $(call if_changed,elftoaout) | 70 | $(call if_changed,elftoaout) |
71 | $(call if_changed,piggy) | 71 | $(call if_changed,piggy) |
72 | |||
73 | install: | ||
74 | sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(obj)/zImage \ | ||
75 | System.map "$(INSTALL_PATH)" | ||
diff --git a/arch/sparc/boot/install.sh b/arch/sparc/boot/install.sh new file mode 100644 index 000000000000..b32851eae693 --- /dev/null +++ b/arch/sparc/boot/install.sh | |||
@@ -0,0 +1,50 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # This file is subject to the terms and conditions of the GNU General Public | ||
4 | # License. See the file "COPYING" in the main directory of this archive | ||
5 | # for more details. | ||
6 | # | ||
7 | # Copyright (C) 1995 by Linus Torvalds | ||
8 | # | ||
9 | # Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin | ||
10 | # | ||
11 | # "make install" script for SPARC architecture | ||
12 | # | ||
13 | # Arguments: | ||
14 | # $1 - kernel version | ||
15 | # $2 - kernel image file | ||
16 | # $3 - kernel map file | ||
17 | # $4 - default install path (blank if root directory) | ||
18 | # | ||
19 | |||
20 | verify () { | ||
21 | if [ ! -f "$1" ]; then | ||
22 | echo "" 1>&2 | ||
23 | echo " *** Missing file: $1" 1>&2 | ||
24 | echo ' *** You need to run "make" before "make install".' 1>&2 | ||
25 | echo "" 1>&2 | ||
26 | exit 1 | ||
27 | fi | ||
28 | } | ||
29 | |||
30 | # Make sure the files actually exist | ||
31 | verify "$2" | ||
32 | verify "$3" | ||
33 | |||
34 | # User may have a custom install script | ||
35 | |||
36 | if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi | ||
37 | if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi | ||
38 | |||
39 | # Default install - same as make zlilo | ||
40 | |||
41 | if [ -f $4/vmlinuz ]; then | ||
42 | mv $4/vmlinuz $4/vmlinuz.old | ||
43 | fi | ||
44 | |||
45 | if [ -f $4/System.map ]; then | ||
46 | mv $4/System.map $4/System.old | ||
47 | fi | ||
48 | |||
49 | cat $2 > $4/vmlinuz | ||
50 | cp $3 $4/System.map | ||
diff --git a/arch/sparc/include/asm/tlbflush_64.h b/arch/sparc/include/asm/tlbflush_64.h index 816d8202fa0a..dea1cfa2122b 100644 --- a/arch/sparc/include/asm/tlbflush_64.h +++ b/arch/sparc/include/asm/tlbflush_64.h | |||
@@ -34,6 +34,8 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
34 | { | 34 | { |
35 | } | 35 | } |
36 | 36 | ||
37 | void flush_tlb_kernel_range(unsigned long start, unsigned long end); | ||
38 | |||
37 | #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE | 39 | #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE |
38 | 40 | ||
39 | void flush_tlb_pending(void); | 41 | void flush_tlb_pending(void); |
@@ -48,11 +50,6 @@ void __flush_tlb_kernel_range(unsigned long start, unsigned long end); | |||
48 | 50 | ||
49 | #ifndef CONFIG_SMP | 51 | #ifndef CONFIG_SMP |
50 | 52 | ||
51 | #define flush_tlb_kernel_range(start,end) \ | ||
52 | do { flush_tsb_kernel_range(start,end); \ | ||
53 | __flush_tlb_kernel_range(start,end); \ | ||
54 | } while (0) | ||
55 | |||
56 | static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr) | 53 | static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr) |
57 | { | 54 | { |
58 | __flush_tlb_page(CTX_HWBITS(mm->context), vaddr); | 55 | __flush_tlb_page(CTX_HWBITS(mm->context), vaddr); |
@@ -63,11 +60,6 @@ static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vad | |||
63 | void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); | 60 | void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); |
64 | void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr); | 61 | void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr); |
65 | 62 | ||
66 | #define flush_tlb_kernel_range(start, end) \ | ||
67 | do { flush_tsb_kernel_range(start,end); \ | ||
68 | smp_flush_tlb_kernel_range(start, end); \ | ||
69 | } while (0) | ||
70 | |||
71 | #define global_flush_tlb_page(mm, vaddr) \ | 63 | #define global_flush_tlb_page(mm, vaddr) \ |
72 | smp_flush_tlb_page(mm, vaddr) | 64 | smp_flush_tlb_page(mm, vaddr) |
73 | 65 | ||
diff --git a/arch/sparc/include/uapi/asm/unistd.h b/arch/sparc/include/uapi/asm/unistd.h index b73274fb961a..42f2bca1d338 100644 --- a/arch/sparc/include/uapi/asm/unistd.h +++ b/arch/sparc/include/uapi/asm/unistd.h | |||
@@ -410,8 +410,9 @@ | |||
410 | #define __NR_finit_module 342 | 410 | #define __NR_finit_module 342 |
411 | #define __NR_sched_setattr 343 | 411 | #define __NR_sched_setattr 343 |
412 | #define __NR_sched_getattr 344 | 412 | #define __NR_sched_getattr 344 |
413 | #define __NR_renameat2 345 | ||
413 | 414 | ||
414 | #define NR_syscalls 345 | 415 | #define NR_syscalls 346 |
415 | 416 | ||
416 | /* Bitmask values returned from kern_features system call. */ | 417 | /* Bitmask values returned from kern_features system call. */ |
417 | #define KERN_FEATURE_MIXED_MODE_STACK 0x00000001 | 418 | #define KERN_FEATURE_MIXED_MODE_STACK 0x00000001 |
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index e01d75d40329..66dacd56bb10 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c | |||
@@ -1336,7 +1336,7 @@ int ldc_connect(struct ldc_channel *lp) | |||
1336 | if (!(lp->flags & LDC_FLAG_ALLOCED_QUEUES) || | 1336 | if (!(lp->flags & LDC_FLAG_ALLOCED_QUEUES) || |
1337 | !(lp->flags & LDC_FLAG_REGISTERED_QUEUES) || | 1337 | !(lp->flags & LDC_FLAG_REGISTERED_QUEUES) || |
1338 | lp->hs_state != LDC_HS_OPEN) | 1338 | lp->hs_state != LDC_HS_OPEN) |
1339 | err = -EINVAL; | 1339 | err = ((lp->hs_state > LDC_HS_OPEN) ? 0 : -EINVAL); |
1340 | else | 1340 | else |
1341 | err = start_handshake(lp); | 1341 | err = start_handshake(lp); |
1342 | 1342 | ||
diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index d066eb18650c..f834224208ed 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S | |||
@@ -48,6 +48,7 @@ SIGN1(sys32_futex, compat_sys_futex, %o1) | |||
48 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) | 48 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) |
49 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) | 49 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) |
50 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) | 50 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) |
51 | SIGN2(sys32_renameat2, sys_renameat2, %o0, %o2) | ||
51 | 52 | ||
52 | .globl sys32_mmap2 | 53 | .globl sys32_mmap2 |
53 | sys32_mmap2: | 54 | sys32_mmap2: |
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 151ace8766cc..85fe9b1087cd 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S | |||
@@ -86,3 +86,4 @@ sys_call_table: | |||
86 | /*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime | 86 | /*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime |
87 | /*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev | 87 | /*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev |
88 | /*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr | 88 | /*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr |
89 | /*345*/ .long sys_renameat2 | ||
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 4bd4e2bb26cf..33ecba2826ea 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
@@ -87,6 +87,7 @@ sys_call_table32: | |||
87 | /*330*/ .word compat_sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime | 87 | /*330*/ .word compat_sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime |
88 | .word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev | 88 | .word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev |
89 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr | 89 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr |
90 | .word sys32_renameat2 | ||
90 | 91 | ||
91 | #endif /* CONFIG_COMPAT */ | 92 | #endif /* CONFIG_COMPAT */ |
92 | 93 | ||
@@ -165,3 +166,4 @@ sys_call_table: | |||
165 | /*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime | 166 | /*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime |
166 | .word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev | 167 | .word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev |
167 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr | 168 | /*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr |
169 | .word sys_renameat2 | ||
diff --git a/arch/sparc/math-emu/math_32.c b/arch/sparc/math-emu/math_32.c index aa4d55b0bdf0..5ce8f2f64604 100644 --- a/arch/sparc/math-emu/math_32.c +++ b/arch/sparc/math-emu/math_32.c | |||
@@ -499,7 +499,7 @@ static int do_one_mathemu(u32 insn, unsigned long *pfsr, unsigned long *fregs) | |||
499 | case 0: fsr = *pfsr; | 499 | case 0: fsr = *pfsr; |
500 | if (IR == -1) IR = 2; | 500 | if (IR == -1) IR = 2; |
501 | /* fcc is always fcc0 */ | 501 | /* fcc is always fcc0 */ |
502 | fsr &= ~0xc00; fsr |= (IR << 10); break; | 502 | fsr &= ~0xc00; fsr |= (IR << 10); |
503 | *pfsr = fsr; | 503 | *pfsr = fsr; |
504 | break; | 504 | break; |
505 | case 1: rd->s = IR; break; | 505 | case 1: rd->s = IR; break; |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 9f4f532e2627..cdc9f145e3c3 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -352,6 +352,10 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t * | |||
352 | 352 | ||
353 | mm = vma->vm_mm; | 353 | mm = vma->vm_mm; |
354 | 354 | ||
355 | /* Don't insert a non-valid PTE into the TSB, we'll deadlock. */ | ||
356 | if (!pte_accessible(mm, pte)) | ||
357 | return; | ||
358 | |||
355 | spin_lock_irqsave(&mm->context.lock, flags); | 359 | spin_lock_irqsave(&mm->context.lock, flags); |
356 | 360 | ||
357 | #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) | 361 | #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) |
@@ -2620,6 +2624,10 @@ void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr, | |||
2620 | 2624 | ||
2621 | pte = pmd_val(entry); | 2625 | pte = pmd_val(entry); |
2622 | 2626 | ||
2627 | /* Don't insert a non-valid PMD into the TSB, we'll deadlock. */ | ||
2628 | if (!(pte & _PAGE_VALID)) | ||
2629 | return; | ||
2630 | |||
2623 | /* We are fabricating 8MB pages using 4MB real hw pages. */ | 2631 | /* We are fabricating 8MB pages using 4MB real hw pages. */ |
2624 | pte |= (addr & (1UL << REAL_HPAGE_SHIFT)); | 2632 | pte |= (addr & (1UL << REAL_HPAGE_SHIFT)); |
2625 | 2633 | ||
@@ -2764,3 +2772,27 @@ static int __init report_memory(void) | |||
2764 | return 0; | 2772 | return 0; |
2765 | } | 2773 | } |
2766 | device_initcall(report_memory); | 2774 | device_initcall(report_memory); |
2775 | |||
2776 | #ifdef CONFIG_SMP | ||
2777 | #define do_flush_tlb_kernel_range smp_flush_tlb_kernel_range | ||
2778 | #else | ||
2779 | #define do_flush_tlb_kernel_range __flush_tlb_kernel_range | ||
2780 | #endif | ||
2781 | |||
2782 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | ||
2783 | { | ||
2784 | if (start < HI_OBP_ADDRESS && end > LOW_OBP_ADDRESS) { | ||
2785 | if (start < LOW_OBP_ADDRESS) { | ||
2786 | flush_tsb_kernel_range(start, LOW_OBP_ADDRESS); | ||
2787 | do_flush_tlb_kernel_range(start, LOW_OBP_ADDRESS); | ||
2788 | } | ||
2789 | if (end > HI_OBP_ADDRESS) { | ||
2790 | flush_tsb_kernel_range(end, HI_OBP_ADDRESS); | ||
2791 | do_flush_tlb_kernel_range(end, HI_OBP_ADDRESS); | ||
2792 | } | ||
2793 | } else { | ||
2794 | flush_tsb_kernel_range(start, end); | ||
2795 | do_flush_tlb_kernel_range(start, end); | ||
2796 | } | ||
2797 | } | ||
2798 | >>>>>>> c78f77e20d2ba5d4d5e478e85a6fb42556893e2d | ||
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index a80029035bf2..f9e4fdd3b877 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -370,6 +370,17 @@ static void init_intel(struct cpuinfo_x86 *c) | |||
370 | */ | 370 | */ |
371 | detect_extended_topology(c); | 371 | detect_extended_topology(c); |
372 | 372 | ||
373 | if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) { | ||
374 | /* | ||
375 | * let's use the legacy cpuid vector 0x1 and 0x4 for topology | ||
376 | * detection. | ||
377 | */ | ||
378 | c->x86_max_cores = intel_num_cpu_cores(c); | ||
379 | #ifdef CONFIG_X86_32 | ||
380 | detect_ht(c); | ||
381 | #endif | ||
382 | } | ||
383 | |||
373 | l2 = init_intel_cacheinfo(c); | 384 | l2 = init_intel_cacheinfo(c); |
374 | if (c->cpuid_level > 9) { | 385 | if (c->cpuid_level > 9) { |
375 | unsigned eax = cpuid_eax(10); | 386 | unsigned eax = cpuid_eax(10); |
@@ -438,17 +449,6 @@ static void init_intel(struct cpuinfo_x86 *c) | |||
438 | set_cpu_cap(c, X86_FEATURE_P3); | 449 | set_cpu_cap(c, X86_FEATURE_P3); |
439 | #endif | 450 | #endif |
440 | 451 | ||
441 | if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) { | ||
442 | /* | ||
443 | * let's use the legacy cpuid vector 0x1 and 0x4 for topology | ||
444 | * detection. | ||
445 | */ | ||
446 | c->x86_max_cores = intel_num_cpu_cores(c); | ||
447 | #ifdef CONFIG_X86_32 | ||
448 | detect_ht(c); | ||
449 | #endif | ||
450 | } | ||
451 | |||
452 | /* Work around errata */ | 452 | /* Work around errata */ |
453 | srat_detect_node(c); | 453 | srat_detect_node(c); |
454 | 454 | ||
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index a952e9c85b6f..9c8f7394c612 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
@@ -730,6 +730,18 @@ unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
730 | #endif | 730 | #endif |
731 | } | 731 | } |
732 | 732 | ||
733 | #ifdef CONFIG_X86_HT | ||
734 | /* | ||
735 | * If cpu_llc_id is not yet set, this means cpuid_level < 4 which in | ||
736 | * turns means that the only possibility is SMT (as indicated in | ||
737 | * cpuid1). Since cpuid2 doesn't specify shared caches, and we know | ||
738 | * that SMT shares all caches, we can unconditionally set cpu_llc_id to | ||
739 | * c->phys_proc_id. | ||
740 | */ | ||
741 | if (per_cpu(cpu_llc_id, cpu) == BAD_APICID) | ||
742 | per_cpu(cpu_llc_id, cpu) = c->phys_proc_id; | ||
743 | #endif | ||
744 | |||
733 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); | 745 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); |
734 | 746 | ||
735 | return l2; | 747 | return l2; |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index bb92f38153b2..9a79c8dbd8e8 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -2451,6 +2451,12 @@ static __init int mcheck_init_device(void) | |||
2451 | for_each_online_cpu(i) { | 2451 | for_each_online_cpu(i) { |
2452 | err = mce_device_create(i); | 2452 | err = mce_device_create(i); |
2453 | if (err) { | 2453 | if (err) { |
2454 | /* | ||
2455 | * Register notifier anyway (and do not unreg it) so | ||
2456 | * that we don't leave undeleted timers, see notifier | ||
2457 | * callback above. | ||
2458 | */ | ||
2459 | __register_hotcpu_notifier(&mce_cpu_notifier); | ||
2454 | cpu_notifier_register_done(); | 2460 | cpu_notifier_register_done(); |
2455 | goto err_device_create; | 2461 | goto err_device_create; |
2456 | } | 2462 | } |
@@ -2471,10 +2477,6 @@ static __init int mcheck_init_device(void) | |||
2471 | err_register: | 2477 | err_register: |
2472 | unregister_syscore_ops(&mce_syscore_ops); | 2478 | unregister_syscore_ops(&mce_syscore_ops); |
2473 | 2479 | ||
2474 | cpu_notifier_register_begin(); | ||
2475 | __unregister_hotcpu_notifier(&mce_cpu_notifier); | ||
2476 | cpu_notifier_register_done(); | ||
2477 | |||
2478 | err_device_create: | 2480 | err_device_create: |
2479 | /* | 2481 | /* |
2480 | * We didn't keep track of which devices were created above, but | 2482 | * We didn't keep track of which devices were created above, but |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 2bdfbff8a4f6..2879ecdaac43 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -118,6 +118,9 @@ static int x86_pmu_extra_regs(u64 config, struct perf_event *event) | |||
118 | continue; | 118 | continue; |
119 | if (event->attr.config1 & ~er->valid_mask) | 119 | if (event->attr.config1 & ~er->valid_mask) |
120 | return -EINVAL; | 120 | return -EINVAL; |
121 | /* Check if the extra msrs can be safely accessed*/ | ||
122 | if (!er->extra_msr_access) | ||
123 | return -ENXIO; | ||
121 | 124 | ||
122 | reg->idx = er->idx; | 125 | reg->idx = er->idx; |
123 | reg->config = event->attr.config1; | 126 | reg->config = event->attr.config1; |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 3b2f9bdd974b..8ade93111e03 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
@@ -295,14 +295,16 @@ struct extra_reg { | |||
295 | u64 config_mask; | 295 | u64 config_mask; |
296 | u64 valid_mask; | 296 | u64 valid_mask; |
297 | int idx; /* per_xxx->regs[] reg index */ | 297 | int idx; /* per_xxx->regs[] reg index */ |
298 | bool extra_msr_access; | ||
298 | }; | 299 | }; |
299 | 300 | ||
300 | #define EVENT_EXTRA_REG(e, ms, m, vm, i) { \ | 301 | #define EVENT_EXTRA_REG(e, ms, m, vm, i) { \ |
301 | .event = (e), \ | 302 | .event = (e), \ |
302 | .msr = (ms), \ | 303 | .msr = (ms), \ |
303 | .config_mask = (m), \ | 304 | .config_mask = (m), \ |
304 | .valid_mask = (vm), \ | 305 | .valid_mask = (vm), \ |
305 | .idx = EXTRA_REG_##i, \ | 306 | .idx = EXTRA_REG_##i, \ |
307 | .extra_msr_access = true, \ | ||
306 | } | 308 | } |
307 | 309 | ||
308 | #define INTEL_EVENT_EXTRA_REG(event, msr, vm, idx) \ | 310 | #define INTEL_EVENT_EXTRA_REG(event, msr, vm, idx) \ |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 07846d738bdb..2502d0d9d246 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
@@ -2182,6 +2182,41 @@ static void intel_snb_check_microcode(void) | |||
2182 | } | 2182 | } |
2183 | } | 2183 | } |
2184 | 2184 | ||
2185 | /* | ||
2186 | * Under certain circumstances, access certain MSR may cause #GP. | ||
2187 | * The function tests if the input MSR can be safely accessed. | ||
2188 | */ | ||
2189 | static bool check_msr(unsigned long msr, u64 mask) | ||
2190 | { | ||
2191 | u64 val_old, val_new, val_tmp; | ||
2192 | |||
2193 | /* | ||
2194 | * Read the current value, change it and read it back to see if it | ||
2195 | * matches, this is needed to detect certain hardware emulators | ||
2196 | * (qemu/kvm) that don't trap on the MSR access and always return 0s. | ||
2197 | */ | ||
2198 | if (rdmsrl_safe(msr, &val_old)) | ||
2199 | return false; | ||
2200 | |||
2201 | /* | ||
2202 | * Only change the bits which can be updated by wrmsrl. | ||
2203 | */ | ||
2204 | val_tmp = val_old ^ mask; | ||
2205 | if (wrmsrl_safe(msr, val_tmp) || | ||
2206 | rdmsrl_safe(msr, &val_new)) | ||
2207 | return false; | ||
2208 | |||
2209 | if (val_new != val_tmp) | ||
2210 | return false; | ||
2211 | |||
2212 | /* Here it's sure that the MSR can be safely accessed. | ||
2213 | * Restore the old value and return. | ||
2214 | */ | ||
2215 | wrmsrl(msr, val_old); | ||
2216 | |||
2217 | return true; | ||
2218 | } | ||
2219 | |||
2185 | static __init void intel_sandybridge_quirk(void) | 2220 | static __init void intel_sandybridge_quirk(void) |
2186 | { | 2221 | { |
2187 | x86_pmu.check_microcode = intel_snb_check_microcode; | 2222 | x86_pmu.check_microcode = intel_snb_check_microcode; |
@@ -2271,7 +2306,8 @@ __init int intel_pmu_init(void) | |||
2271 | union cpuid10_ebx ebx; | 2306 | union cpuid10_ebx ebx; |
2272 | struct event_constraint *c; | 2307 | struct event_constraint *c; |
2273 | unsigned int unused; | 2308 | unsigned int unused; |
2274 | int version; | 2309 | struct extra_reg *er; |
2310 | int version, i; | ||
2275 | 2311 | ||
2276 | if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) { | 2312 | if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) { |
2277 | switch (boot_cpu_data.x86) { | 2313 | switch (boot_cpu_data.x86) { |
@@ -2474,6 +2510,9 @@ __init int intel_pmu_init(void) | |||
2474 | case 62: /* IvyBridge EP */ | 2510 | case 62: /* IvyBridge EP */ |
2475 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, | 2511 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, |
2476 | sizeof(hw_cache_event_ids)); | 2512 | sizeof(hw_cache_event_ids)); |
2513 | /* dTLB-load-misses on IVB is different than SNB */ | ||
2514 | hw_cache_event_ids[C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = 0x8108; /* DTLB_LOAD_MISSES.DEMAND_LD_MISS_CAUSES_A_WALK */ | ||
2515 | |||
2477 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, | 2516 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, |
2478 | sizeof(hw_cache_extra_regs)); | 2517 | sizeof(hw_cache_extra_regs)); |
2479 | 2518 | ||
@@ -2574,6 +2613,34 @@ __init int intel_pmu_init(void) | |||
2574 | } | 2613 | } |
2575 | } | 2614 | } |
2576 | 2615 | ||
2616 | /* | ||
2617 | * Access LBR MSR may cause #GP under certain circumstances. | ||
2618 | * E.g. KVM doesn't support LBR MSR | ||
2619 | * Check all LBT MSR here. | ||
2620 | * Disable LBR access if any LBR MSRs can not be accessed. | ||
2621 | */ | ||
2622 | if (x86_pmu.lbr_nr && !check_msr(x86_pmu.lbr_tos, 0x3UL)) | ||
2623 | x86_pmu.lbr_nr = 0; | ||
2624 | for (i = 0; i < x86_pmu.lbr_nr; i++) { | ||
2625 | if (!(check_msr(x86_pmu.lbr_from + i, 0xffffUL) && | ||
2626 | check_msr(x86_pmu.lbr_to + i, 0xffffUL))) | ||
2627 | x86_pmu.lbr_nr = 0; | ||
2628 | } | ||
2629 | |||
2630 | /* | ||
2631 | * Access extra MSR may cause #GP under certain circumstances. | ||
2632 | * E.g. KVM doesn't support offcore event | ||
2633 | * Check all extra_regs here. | ||
2634 | */ | ||
2635 | if (x86_pmu.extra_regs) { | ||
2636 | for (er = x86_pmu.extra_regs; er->msr; er++) { | ||
2637 | er->extra_msr_access = check_msr(er->msr, 0x1ffUL); | ||
2638 | /* Disable LBR select mapping */ | ||
2639 | if ((er->idx == EXTRA_REG_LBR) && !er->extra_msr_access) | ||
2640 | x86_pmu.lbr_sel_map = NULL; | ||
2641 | } | ||
2642 | } | ||
2643 | |||
2577 | /* Support full width counters using alternative MSR range */ | 2644 | /* Support full width counters using alternative MSR range */ |
2578 | if (x86_pmu.intel_cap.full_width_write) { | 2645 | if (x86_pmu.intel_cap.full_width_write) { |
2579 | x86_pmu.max_period = x86_pmu.cntval_mask; | 2646 | x86_pmu.max_period = x86_pmu.cntval_mask; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index 980970cb744d..696ade311ded 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
@@ -311,9 +311,11 @@ static int alloc_bts_buffer(int cpu) | |||
311 | if (!x86_pmu.bts) | 311 | if (!x86_pmu.bts) |
312 | return 0; | 312 | return 0; |
313 | 313 | ||
314 | buffer = kzalloc_node(BTS_BUFFER_SIZE, GFP_KERNEL, node); | 314 | buffer = kzalloc_node(BTS_BUFFER_SIZE, GFP_KERNEL | __GFP_NOWARN, node); |
315 | if (unlikely(!buffer)) | 315 | if (unlikely(!buffer)) { |
316 | WARN_ONCE(1, "%s: BTS buffer allocation failure\n", __func__); | ||
316 | return -ENOMEM; | 317 | return -ENOMEM; |
318 | } | ||
317 | 319 | ||
318 | max = BTS_BUFFER_SIZE / BTS_RECORD_SIZE; | 320 | max = BTS_BUFFER_SIZE / BTS_RECORD_SIZE; |
319 | thresh = max / 16; | 321 | thresh = max / 16; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 65bbbea38b9c..ae6552a0701f 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c | |||
@@ -550,16 +550,16 @@ static struct extra_reg snbep_uncore_cbox_extra_regs[] = { | |||
550 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), | 550 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), |
551 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), | 551 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), |
552 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), | 552 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), |
553 | SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0xc), | 553 | SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0xa), |
554 | SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0xc), | 554 | SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0xa), |
555 | SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x2), | 555 | SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x2), |
556 | SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x2), | 556 | SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x2), |
557 | SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x2), | 557 | SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x2), |
558 | SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x2), | 558 | SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x2), |
559 | SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x8), | 559 | SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x8), |
560 | SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x8), | 560 | SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x8), |
561 | SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0xc), | 561 | SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0xa), |
562 | SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0xc), | 562 | SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0xa), |
563 | SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x2), | 563 | SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x2), |
564 | SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x2), | 564 | SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x2), |
565 | SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x2), | 565 | SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x2), |
@@ -1222,6 +1222,7 @@ static struct extra_reg ivt_uncore_cbox_extra_regs[] = { | |||
1222 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | 1222 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, |
1223 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | 1223 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), |
1224 | SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), | 1224 | SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), |
1225 | |||
1225 | SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4), | 1226 | SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4), |
1226 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), | 1227 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), |
1227 | SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc), | 1228 | SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc), |
@@ -1245,7 +1246,7 @@ static struct extra_reg ivt_uncore_cbox_extra_regs[] = { | |||
1245 | SNBEP_CBO_EVENT_EXTRA_REG(0x8335, 0xffff, 0x10), | 1246 | SNBEP_CBO_EVENT_EXTRA_REG(0x8335, 0xffff, 0x10), |
1246 | SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x10), | 1247 | SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x10), |
1247 | SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x10), | 1248 | SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x10), |
1248 | SNBEP_CBO_EVENT_EXTRA_REG(0x2336, 0xffff, 0x10), | 1249 | SNBEP_CBO_EVENT_EXTRA_REG(0x2136, 0xffff, 0x10), |
1249 | SNBEP_CBO_EVENT_EXTRA_REG(0x2336, 0xffff, 0x10), | 1250 | SNBEP_CBO_EVENT_EXTRA_REG(0x2336, 0xffff, 0x10), |
1250 | SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0x18), | 1251 | SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0x18), |
1251 | SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0x18), | 1252 | SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0x18), |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index dbaa23e78b36..0d0c9d4ab6d5 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -425,8 +425,8 @@ sysenter_do_call: | |||
425 | cmpl $(NR_syscalls), %eax | 425 | cmpl $(NR_syscalls), %eax |
426 | jae sysenter_badsys | 426 | jae sysenter_badsys |
427 | call *sys_call_table(,%eax,4) | 427 | call *sys_call_table(,%eax,4) |
428 | movl %eax,PT_EAX(%esp) | ||
429 | sysenter_after_call: | 428 | sysenter_after_call: |
429 | movl %eax,PT_EAX(%esp) | ||
430 | LOCKDEP_SYS_EXIT | 430 | LOCKDEP_SYS_EXIT |
431 | DISABLE_INTERRUPTS(CLBR_ANY) | 431 | DISABLE_INTERRUPTS(CLBR_ANY) |
432 | TRACE_IRQS_OFF | 432 | TRACE_IRQS_OFF |
@@ -502,6 +502,7 @@ ENTRY(system_call) | |||
502 | jae syscall_badsys | 502 | jae syscall_badsys |
503 | syscall_call: | 503 | syscall_call: |
504 | call *sys_call_table(,%eax,4) | 504 | call *sys_call_table(,%eax,4) |
505 | syscall_after_call: | ||
505 | movl %eax,PT_EAX(%esp) # store the return value | 506 | movl %eax,PT_EAX(%esp) # store the return value |
506 | syscall_exit: | 507 | syscall_exit: |
507 | LOCKDEP_SYS_EXIT | 508 | LOCKDEP_SYS_EXIT |
@@ -675,12 +676,12 @@ syscall_fault: | |||
675 | END(syscall_fault) | 676 | END(syscall_fault) |
676 | 677 | ||
677 | syscall_badsys: | 678 | syscall_badsys: |
678 | movl $-ENOSYS,PT_EAX(%esp) | 679 | movl $-ENOSYS,%eax |
679 | jmp syscall_exit | 680 | jmp syscall_after_call |
680 | END(syscall_badsys) | 681 | END(syscall_badsys) |
681 | 682 | ||
682 | sysenter_badsys: | 683 | sysenter_badsys: |
683 | movl $-ENOSYS,PT_EAX(%esp) | 684 | movl $-ENOSYS,%eax |
684 | jmp sysenter_after_call | 685 | jmp sysenter_after_call |
685 | END(syscall_badsys) | 686 | END(syscall_badsys) |
686 | CFI_ENDPROC | 687 | CFI_ENDPROC |
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index 7596df664901..67e6d19ef1be 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c | |||
@@ -574,6 +574,9 @@ int kprobe_int3_handler(struct pt_regs *regs) | |||
574 | struct kprobe *p; | 574 | struct kprobe *p; |
575 | struct kprobe_ctlblk *kcb; | 575 | struct kprobe_ctlblk *kcb; |
576 | 576 | ||
577 | if (user_mode_vm(regs)) | ||
578 | return 0; | ||
579 | |||
577 | addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t)); | 580 | addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t)); |
578 | /* | 581 | /* |
579 | * We don't want to be preempted for the entire | 582 | * We don't want to be preempted for the entire |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index f6449334ec45..ef432f891d30 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -5887,6 +5887,18 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win) | |||
5887 | kvm_x86_ops->set_nmi(vcpu); | 5887 | kvm_x86_ops->set_nmi(vcpu); |
5888 | } | 5888 | } |
5889 | } else if (kvm_cpu_has_injectable_intr(vcpu)) { | 5889 | } else if (kvm_cpu_has_injectable_intr(vcpu)) { |
5890 | /* | ||
5891 | * Because interrupts can be injected asynchronously, we are | ||
5892 | * calling check_nested_events again here to avoid a race condition. | ||
5893 | * See https://lkml.org/lkml/2014/7/2/60 for discussion about this | ||
5894 | * proposal and current concerns. Perhaps we should be setting | ||
5895 | * KVM_REQ_EVENT only on certain events and not unconditionally? | ||
5896 | */ | ||
5897 | if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) { | ||
5898 | r = kvm_x86_ops->check_nested_events(vcpu, req_int_win); | ||
5899 | if (r != 0) | ||
5900 | return r; | ||
5901 | } | ||
5890 | if (kvm_x86_ops->interrupt_allowed(vcpu)) { | 5902 | if (kvm_x86_ops->interrupt_allowed(vcpu)) { |
5891 | kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu), | 5903 | kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu), |
5892 | false); | 5904 | false); |
diff --git a/arch/xtensa/kernel/vectors.S b/arch/xtensa/kernel/vectors.S index f9e1ec346e35..8453e6e39895 100644 --- a/arch/xtensa/kernel/vectors.S +++ b/arch/xtensa/kernel/vectors.S | |||
@@ -376,38 +376,42 @@ _DoubleExceptionVector_WindowOverflow: | |||
376 | beqz a2, 1f # if at start of vector, don't restore | 376 | beqz a2, 1f # if at start of vector, don't restore |
377 | 377 | ||
378 | addi a0, a0, -128 | 378 | addi a0, a0, -128 |
379 | bbsi a0, 8, 1f # don't restore except for overflow 8 and 12 | 379 | bbsi.l a0, 8, 1f # don't restore except for overflow 8 and 12 |
380 | bbsi a0, 7, 2f | 380 | |
381 | /* | ||
382 | * This fixup handler is for the extremely unlikely case where the | ||
383 | * overflow handler's reference thru a0 gets a hardware TLB refill | ||
384 | * that bumps out the (distinct, aliasing) TLB entry that mapped its | ||
385 | * prior references thru a9/a13, and where our reference now thru | ||
386 | * a9/a13 gets a 2nd-level miss exception (not hardware TLB refill). | ||
387 | */ | ||
388 | movi a2, window_overflow_restore_a0_fixup | ||
389 | s32i a2, a3, EXC_TABLE_FIXUP | ||
390 | l32i a2, a3, EXC_TABLE_DOUBLE_SAVE | ||
391 | xsr a3, excsave1 | ||
392 | |||
393 | bbsi.l a0, 7, 2f | ||
381 | 394 | ||
382 | /* | 395 | /* |
383 | * Restore a0 as saved by _WindowOverflow8(). | 396 | * Restore a0 as saved by _WindowOverflow8(). |
384 | * | ||
385 | * FIXME: we really need a fixup handler for this L32E, | ||
386 | * for the extremely unlikely case where the overflow handler's | ||
387 | * reference thru a0 gets a hardware TLB refill that bumps out | ||
388 | * the (distinct, aliasing) TLB entry that mapped its prior | ||
389 | * references thru a9, and where our reference now thru a9 | ||
390 | * gets a 2nd-level miss exception (not hardware TLB refill). | ||
391 | */ | 397 | */ |
392 | 398 | ||
393 | l32e a2, a9, -16 | 399 | l32e a0, a9, -16 |
394 | wsr a2, depc # replace the saved a0 | 400 | wsr a0, depc # replace the saved a0 |
395 | j 1f | 401 | j 3f |
396 | 402 | ||
397 | 2: | 403 | 2: |
398 | /* | 404 | /* |
399 | * Restore a0 as saved by _WindowOverflow12(). | 405 | * Restore a0 as saved by _WindowOverflow12(). |
400 | * | ||
401 | * FIXME: we really need a fixup handler for this L32E, | ||
402 | * for the extremely unlikely case where the overflow handler's | ||
403 | * reference thru a0 gets a hardware TLB refill that bumps out | ||
404 | * the (distinct, aliasing) TLB entry that mapped its prior | ||
405 | * references thru a13, and where our reference now thru a13 | ||
406 | * gets a 2nd-level miss exception (not hardware TLB refill). | ||
407 | */ | 406 | */ |
408 | 407 | ||
409 | l32e a2, a13, -16 | 408 | l32e a0, a13, -16 |
410 | wsr a2, depc # replace the saved a0 | 409 | wsr a0, depc # replace the saved a0 |
410 | 3: | ||
411 | xsr a3, excsave1 | ||
412 | movi a0, 0 | ||
413 | s32i a0, a3, EXC_TABLE_FIXUP | ||
414 | s32i a2, a3, EXC_TABLE_DOUBLE_SAVE | ||
411 | 1: | 415 | 1: |
412 | /* | 416 | /* |
413 | * Restore WindowBase while leaving all address registers restored. | 417 | * Restore WindowBase while leaving all address registers restored. |
@@ -449,6 +453,7 @@ _DoubleExceptionVector_WindowOverflow: | |||
449 | 453 | ||
450 | s32i a0, a2, PT_DEPC | 454 | s32i a0, a2, PT_DEPC |
451 | 455 | ||
456 | _DoubleExceptionVector_handle_exception: | ||
452 | addx4 a0, a0, a3 | 457 | addx4 a0, a0, a3 |
453 | l32i a0, a0, EXC_TABLE_FAST_USER | 458 | l32i a0, a0, EXC_TABLE_FAST_USER |
454 | xsr a3, excsave1 | 459 | xsr a3, excsave1 |
@@ -464,11 +469,120 @@ _DoubleExceptionVector_WindowOverflow: | |||
464 | rotw -3 | 469 | rotw -3 |
465 | j 1b | 470 | j 1b |
466 | 471 | ||
467 | .end literal_prefix | ||
468 | 472 | ||
469 | ENDPROC(_DoubleExceptionVector) | 473 | ENDPROC(_DoubleExceptionVector) |
470 | 474 | ||
471 | /* | 475 | /* |
476 | * Fixup handler for TLB miss in double exception handler for window owerflow. | ||
477 | * We get here with windowbase set to the window that was being spilled and | ||
478 | * a0 trashed. a0 bit 7 determines if this is a call8 (bit clear) or call12 | ||
479 | * (bit set) window. | ||
480 | * | ||
481 | * We do the following here: | ||
482 | * - go to the original window retaining a0 value; | ||
483 | * - set up exception stack to return back to appropriate a0 restore code | ||
484 | * (we'll need to rotate window back and there's no place to save this | ||
485 | * information, use different return address for that); | ||
486 | * - handle the exception; | ||
487 | * - go to the window that was being spilled; | ||
488 | * - set up window_overflow_restore_a0_fixup as a fixup routine; | ||
489 | * - reload a0; | ||
490 | * - restore the original window; | ||
491 | * - reset the default fixup routine; | ||
492 | * - return to user. By the time we get to this fixup handler all information | ||
493 | * about the conditions of the original double exception that happened in | ||
494 | * the window overflow handler is lost, so we just return to userspace to | ||
495 | * retry overflow from start. | ||
496 | * | ||
497 | * a0: value of depc, original value in depc | ||
498 | * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE | ||
499 | * a3: exctable, original value in excsave1 | ||
500 | */ | ||
501 | |||
502 | ENTRY(window_overflow_restore_a0_fixup) | ||
503 | |||
504 | rsr a0, ps | ||
505 | extui a0, a0, PS_OWB_SHIFT, PS_OWB_WIDTH | ||
506 | rsr a2, windowbase | ||
507 | sub a0, a2, a0 | ||
508 | extui a0, a0, 0, 3 | ||
509 | l32i a2, a3, EXC_TABLE_DOUBLE_SAVE | ||
510 | xsr a3, excsave1 | ||
511 | |||
512 | _beqi a0, 1, .Lhandle_1 | ||
513 | _beqi a0, 3, .Lhandle_3 | ||
514 | |||
515 | .macro overflow_fixup_handle_exception_pane n | ||
516 | |||
517 | rsr a0, depc | ||
518 | rotw -\n | ||
519 | |||
520 | xsr a3, excsave1 | ||
521 | wsr a2, depc | ||
522 | l32i a2, a3, EXC_TABLE_KSTK | ||
523 | s32i a0, a2, PT_AREG0 | ||
524 | |||
525 | movi a0, .Lrestore_\n | ||
526 | s32i a0, a2, PT_DEPC | ||
527 | rsr a0, exccause | ||
528 | j _DoubleExceptionVector_handle_exception | ||
529 | |||
530 | .endm | ||
531 | |||
532 | overflow_fixup_handle_exception_pane 2 | ||
533 | .Lhandle_1: | ||
534 | overflow_fixup_handle_exception_pane 1 | ||
535 | .Lhandle_3: | ||
536 | overflow_fixup_handle_exception_pane 3 | ||
537 | |||
538 | .macro overflow_fixup_restore_a0_pane n | ||
539 | |||
540 | rotw \n | ||
541 | /* Need to preserve a0 value here to be able to handle exception | ||
542 | * that may occur on a0 reload from stack. It may occur because | ||
543 | * TLB miss handler may not be atomic and pointer to page table | ||
544 | * may be lost before we get here. There are no free registers, | ||
545 | * so we need to use EXC_TABLE_DOUBLE_SAVE area. | ||
546 | */ | ||
547 | xsr a3, excsave1 | ||
548 | s32i a2, a3, EXC_TABLE_DOUBLE_SAVE | ||
549 | movi a2, window_overflow_restore_a0_fixup | ||
550 | s32i a2, a3, EXC_TABLE_FIXUP | ||
551 | l32i a2, a3, EXC_TABLE_DOUBLE_SAVE | ||
552 | xsr a3, excsave1 | ||
553 | bbsi.l a0, 7, 1f | ||
554 | l32e a0, a9, -16 | ||
555 | j 2f | ||
556 | 1: | ||
557 | l32e a0, a13, -16 | ||
558 | 2: | ||
559 | rotw -\n | ||
560 | |||
561 | .endm | ||
562 | |||
563 | .Lrestore_2: | ||
564 | overflow_fixup_restore_a0_pane 2 | ||
565 | |||
566 | .Lset_default_fixup: | ||
567 | xsr a3, excsave1 | ||
568 | s32i a2, a3, EXC_TABLE_DOUBLE_SAVE | ||
569 | movi a2, 0 | ||
570 | s32i a2, a3, EXC_TABLE_FIXUP | ||
571 | l32i a2, a3, EXC_TABLE_DOUBLE_SAVE | ||
572 | xsr a3, excsave1 | ||
573 | rfe | ||
574 | |||
575 | .Lrestore_1: | ||
576 | overflow_fixup_restore_a0_pane 1 | ||
577 | j .Lset_default_fixup | ||
578 | .Lrestore_3: | ||
579 | overflow_fixup_restore_a0_pane 3 | ||
580 | j .Lset_default_fixup | ||
581 | |||
582 | ENDPROC(window_overflow_restore_a0_fixup) | ||
583 | |||
584 | .end literal_prefix | ||
585 | /* | ||
472 | * Debug interrupt vector | 586 | * Debug interrupt vector |
473 | * | 587 | * |
474 | * There is not much space here, so simply jump to another handler. | 588 | * There is not much space here, so simply jump to another handler. |
diff --git a/arch/xtensa/kernel/vmlinux.lds.S b/arch/xtensa/kernel/vmlinux.lds.S index ee32c0085dff..d16db6df86f8 100644 --- a/arch/xtensa/kernel/vmlinux.lds.S +++ b/arch/xtensa/kernel/vmlinux.lds.S | |||
@@ -269,13 +269,13 @@ SECTIONS | |||
269 | .UserExceptionVector.literal) | 269 | .UserExceptionVector.literal) |
270 | SECTION_VECTOR (_DoubleExceptionVector_literal, | 270 | SECTION_VECTOR (_DoubleExceptionVector_literal, |
271 | .DoubleExceptionVector.literal, | 271 | .DoubleExceptionVector.literal, |
272 | DOUBLEEXC_VECTOR_VADDR - 16, | 272 | DOUBLEEXC_VECTOR_VADDR - 40, |
273 | SIZEOF(.UserExceptionVector.text), | 273 | SIZEOF(.UserExceptionVector.text), |
274 | .UserExceptionVector.text) | 274 | .UserExceptionVector.text) |
275 | SECTION_VECTOR (_DoubleExceptionVector_text, | 275 | SECTION_VECTOR (_DoubleExceptionVector_text, |
276 | .DoubleExceptionVector.text, | 276 | .DoubleExceptionVector.text, |
277 | DOUBLEEXC_VECTOR_VADDR, | 277 | DOUBLEEXC_VECTOR_VADDR, |
278 | 32, | 278 | 40, |
279 | .DoubleExceptionVector.literal) | 279 | .DoubleExceptionVector.literal) |
280 | 280 | ||
281 | . = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3; | 281 | . = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3; |
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c index 4224256bb215..77ed20209ca5 100644 --- a/arch/xtensa/mm/init.c +++ b/arch/xtensa/mm/init.c | |||
@@ -191,7 +191,7 @@ int __init mem_reserve(unsigned long start, unsigned long end, int must_exist) | |||
191 | return -EINVAL; | 191 | return -EINVAL; |
192 | } | 192 | } |
193 | 193 | ||
194 | if (it && start - it->start < bank_sz) { | 194 | if (it && start - it->start <= bank_sz) { |
195 | if (start == it->start) { | 195 | if (start == it->start) { |
196 | if (end - it->start < bank_sz) { | 196 | if (end - it->start < bank_sz) { |
197 | it->start = end; | 197 | it->start = end; |
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index b9f4cc494ece..28d227c5ca77 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
@@ -872,6 +872,13 @@ void blkcg_drain_queue(struct request_queue *q) | |||
872 | { | 872 | { |
873 | lockdep_assert_held(q->queue_lock); | 873 | lockdep_assert_held(q->queue_lock); |
874 | 874 | ||
875 | /* | ||
876 | * @q could be exiting and already have destroyed all blkgs as | ||
877 | * indicated by NULL root_blkg. If so, don't confuse policies. | ||
878 | */ | ||
879 | if (!q->root_blkg) | ||
880 | return; | ||
881 | |||
875 | blk_throtl_drain(q); | 882 | blk_throtl_drain(q); |
876 | } | 883 | } |
877 | 884 | ||
diff --git a/block/blk-tag.c b/block/blk-tag.c index 3f33d8672268..a185b86741e5 100644 --- a/block/blk-tag.c +++ b/block/blk-tag.c | |||
@@ -27,18 +27,15 @@ struct request *blk_queue_find_tag(struct request_queue *q, int tag) | |||
27 | EXPORT_SYMBOL(blk_queue_find_tag); | 27 | EXPORT_SYMBOL(blk_queue_find_tag); |
28 | 28 | ||
29 | /** | 29 | /** |
30 | * __blk_free_tags - release a given set of tag maintenance info | 30 | * blk_free_tags - release a given set of tag maintenance info |
31 | * @bqt: the tag map to free | 31 | * @bqt: the tag map to free |
32 | * | 32 | * |
33 | * Tries to free the specified @bqt. Returns true if it was | 33 | * Drop the reference count on @bqt and frees it when the last reference |
34 | * actually freed and false if there are still references using it | 34 | * is dropped. |
35 | */ | 35 | */ |
36 | static int __blk_free_tags(struct blk_queue_tag *bqt) | 36 | void blk_free_tags(struct blk_queue_tag *bqt) |
37 | { | 37 | { |
38 | int retval; | 38 | if (atomic_dec_and_test(&bqt->refcnt)) { |
39 | |||
40 | retval = atomic_dec_and_test(&bqt->refcnt); | ||
41 | if (retval) { | ||
42 | BUG_ON(find_first_bit(bqt->tag_map, bqt->max_depth) < | 39 | BUG_ON(find_first_bit(bqt->tag_map, bqt->max_depth) < |
43 | bqt->max_depth); | 40 | bqt->max_depth); |
44 | 41 | ||
@@ -50,9 +47,8 @@ static int __blk_free_tags(struct blk_queue_tag *bqt) | |||
50 | 47 | ||
51 | kfree(bqt); | 48 | kfree(bqt); |
52 | } | 49 | } |
53 | |||
54 | return retval; | ||
55 | } | 50 | } |
51 | EXPORT_SYMBOL(blk_free_tags); | ||
56 | 52 | ||
57 | /** | 53 | /** |
58 | * __blk_queue_free_tags - release tag maintenance info | 54 | * __blk_queue_free_tags - release tag maintenance info |
@@ -69,28 +65,13 @@ void __blk_queue_free_tags(struct request_queue *q) | |||
69 | if (!bqt) | 65 | if (!bqt) |
70 | return; | 66 | return; |
71 | 67 | ||
72 | __blk_free_tags(bqt); | 68 | blk_free_tags(bqt); |
73 | 69 | ||
74 | q->queue_tags = NULL; | 70 | q->queue_tags = NULL; |
75 | queue_flag_clear_unlocked(QUEUE_FLAG_QUEUED, q); | 71 | queue_flag_clear_unlocked(QUEUE_FLAG_QUEUED, q); |
76 | } | 72 | } |
77 | 73 | ||
78 | /** | 74 | /** |
79 | * blk_free_tags - release a given set of tag maintenance info | ||
80 | * @bqt: the tag map to free | ||
81 | * | ||
82 | * For externally managed @bqt frees the map. Callers of this | ||
83 | * function must guarantee to have released all the queues that | ||
84 | * might have been using this tag map. | ||
85 | */ | ||
86 | void blk_free_tags(struct blk_queue_tag *bqt) | ||
87 | { | ||
88 | if (unlikely(!__blk_free_tags(bqt))) | ||
89 | BUG(); | ||
90 | } | ||
91 | EXPORT_SYMBOL(blk_free_tags); | ||
92 | |||
93 | /** | ||
94 | * blk_queue_free_tags - release tag maintenance info | 75 | * blk_queue_free_tags - release tag maintenance info |
95 | * @q: the request queue for the device | 76 | * @q: the request queue for the device |
96 | * | 77 | * |
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index fbd5a67cb773..a0926a6094b2 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c | |||
@@ -690,6 +690,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||
690 | case BLKROSET: | 690 | case BLKROSET: |
691 | case BLKDISCARD: | 691 | case BLKDISCARD: |
692 | case BLKSECDISCARD: | 692 | case BLKSECDISCARD: |
693 | case BLKZEROOUT: | ||
693 | /* | 694 | /* |
694 | * the ones below are implemented in blkdev_locked_ioctl, | 695 | * the ones below are implemented in blkdev_locked_ioctl, |
695 | * but we call blkdev_ioctl, which gets the lock for us | 696 | * but we call blkdev_ioctl, which gets the lock for us |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index dae5607e1115..4cd52a4541a9 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -456,6 +456,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
456 | 456 | ||
457 | /* Promise */ | 457 | /* Promise */ |
458 | { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */ | 458 | { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */ |
459 | { PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */ | ||
459 | 460 | ||
460 | /* Asmedia */ | 461 | /* Asmedia */ |
461 | { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */ | 462 | { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */ |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 18d97d5c7d90..677c0c1b03bd 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4787,6 +4787,10 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) | |||
4787 | * ata_qc_new - Request an available ATA command, for queueing | 4787 | * ata_qc_new - Request an available ATA command, for queueing |
4788 | * @ap: target port | 4788 | * @ap: target port |
4789 | * | 4789 | * |
4790 | * Some ATA host controllers may implement a queue depth which is less | ||
4791 | * than ATA_MAX_QUEUE. So we shouldn't allocate a tag which is beyond | ||
4792 | * the hardware limitation. | ||
4793 | * | ||
4790 | * LOCKING: | 4794 | * LOCKING: |
4791 | * None. | 4795 | * None. |
4792 | */ | 4796 | */ |
@@ -4794,14 +4798,15 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) | |||
4794 | static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) | 4798 | static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) |
4795 | { | 4799 | { |
4796 | struct ata_queued_cmd *qc = NULL; | 4800 | struct ata_queued_cmd *qc = NULL; |
4801 | unsigned int max_queue = ap->host->n_tags; | ||
4797 | unsigned int i, tag; | 4802 | unsigned int i, tag; |
4798 | 4803 | ||
4799 | /* no command while frozen */ | 4804 | /* no command while frozen */ |
4800 | if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) | 4805 | if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) |
4801 | return NULL; | 4806 | return NULL; |
4802 | 4807 | ||
4803 | for (i = 0; i < ATA_MAX_QUEUE; i++) { | 4808 | for (i = 0, tag = ap->last_tag + 1; i < max_queue; i++, tag++) { |
4804 | tag = (i + ap->last_tag + 1) % ATA_MAX_QUEUE; | 4809 | tag = tag < max_queue ? tag : 0; |
4805 | 4810 | ||
4806 | /* the last tag is reserved for internal command. */ | 4811 | /* the last tag is reserved for internal command. */ |
4807 | if (tag == ATA_TAG_INTERNAL) | 4812 | if (tag == ATA_TAG_INTERNAL) |
@@ -6088,6 +6093,7 @@ void ata_host_init(struct ata_host *host, struct device *dev, | |||
6088 | { | 6093 | { |
6089 | spin_lock_init(&host->lock); | 6094 | spin_lock_init(&host->lock); |
6090 | mutex_init(&host->eh_mutex); | 6095 | mutex_init(&host->eh_mutex); |
6096 | host->n_tags = ATA_MAX_QUEUE - 1; | ||
6091 | host->dev = dev; | 6097 | host->dev = dev; |
6092 | host->ops = ops; | 6098 | host->ops = ops; |
6093 | } | 6099 | } |
@@ -6169,6 +6175,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) | |||
6169 | { | 6175 | { |
6170 | int i, rc; | 6176 | int i, rc; |
6171 | 6177 | ||
6178 | host->n_tags = clamp(sht->can_queue, 1, ATA_MAX_QUEUE - 1); | ||
6179 | |||
6172 | /* host must have been started */ | 6180 | /* host must have been started */ |
6173 | if (!(host->flags & ATA_HOST_STARTED)) { | 6181 | if (!(host->flags & ATA_HOST_STARTED)) { |
6174 | dev_err(host->dev, "BUG: trying to register unstarted host\n"); | 6182 | dev_err(host->dev, "BUG: trying to register unstarted host\n"); |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 6760fc4e85b8..dad83df555c4 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -1811,7 +1811,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, | |||
1811 | case ATA_DEV_ATA: | 1811 | case ATA_DEV_ATA: |
1812 | if (err & ATA_ICRC) | 1812 | if (err & ATA_ICRC) |
1813 | qc->err_mask |= AC_ERR_ATA_BUS; | 1813 | qc->err_mask |= AC_ERR_ATA_BUS; |
1814 | if (err & ATA_UNC) | 1814 | if (err & (ATA_UNC | ATA_AMNF)) |
1815 | qc->err_mask |= AC_ERR_MEDIA; | 1815 | qc->err_mask |= AC_ERR_MEDIA; |
1816 | if (err & ATA_IDNF) | 1816 | if (err & ATA_IDNF) |
1817 | qc->err_mask |= AC_ERR_INVALID; | 1817 | qc->err_mask |= AC_ERR_INVALID; |
@@ -2556,11 +2556,12 @@ static void ata_eh_link_report(struct ata_link *link) | |||
2556 | } | 2556 | } |
2557 | 2557 | ||
2558 | if (cmd->command != ATA_CMD_PACKET && | 2558 | if (cmd->command != ATA_CMD_PACKET && |
2559 | (res->feature & (ATA_ICRC | ATA_UNC | ATA_IDNF | | 2559 | (res->feature & (ATA_ICRC | ATA_UNC | ATA_AMNF | |
2560 | ATA_ABORTED))) | 2560 | ATA_IDNF | ATA_ABORTED))) |
2561 | ata_dev_err(qc->dev, "error: { %s%s%s%s}\n", | 2561 | ata_dev_err(qc->dev, "error: { %s%s%s%s%s}\n", |
2562 | res->feature & ATA_ICRC ? "ICRC " : "", | 2562 | res->feature & ATA_ICRC ? "ICRC " : "", |
2563 | res->feature & ATA_UNC ? "UNC " : "", | 2563 | res->feature & ATA_UNC ? "UNC " : "", |
2564 | res->feature & ATA_AMNF ? "AMNF " : "", | ||
2564 | res->feature & ATA_IDNF ? "IDNF " : "", | 2565 | res->feature & ATA_IDNF ? "IDNF " : "", |
2565 | res->feature & ATA_ABORTED ? "ABRT " : ""); | 2566 | res->feature & ATA_ABORTED ? "ABRT " : ""); |
2566 | #endif | 2567 | #endif |
diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c index 6ad5c072ce34..4d37c5415fc7 100644 --- a/drivers/ata/pata_ep93xx.c +++ b/drivers/ata/pata_ep93xx.c | |||
@@ -915,7 +915,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev) | |||
915 | struct ep93xx_pata_data *drv_data; | 915 | struct ep93xx_pata_data *drv_data; |
916 | struct ata_host *host; | 916 | struct ata_host *host; |
917 | struct ata_port *ap; | 917 | struct ata_port *ap; |
918 | unsigned int irq; | 918 | int irq; |
919 | struct resource *mem_res; | 919 | struct resource *mem_res; |
920 | void __iomem *ide_base; | 920 | void __iomem *ide_base; |
921 | int err; | 921 | int err; |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 1b35c45c92b7..3f2e16738080 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -544,6 +544,12 @@ void conn_try_outdate_peer_async(struct drbd_connection *connection) | |||
544 | struct task_struct *opa; | 544 | struct task_struct *opa; |
545 | 545 | ||
546 | kref_get(&connection->kref); | 546 | kref_get(&connection->kref); |
547 | /* We may just have force_sig()'ed this thread | ||
548 | * to get it out of some blocking network function. | ||
549 | * Clear signals; otherwise kthread_run(), which internally uses | ||
550 | * wait_on_completion_killable(), will mistake our pending signal | ||
551 | * for a new fatal signal and fail. */ | ||
552 | flush_signals(current); | ||
547 | opa = kthread_run(_try_outdate_peer_async, connection, "drbd_async_h"); | 553 | opa = kthread_run(_try_outdate_peer_async, connection, "drbd_async_h"); |
548 | if (IS_ERR(opa)) { | 554 | if (IS_ERR(opa)) { |
549 | drbd_err(connection, "out of mem, failed to invoke fence-peer helper\n"); | 555 | drbd_err(connection, "out of mem, failed to invoke fence-peer helper\n"); |
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 089e72cd37be..36e54be402df 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c | |||
@@ -622,11 +622,18 @@ static void zram_reset_device(struct zram *zram, bool reset_capacity) | |||
622 | memset(&zram->stats, 0, sizeof(zram->stats)); | 622 | memset(&zram->stats, 0, sizeof(zram->stats)); |
623 | 623 | ||
624 | zram->disksize = 0; | 624 | zram->disksize = 0; |
625 | if (reset_capacity) { | 625 | if (reset_capacity) |
626 | set_capacity(zram->disk, 0); | 626 | set_capacity(zram->disk, 0); |
627 | revalidate_disk(zram->disk); | 627 | |
628 | } | ||
629 | up_write(&zram->init_lock); | 628 | up_write(&zram->init_lock); |
629 | |||
630 | /* | ||
631 | * Revalidate disk out of the init_lock to avoid lockdep splat. | ||
632 | * It's okay because disk's capacity is protected by init_lock | ||
633 | * so that revalidate_disk always sees up-to-date capacity. | ||
634 | */ | ||
635 | if (reset_capacity) | ||
636 | revalidate_disk(zram->disk); | ||
630 | } | 637 | } |
631 | 638 | ||
632 | static ssize_t disksize_store(struct device *dev, | 639 | static ssize_t disksize_store(struct device *dev, |
@@ -666,8 +673,15 @@ static ssize_t disksize_store(struct device *dev, | |||
666 | zram->comp = comp; | 673 | zram->comp = comp; |
667 | zram->disksize = disksize; | 674 | zram->disksize = disksize; |
668 | set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); | 675 | set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); |
669 | revalidate_disk(zram->disk); | ||
670 | up_write(&zram->init_lock); | 676 | up_write(&zram->init_lock); |
677 | |||
678 | /* | ||
679 | * Revalidate disk out of the init_lock to avoid lockdep splat. | ||
680 | * It's okay because disk's capacity is protected by init_lock | ||
681 | * so that revalidate_disk always sees up-to-date capacity. | ||
682 | */ | ||
683 | revalidate_disk(zram->disk); | ||
684 | |||
671 | return len; | 685 | return len; |
672 | 686 | ||
673 | out_destroy_comp: | 687 | out_destroy_comp: |
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 57985410f12f..a66a3217f1d9 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
@@ -336,10 +336,10 @@ static const struct { | |||
336 | QUIRK_CYCLE_TIMER | QUIRK_IR_WAKE}, | 336 | QUIRK_CYCLE_TIMER | QUIRK_IR_WAKE}, |
337 | 337 | ||
338 | {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT6315, 0, | 338 | {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT6315, 0, |
339 | QUIRK_CYCLE_TIMER | QUIRK_NO_MSI}, | 339 | QUIRK_CYCLE_TIMER /* FIXME: necessary? */ | QUIRK_NO_MSI}, |
340 | 340 | ||
341 | {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT6315, PCI_ANY_ID, | 341 | {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT6315, PCI_ANY_ID, |
342 | 0}, | 342 | QUIRK_NO_MSI}, |
343 | 343 | ||
344 | {PCI_VENDOR_ID_VIA, PCI_ANY_ID, PCI_ANY_ID, | 344 | {PCI_VENDOR_ID_VIA, PCI_ANY_ID, PCI_ANY_ID, |
345 | QUIRK_CYCLE_TIMER | QUIRK_NO_MSI}, | 345 | QUIRK_CYCLE_TIMER | QUIRK_NO_MSI}, |
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c index 0c9f803fc1ac..b6ae89ea8811 100644 --- a/drivers/gpio/gpio-rcar.c +++ b/drivers/gpio/gpio-rcar.c | |||
@@ -284,6 +284,7 @@ static int gpio_rcar_irq_domain_map(struct irq_domain *h, unsigned int irq, | |||
284 | 284 | ||
285 | static struct irq_domain_ops gpio_rcar_irq_domain_ops = { | 285 | static struct irq_domain_ops gpio_rcar_irq_domain_ops = { |
286 | .map = gpio_rcar_irq_domain_map, | 286 | .map = gpio_rcar_irq_domain_map, |
287 | .xlate = irq_domain_xlate_twocell, | ||
287 | }; | 288 | }; |
288 | 289 | ||
289 | struct gpio_rcar_info { | 290 | struct gpio_rcar_info { |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index f36126383d26..d893e4da5dce 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1616,22 +1616,6 @@ out: | |||
1616 | return ret; | 1616 | return ret; |
1617 | } | 1617 | } |
1618 | 1618 | ||
1619 | void i915_gem_release_all_mmaps(struct drm_i915_private *dev_priv) | ||
1620 | { | ||
1621 | struct i915_vma *vma; | ||
1622 | |||
1623 | /* | ||
1624 | * Only the global gtt is relevant for gtt memory mappings, so restrict | ||
1625 | * list traversal to objects bound into the global address space. Note | ||
1626 | * that the active list should be empty, but better safe than sorry. | ||
1627 | */ | ||
1628 | WARN_ON(!list_empty(&dev_priv->gtt.base.active_list)); | ||
1629 | list_for_each_entry(vma, &dev_priv->gtt.base.active_list, mm_list) | ||
1630 | i915_gem_release_mmap(vma->obj); | ||
1631 | list_for_each_entry(vma, &dev_priv->gtt.base.inactive_list, mm_list) | ||
1632 | i915_gem_release_mmap(vma->obj); | ||
1633 | } | ||
1634 | |||
1635 | /** | 1619 | /** |
1636 | * i915_gem_release_mmap - remove physical page mappings | 1620 | * i915_gem_release_mmap - remove physical page mappings |
1637 | * @obj: obj in question | 1621 | * @obj: obj in question |
@@ -1657,6 +1641,15 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj) | |||
1657 | obj->fault_mappable = false; | 1641 | obj->fault_mappable = false; |
1658 | } | 1642 | } |
1659 | 1643 | ||
1644 | void | ||
1645 | i915_gem_release_all_mmaps(struct drm_i915_private *dev_priv) | ||
1646 | { | ||
1647 | struct drm_i915_gem_object *obj; | ||
1648 | |||
1649 | list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) | ||
1650 | i915_gem_release_mmap(obj); | ||
1651 | } | ||
1652 | |||
1660 | uint32_t | 1653 | uint32_t |
1661 | i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode) | 1654 | i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode) |
1662 | { | 1655 | { |
diff --git a/drivers/gpu/drm/i915/i915_gem_render_state.c b/drivers/gpu/drm/i915/i915_gem_render_state.c index 3521f998a178..34894b573064 100644 --- a/drivers/gpu/drm/i915/i915_gem_render_state.c +++ b/drivers/gpu/drm/i915/i915_gem_render_state.c | |||
@@ -31,7 +31,7 @@ | |||
31 | struct i915_render_state { | 31 | struct i915_render_state { |
32 | struct drm_i915_gem_object *obj; | 32 | struct drm_i915_gem_object *obj; |
33 | unsigned long ggtt_offset; | 33 | unsigned long ggtt_offset; |
34 | void *batch; | 34 | u32 *batch; |
35 | u32 size; | 35 | u32 size; |
36 | u32 len; | 36 | u32 len; |
37 | }; | 37 | }; |
@@ -80,7 +80,7 @@ free: | |||
80 | 80 | ||
81 | static void render_state_free(struct i915_render_state *so) | 81 | static void render_state_free(struct i915_render_state *so) |
82 | { | 82 | { |
83 | kunmap(so->batch); | 83 | kunmap(kmap_to_page(so->batch)); |
84 | i915_gem_object_ggtt_unpin(so->obj); | 84 | i915_gem_object_ggtt_unpin(so->obj); |
85 | drm_gem_object_unreference(&so->obj->base); | 85 | drm_gem_object_unreference(&so->obj->base); |
86 | kfree(so); | 86 | kfree(so); |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 267f069765ad..c05c84f3f091 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -2845,7 +2845,7 @@ static int semaphore_passed(struct intel_engine_cs *ring) | |||
2845 | { | 2845 | { |
2846 | struct drm_i915_private *dev_priv = ring->dev->dev_private; | 2846 | struct drm_i915_private *dev_priv = ring->dev->dev_private; |
2847 | struct intel_engine_cs *signaller; | 2847 | struct intel_engine_cs *signaller; |
2848 | u32 seqno, ctl; | 2848 | u32 seqno; |
2849 | 2849 | ||
2850 | ring->hangcheck.deadlock++; | 2850 | ring->hangcheck.deadlock++; |
2851 | 2851 | ||
@@ -2857,15 +2857,12 @@ static int semaphore_passed(struct intel_engine_cs *ring) | |||
2857 | if (signaller->hangcheck.deadlock >= I915_NUM_RINGS) | 2857 | if (signaller->hangcheck.deadlock >= I915_NUM_RINGS) |
2858 | return -1; | 2858 | return -1; |
2859 | 2859 | ||
2860 | /* cursory check for an unkickable deadlock */ | ||
2861 | ctl = I915_READ_CTL(signaller); | ||
2862 | if (ctl & RING_WAIT_SEMAPHORE && semaphore_passed(signaller) < 0) | ||
2863 | return -1; | ||
2864 | |||
2865 | if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno)) | 2860 | if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno)) |
2866 | return 1; | 2861 | return 1; |
2867 | 2862 | ||
2868 | if (signaller->hangcheck.deadlock) | 2863 | /* cursory check for an unkickable deadlock */ |
2864 | if (I915_READ_CTL(signaller) & RING_WAIT_SEMAPHORE && | ||
2865 | semaphore_passed(signaller) < 0) | ||
2869 | return -1; | 2866 | return -1; |
2870 | 2867 | ||
2871 | return 0; | 2868 | return 0; |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 0b2471107137..c0ea66192fe0 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -2291,6 +2291,7 @@ static void cik_tiling_mode_table_init(struct radeon_device *rdev) | |||
2291 | gb_tile_moden = 0; | 2291 | gb_tile_moden = 0; |
2292 | break; | 2292 | break; |
2293 | } | 2293 | } |
2294 | rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden; | ||
2294 | WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden); | 2295 | WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden); |
2295 | } | 2296 | } |
2296 | } else if (num_pipe_configs == 8) { | 2297 | } else if (num_pipe_configs == 8) { |
@@ -7376,6 +7377,7 @@ static inline u32 cik_get_ih_wptr(struct radeon_device *rdev) | |||
7376 | tmp = RREG32(IH_RB_CNTL); | 7377 | tmp = RREG32(IH_RB_CNTL); |
7377 | tmp |= IH_WPTR_OVERFLOW_CLEAR; | 7378 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
7378 | WREG32(IH_RB_CNTL, tmp); | 7379 | WREG32(IH_RB_CNTL, tmp); |
7380 | wptr &= ~RB_OVERFLOW; | ||
7379 | } | 7381 | } |
7380 | return (wptr & rdev->ih.ptr_mask); | 7382 | return (wptr & rdev->ih.ptr_mask); |
7381 | } | 7383 | } |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 250bac3935a4..15e4f28015e1 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -4756,6 +4756,7 @@ static u32 evergreen_get_ih_wptr(struct radeon_device *rdev) | |||
4756 | tmp = RREG32(IH_RB_CNTL); | 4756 | tmp = RREG32(IH_RB_CNTL); |
4757 | tmp |= IH_WPTR_OVERFLOW_CLEAR; | 4757 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
4758 | WREG32(IH_RB_CNTL, tmp); | 4758 | WREG32(IH_RB_CNTL, tmp); |
4759 | wptr &= ~RB_OVERFLOW; | ||
4759 | } | 4760 | } |
4760 | return (wptr & rdev->ih.ptr_mask); | 4761 | return (wptr & rdev->ih.ptr_mask); |
4761 | } | 4762 | } |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index c66952d4b00c..3c69f58e46ef 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -3795,6 +3795,7 @@ static u32 r600_get_ih_wptr(struct radeon_device *rdev) | |||
3795 | tmp = RREG32(IH_RB_CNTL); | 3795 | tmp = RREG32(IH_RB_CNTL); |
3796 | tmp |= IH_WPTR_OVERFLOW_CLEAR; | 3796 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
3797 | WREG32(IH_RB_CNTL, tmp); | 3797 | WREG32(IH_RB_CNTL, tmp); |
3798 | wptr &= ~RB_OVERFLOW; | ||
3798 | } | 3799 | } |
3799 | return (wptr & rdev->ih.ptr_mask); | 3800 | return (wptr & rdev->ih.ptr_mask); |
3800 | } | 3801 | } |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index b7204500a9a6..60c47f829122 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -449,6 +449,7 @@ struct radeon_bo_va { | |||
449 | 449 | ||
450 | /* protected by vm mutex */ | 450 | /* protected by vm mutex */ |
451 | struct list_head vm_list; | 451 | struct list_head vm_list; |
452 | struct list_head vm_status; | ||
452 | 453 | ||
453 | /* constant after initialization */ | 454 | /* constant after initialization */ |
454 | struct radeon_vm *vm; | 455 | struct radeon_vm *vm; |
@@ -867,6 +868,9 @@ struct radeon_vm { | |||
867 | struct list_head va; | 868 | struct list_head va; |
868 | unsigned id; | 869 | unsigned id; |
869 | 870 | ||
871 | /* BOs freed, but not yet updated in the PT */ | ||
872 | struct list_head freed; | ||
873 | |||
870 | /* contains the page directory */ | 874 | /* contains the page directory */ |
871 | struct radeon_bo *page_directory; | 875 | struct radeon_bo *page_directory; |
872 | uint64_t pd_gpu_addr; | 876 | uint64_t pd_gpu_addr; |
@@ -875,6 +879,8 @@ struct radeon_vm { | |||
875 | /* array of page tables, one for each page directory entry */ | 879 | /* array of page tables, one for each page directory entry */ |
876 | struct radeon_vm_pt *page_tables; | 880 | struct radeon_vm_pt *page_tables; |
877 | 881 | ||
882 | struct radeon_bo_va *ib_bo_va; | ||
883 | |||
878 | struct mutex mutex; | 884 | struct mutex mutex; |
879 | /* last fence for cs using this vm */ | 885 | /* last fence for cs using this vm */ |
880 | struct radeon_fence *fence; | 886 | struct radeon_fence *fence; |
@@ -2832,9 +2838,10 @@ void radeon_vm_fence(struct radeon_device *rdev, | |||
2832 | uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr); | 2838 | uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr); |
2833 | int radeon_vm_update_page_directory(struct radeon_device *rdev, | 2839 | int radeon_vm_update_page_directory(struct radeon_device *rdev, |
2834 | struct radeon_vm *vm); | 2840 | struct radeon_vm *vm); |
2841 | int radeon_vm_clear_freed(struct radeon_device *rdev, | ||
2842 | struct radeon_vm *vm); | ||
2835 | int radeon_vm_bo_update(struct radeon_device *rdev, | 2843 | int radeon_vm_bo_update(struct radeon_device *rdev, |
2836 | struct radeon_vm *vm, | 2844 | struct radeon_bo_va *bo_va, |
2837 | struct radeon_bo *bo, | ||
2838 | struct ttm_mem_reg *mem); | 2845 | struct ttm_mem_reg *mem); |
2839 | void radeon_vm_bo_invalidate(struct radeon_device *rdev, | 2846 | void radeon_vm_bo_invalidate(struct radeon_device *rdev, |
2840 | struct radeon_bo *bo); | 2847 | struct radeon_bo *bo); |
@@ -2847,8 +2854,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
2847 | struct radeon_bo_va *bo_va, | 2854 | struct radeon_bo_va *bo_va, |
2848 | uint64_t offset, | 2855 | uint64_t offset, |
2849 | uint32_t flags); | 2856 | uint32_t flags); |
2850 | int radeon_vm_bo_rmv(struct radeon_device *rdev, | 2857 | void radeon_vm_bo_rmv(struct radeon_device *rdev, |
2851 | struct radeon_bo_va *bo_va); | 2858 | struct radeon_bo_va *bo_va); |
2852 | 2859 | ||
2853 | /* audio */ | 2860 | /* audio */ |
2854 | void r600_audio_update_hdmi(struct work_struct *work); | 2861 | void r600_audio_update_hdmi(struct work_struct *work); |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 71a143461478..ae763f60c8a0 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -461,13 +461,23 @@ static int radeon_bo_vm_update_pte(struct radeon_cs_parser *p, | |||
461 | struct radeon_vm *vm) | 461 | struct radeon_vm *vm) |
462 | { | 462 | { |
463 | struct radeon_device *rdev = p->rdev; | 463 | struct radeon_device *rdev = p->rdev; |
464 | struct radeon_bo_va *bo_va; | ||
464 | int i, r; | 465 | int i, r; |
465 | 466 | ||
466 | r = radeon_vm_update_page_directory(rdev, vm); | 467 | r = radeon_vm_update_page_directory(rdev, vm); |
467 | if (r) | 468 | if (r) |
468 | return r; | 469 | return r; |
469 | 470 | ||
470 | r = radeon_vm_bo_update(rdev, vm, rdev->ring_tmp_bo.bo, | 471 | r = radeon_vm_clear_freed(rdev, vm); |
472 | if (r) | ||
473 | return r; | ||
474 | |||
475 | if (vm->ib_bo_va == NULL) { | ||
476 | DRM_ERROR("Tmp BO not in VM!\n"); | ||
477 | return -EINVAL; | ||
478 | } | ||
479 | |||
480 | r = radeon_vm_bo_update(rdev, vm->ib_bo_va, | ||
471 | &rdev->ring_tmp_bo.bo->tbo.mem); | 481 | &rdev->ring_tmp_bo.bo->tbo.mem); |
472 | if (r) | 482 | if (r) |
473 | return r; | 483 | return r; |
@@ -480,7 +490,13 @@ static int radeon_bo_vm_update_pte(struct radeon_cs_parser *p, | |||
480 | continue; | 490 | continue; |
481 | 491 | ||
482 | bo = p->relocs[i].robj; | 492 | bo = p->relocs[i].robj; |
483 | r = radeon_vm_bo_update(rdev, vm, bo, &bo->tbo.mem); | 493 | bo_va = radeon_vm_bo_find(vm, bo); |
494 | if (bo_va == NULL) { | ||
495 | dev_err(rdev->dev, "bo %p not in vm %p\n", bo, vm); | ||
496 | return -EINVAL; | ||
497 | } | ||
498 | |||
499 | r = radeon_vm_bo_update(rdev, bo_va, &bo->tbo.mem); | ||
484 | if (r) | 500 | if (r) |
485 | return r; | 501 | return r; |
486 | } | 502 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 03686fab842d..697add2cd4e3 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -1056,36 +1056,36 @@ static void radeon_check_arguments(struct radeon_device *rdev) | |||
1056 | if (!radeon_check_pot_argument(radeon_vm_size)) { | 1056 | if (!radeon_check_pot_argument(radeon_vm_size)) { |
1057 | dev_warn(rdev->dev, "VM size (%d) must be a power of 2\n", | 1057 | dev_warn(rdev->dev, "VM size (%d) must be a power of 2\n", |
1058 | radeon_vm_size); | 1058 | radeon_vm_size); |
1059 | radeon_vm_size = 4096; | 1059 | radeon_vm_size = 4; |
1060 | } | 1060 | } |
1061 | 1061 | ||
1062 | if (radeon_vm_size < 4) { | 1062 | if (radeon_vm_size < 1) { |
1063 | dev_warn(rdev->dev, "VM size (%d) to small, min is 4MB\n", | 1063 | dev_warn(rdev->dev, "VM size (%d) to small, min is 1GB\n", |
1064 | radeon_vm_size); | 1064 | radeon_vm_size); |
1065 | radeon_vm_size = 4096; | 1065 | radeon_vm_size = 4; |
1066 | } | 1066 | } |
1067 | 1067 | ||
1068 | /* | 1068 | /* |
1069 | * Max GPUVM size for Cayman, SI and CI are 40 bits. | 1069 | * Max GPUVM size for Cayman, SI and CI are 40 bits. |
1070 | */ | 1070 | */ |
1071 | if (radeon_vm_size > 1024*1024) { | 1071 | if (radeon_vm_size > 1024) { |
1072 | dev_warn(rdev->dev, "VM size (%d) to large, max is 1TB\n", | 1072 | dev_warn(rdev->dev, "VM size (%d) too large, max is 1TB\n", |
1073 | radeon_vm_size); | 1073 | radeon_vm_size); |
1074 | radeon_vm_size = 4096; | 1074 | radeon_vm_size = 4; |
1075 | } | 1075 | } |
1076 | 1076 | ||
1077 | /* defines number of bits in page table versus page directory, | 1077 | /* defines number of bits in page table versus page directory, |
1078 | * a page is 4KB so we have 12 bits offset, minimum 9 bits in the | 1078 | * a page is 4KB so we have 12 bits offset, minimum 9 bits in the |
1079 | * page table and the remaining bits are in the page directory */ | 1079 | * page table and the remaining bits are in the page directory */ |
1080 | if (radeon_vm_block_size < 9) { | 1080 | if (radeon_vm_block_size < 9) { |
1081 | dev_warn(rdev->dev, "VM page table size (%d) to small\n", | 1081 | dev_warn(rdev->dev, "VM page table size (%d) too small\n", |
1082 | radeon_vm_block_size); | 1082 | radeon_vm_block_size); |
1083 | radeon_vm_block_size = 9; | 1083 | radeon_vm_block_size = 9; |
1084 | } | 1084 | } |
1085 | 1085 | ||
1086 | if (radeon_vm_block_size > 24 || | 1086 | if (radeon_vm_block_size > 24 || |
1087 | radeon_vm_size < (1ull << radeon_vm_block_size)) { | 1087 | (radeon_vm_size * 1024) < (1ull << radeon_vm_block_size)) { |
1088 | dev_warn(rdev->dev, "VM page table size (%d) to large\n", | 1088 | dev_warn(rdev->dev, "VM page table size (%d) too large\n", |
1089 | radeon_vm_block_size); | 1089 | radeon_vm_block_size); |
1090 | radeon_vm_block_size = 9; | 1090 | radeon_vm_block_size = 9; |
1091 | } | 1091 | } |
@@ -1238,7 +1238,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
1238 | /* Adjust VM size here. | 1238 | /* Adjust VM size here. |
1239 | * Max GPUVM size for cayman+ is 40 bits. | 1239 | * Max GPUVM size for cayman+ is 40 bits. |
1240 | */ | 1240 | */ |
1241 | rdev->vm_manager.max_pfn = radeon_vm_size << 8; | 1241 | rdev->vm_manager.max_pfn = radeon_vm_size << 18; |
1242 | 1242 | ||
1243 | /* Set asic functions */ | 1243 | /* Set asic functions */ |
1244 | r = radeon_asic_init(rdev); | 1244 | r = radeon_asic_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index cb1421369e3a..e9e361084249 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -173,7 +173,7 @@ int radeon_dpm = -1; | |||
173 | int radeon_aspm = -1; | 173 | int radeon_aspm = -1; |
174 | int radeon_runtime_pm = -1; | 174 | int radeon_runtime_pm = -1; |
175 | int radeon_hard_reset = 0; | 175 | int radeon_hard_reset = 0; |
176 | int radeon_vm_size = 4096; | 176 | int radeon_vm_size = 4; |
177 | int radeon_vm_block_size = 9; | 177 | int radeon_vm_block_size = 9; |
178 | int radeon_deep_color = 0; | 178 | int radeon_deep_color = 0; |
179 | 179 | ||
@@ -243,7 +243,7 @@ module_param_named(runpm, radeon_runtime_pm, int, 0444); | |||
243 | MODULE_PARM_DESC(hard_reset, "PCI config reset (1 = force enable, 0 = disable (default))"); | 243 | MODULE_PARM_DESC(hard_reset, "PCI config reset (1 = force enable, 0 = disable (default))"); |
244 | module_param_named(hard_reset, radeon_hard_reset, int, 0444); | 244 | module_param_named(hard_reset, radeon_hard_reset, int, 0444); |
245 | 245 | ||
246 | MODULE_PARM_DESC(vm_size, "VM address space size in megabytes (default 4GB)"); | 246 | MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 4GB)"); |
247 | module_param_named(vm_size, radeon_vm_size, int, 0444); | 247 | module_param_named(vm_size, radeon_vm_size, int, 0444); |
248 | 248 | ||
249 | MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default 9)"); | 249 | MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default 9)"); |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 35d931881b4b..d25ae6acfd5a 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -579,7 +579,7 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
579 | /* new gpu have virtual address space support */ | 579 | /* new gpu have virtual address space support */ |
580 | if (rdev->family >= CHIP_CAYMAN) { | 580 | if (rdev->family >= CHIP_CAYMAN) { |
581 | struct radeon_fpriv *fpriv; | 581 | struct radeon_fpriv *fpriv; |
582 | struct radeon_bo_va *bo_va; | 582 | struct radeon_vm *vm; |
583 | int r; | 583 | int r; |
584 | 584 | ||
585 | fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL); | 585 | fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL); |
@@ -587,7 +587,8 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
587 | return -ENOMEM; | 587 | return -ENOMEM; |
588 | } | 588 | } |
589 | 589 | ||
590 | r = radeon_vm_init(rdev, &fpriv->vm); | 590 | vm = &fpriv->vm; |
591 | r = radeon_vm_init(rdev, vm); | ||
591 | if (r) { | 592 | if (r) { |
592 | kfree(fpriv); | 593 | kfree(fpriv); |
593 | return r; | 594 | return r; |
@@ -596,22 +597,23 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
596 | if (rdev->accel_working) { | 597 | if (rdev->accel_working) { |
597 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); | 598 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); |
598 | if (r) { | 599 | if (r) { |
599 | radeon_vm_fini(rdev, &fpriv->vm); | 600 | radeon_vm_fini(rdev, vm); |
600 | kfree(fpriv); | 601 | kfree(fpriv); |
601 | return r; | 602 | return r; |
602 | } | 603 | } |
603 | 604 | ||
604 | /* map the ib pool buffer read only into | 605 | /* map the ib pool buffer read only into |
605 | * virtual address space */ | 606 | * virtual address space */ |
606 | bo_va = radeon_vm_bo_add(rdev, &fpriv->vm, | 607 | vm->ib_bo_va = radeon_vm_bo_add(rdev, vm, |
607 | rdev->ring_tmp_bo.bo); | 608 | rdev->ring_tmp_bo.bo); |
608 | r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET, | 609 | r = radeon_vm_bo_set_addr(rdev, vm->ib_bo_va, |
610 | RADEON_VA_IB_OFFSET, | ||
609 | RADEON_VM_PAGE_READABLE | | 611 | RADEON_VM_PAGE_READABLE | |
610 | RADEON_VM_PAGE_SNOOPED); | 612 | RADEON_VM_PAGE_SNOOPED); |
611 | 613 | ||
612 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); | 614 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); |
613 | if (r) { | 615 | if (r) { |
614 | radeon_vm_fini(rdev, &fpriv->vm); | 616 | radeon_vm_fini(rdev, vm); |
615 | kfree(fpriv); | 617 | kfree(fpriv); |
616 | return r; | 618 | return r; |
617 | } | 619 | } |
@@ -640,21 +642,19 @@ void radeon_driver_postclose_kms(struct drm_device *dev, | |||
640 | /* new gpu have virtual address space support */ | 642 | /* new gpu have virtual address space support */ |
641 | if (rdev->family >= CHIP_CAYMAN && file_priv->driver_priv) { | 643 | if (rdev->family >= CHIP_CAYMAN && file_priv->driver_priv) { |
642 | struct radeon_fpriv *fpriv = file_priv->driver_priv; | 644 | struct radeon_fpriv *fpriv = file_priv->driver_priv; |
643 | struct radeon_bo_va *bo_va; | 645 | struct radeon_vm *vm = &fpriv->vm; |
644 | int r; | 646 | int r; |
645 | 647 | ||
646 | if (rdev->accel_working) { | 648 | if (rdev->accel_working) { |
647 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); | 649 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); |
648 | if (!r) { | 650 | if (!r) { |
649 | bo_va = radeon_vm_bo_find(&fpriv->vm, | 651 | if (vm->ib_bo_va) |
650 | rdev->ring_tmp_bo.bo); | 652 | radeon_vm_bo_rmv(rdev, vm->ib_bo_va); |
651 | if (bo_va) | ||
652 | radeon_vm_bo_rmv(rdev, bo_va); | ||
653 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); | 653 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); |
654 | } | 654 | } |
655 | } | 655 | } |
656 | 656 | ||
657 | radeon_vm_fini(rdev, &fpriv->vm); | 657 | radeon_vm_fini(rdev, vm); |
658 | kfree(fpriv); | 658 | kfree(fpriv); |
659 | file_priv->driver_priv = NULL; | 659 | file_priv->driver_priv = NULL; |
660 | } | 660 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index eecff6bbd341..725d3669014f 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
@@ -332,6 +332,7 @@ struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev, | |||
332 | bo_va->ref_count = 1; | 332 | bo_va->ref_count = 1; |
333 | INIT_LIST_HEAD(&bo_va->bo_list); | 333 | INIT_LIST_HEAD(&bo_va->bo_list); |
334 | INIT_LIST_HEAD(&bo_va->vm_list); | 334 | INIT_LIST_HEAD(&bo_va->vm_list); |
335 | INIT_LIST_HEAD(&bo_va->vm_status); | ||
335 | 336 | ||
336 | mutex_lock(&vm->mutex); | 337 | mutex_lock(&vm->mutex); |
337 | list_add(&bo_va->vm_list, &vm->va); | 338 | list_add(&bo_va->vm_list, &vm->va); |
@@ -468,6 +469,19 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
468 | head = &tmp->vm_list; | 469 | head = &tmp->vm_list; |
469 | } | 470 | } |
470 | 471 | ||
472 | if (bo_va->soffset) { | ||
473 | /* add a clone of the bo_va to clear the old address */ | ||
474 | tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); | ||
475 | if (!tmp) { | ||
476 | mutex_unlock(&vm->mutex); | ||
477 | return -ENOMEM; | ||
478 | } | ||
479 | tmp->soffset = bo_va->soffset; | ||
480 | tmp->eoffset = bo_va->eoffset; | ||
481 | tmp->vm = vm; | ||
482 | list_add(&tmp->vm_status, &vm->freed); | ||
483 | } | ||
484 | |||
471 | bo_va->soffset = soffset; | 485 | bo_va->soffset = soffset; |
472 | bo_va->eoffset = eoffset; | 486 | bo_va->eoffset = eoffset; |
473 | bo_va->flags = flags; | 487 | bo_va->flags = flags; |
@@ -823,25 +837,19 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev, | |||
823 | * Object have to be reserved and mutex must be locked! | 837 | * Object have to be reserved and mutex must be locked! |
824 | */ | 838 | */ |
825 | int radeon_vm_bo_update(struct radeon_device *rdev, | 839 | int radeon_vm_bo_update(struct radeon_device *rdev, |
826 | struct radeon_vm *vm, | 840 | struct radeon_bo_va *bo_va, |
827 | struct radeon_bo *bo, | ||
828 | struct ttm_mem_reg *mem) | 841 | struct ttm_mem_reg *mem) |
829 | { | 842 | { |
843 | struct radeon_vm *vm = bo_va->vm; | ||
830 | struct radeon_ib ib; | 844 | struct radeon_ib ib; |
831 | struct radeon_bo_va *bo_va; | ||
832 | unsigned nptes, ndw; | 845 | unsigned nptes, ndw; |
833 | uint64_t addr; | 846 | uint64_t addr; |
834 | int r; | 847 | int r; |
835 | 848 | ||
836 | bo_va = radeon_vm_bo_find(vm, bo); | ||
837 | if (bo_va == NULL) { | ||
838 | dev_err(rdev->dev, "bo %p not in vm %p\n", bo, vm); | ||
839 | return -EINVAL; | ||
840 | } | ||
841 | 849 | ||
842 | if (!bo_va->soffset) { | 850 | if (!bo_va->soffset) { |
843 | dev_err(rdev->dev, "bo %p don't has a mapping in vm %p\n", | 851 | dev_err(rdev->dev, "bo %p don't has a mapping in vm %p\n", |
844 | bo, vm); | 852 | bo_va->bo, vm); |
845 | return -EINVAL; | 853 | return -EINVAL; |
846 | } | 854 | } |
847 | 855 | ||
@@ -868,7 +876,7 @@ int radeon_vm_bo_update(struct radeon_device *rdev, | |||
868 | 876 | ||
869 | trace_radeon_vm_bo_update(bo_va); | 877 | trace_radeon_vm_bo_update(bo_va); |
870 | 878 | ||
871 | nptes = radeon_bo_ngpu_pages(bo); | 879 | nptes = (bo_va->eoffset - bo_va->soffset) / RADEON_GPU_PAGE_SIZE; |
872 | 880 | ||
873 | /* padding, etc. */ | 881 | /* padding, etc. */ |
874 | ndw = 64; | 882 | ndw = 64; |
@@ -911,33 +919,61 @@ int radeon_vm_bo_update(struct radeon_device *rdev, | |||
911 | } | 919 | } |
912 | 920 | ||
913 | /** | 921 | /** |
922 | * radeon_vm_clear_freed - clear freed BOs in the PT | ||
923 | * | ||
924 | * @rdev: radeon_device pointer | ||
925 | * @vm: requested vm | ||
926 | * | ||
927 | * Make sure all freed BOs are cleared in the PT. | ||
928 | * Returns 0 for success. | ||
929 | * | ||
930 | * PTs have to be reserved and mutex must be locked! | ||
931 | */ | ||
932 | int radeon_vm_clear_freed(struct radeon_device *rdev, | ||
933 | struct radeon_vm *vm) | ||
934 | { | ||
935 | struct radeon_bo_va *bo_va, *tmp; | ||
936 | int r; | ||
937 | |||
938 | list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) { | ||
939 | list_del(&bo_va->vm_status); | ||
940 | r = radeon_vm_bo_update(rdev, bo_va, NULL); | ||
941 | kfree(bo_va); | ||
942 | if (r) | ||
943 | return r; | ||
944 | } | ||
945 | return 0; | ||
946 | |||
947 | } | ||
948 | |||
949 | /** | ||
914 | * radeon_vm_bo_rmv - remove a bo to a specific vm | 950 | * radeon_vm_bo_rmv - remove a bo to a specific vm |
915 | * | 951 | * |
916 | * @rdev: radeon_device pointer | 952 | * @rdev: radeon_device pointer |
917 | * @bo_va: requested bo_va | 953 | * @bo_va: requested bo_va |
918 | * | 954 | * |
919 | * Remove @bo_va->bo from the requested vm (cayman+). | 955 | * Remove @bo_va->bo from the requested vm (cayman+). |
920 | * Remove @bo_va->bo from the list of bos associated with the bo_va->vm and | ||
921 | * remove the ptes for @bo_va in the page table. | ||
922 | * Returns 0 for success. | ||
923 | * | 956 | * |
924 | * Object have to be reserved! | 957 | * Object have to be reserved! |
925 | */ | 958 | */ |
926 | int radeon_vm_bo_rmv(struct radeon_device *rdev, | 959 | void radeon_vm_bo_rmv(struct radeon_device *rdev, |
927 | struct radeon_bo_va *bo_va) | 960 | struct radeon_bo_va *bo_va) |
928 | { | 961 | { |
929 | int r = 0; | 962 | struct radeon_vm *vm = bo_va->vm; |
930 | 963 | ||
931 | mutex_lock(&bo_va->vm->mutex); | 964 | list_del(&bo_va->bo_list); |
932 | if (bo_va->soffset) | ||
933 | r = radeon_vm_bo_update(rdev, bo_va->vm, bo_va->bo, NULL); | ||
934 | 965 | ||
966 | mutex_lock(&vm->mutex); | ||
935 | list_del(&bo_va->vm_list); | 967 | list_del(&bo_va->vm_list); |
936 | mutex_unlock(&bo_va->vm->mutex); | ||
937 | list_del(&bo_va->bo_list); | ||
938 | 968 | ||
939 | kfree(bo_va); | 969 | if (bo_va->soffset) { |
940 | return r; | 970 | bo_va->bo = NULL; |
971 | list_add(&bo_va->vm_status, &vm->freed); | ||
972 | } else { | ||
973 | kfree(bo_va); | ||
974 | } | ||
975 | |||
976 | mutex_unlock(&vm->mutex); | ||
941 | } | 977 | } |
942 | 978 | ||
943 | /** | 979 | /** |
@@ -975,11 +1011,13 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm) | |||
975 | int r; | 1011 | int r; |
976 | 1012 | ||
977 | vm->id = 0; | 1013 | vm->id = 0; |
1014 | vm->ib_bo_va = NULL; | ||
978 | vm->fence = NULL; | 1015 | vm->fence = NULL; |
979 | vm->last_flush = NULL; | 1016 | vm->last_flush = NULL; |
980 | vm->last_id_use = NULL; | 1017 | vm->last_id_use = NULL; |
981 | mutex_init(&vm->mutex); | 1018 | mutex_init(&vm->mutex); |
982 | INIT_LIST_HEAD(&vm->va); | 1019 | INIT_LIST_HEAD(&vm->va); |
1020 | INIT_LIST_HEAD(&vm->freed); | ||
983 | 1021 | ||
984 | pd_size = radeon_vm_directory_size(rdev); | 1022 | pd_size = radeon_vm_directory_size(rdev); |
985 | pd_entries = radeon_vm_num_pdes(rdev); | 1023 | pd_entries = radeon_vm_num_pdes(rdev); |
@@ -1034,7 +1072,8 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm) | |||
1034 | kfree(bo_va); | 1072 | kfree(bo_va); |
1035 | } | 1073 | } |
1036 | } | 1074 | } |
1037 | 1075 | list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) | |
1076 | kfree(bo_va); | ||
1038 | 1077 | ||
1039 | for (i = 0; i < radeon_vm_num_pdes(rdev); i++) | 1078 | for (i = 0; i < radeon_vm_num_pdes(rdev); i++) |
1040 | radeon_bo_unref(&vm->page_tables[i].bo); | 1079 | radeon_bo_unref(&vm->page_tables[i].bo); |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index eba0225259a4..9e854fd016da 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -6103,6 +6103,7 @@ static inline u32 si_get_ih_wptr(struct radeon_device *rdev) | |||
6103 | tmp = RREG32(IH_RB_CNTL); | 6103 | tmp = RREG32(IH_RB_CNTL); |
6104 | tmp |= IH_WPTR_OVERFLOW_CLEAR; | 6104 | tmp |= IH_WPTR_OVERFLOW_CLEAR; |
6105 | WREG32(IH_RB_CNTL, tmp); | 6105 | WREG32(IH_RB_CNTL, tmp); |
6106 | wptr &= ~RB_OVERFLOW; | ||
6106 | } | 6107 | } |
6107 | return (wptr & rdev->ih.ptr_mask); | 6108 | return (wptr & rdev->ih.ptr_mask); |
6108 | } | 6109 | } |
diff --git a/drivers/gpu/drm/radeon/trinity_dpm.c b/drivers/gpu/drm/radeon/trinity_dpm.c index 20da6ff183df..32e50be9c4ac 100644 --- a/drivers/gpu/drm/radeon/trinity_dpm.c +++ b/drivers/gpu/drm/radeon/trinity_dpm.c | |||
@@ -1874,15 +1874,16 @@ int trinity_dpm_init(struct radeon_device *rdev) | |||
1874 | for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) | 1874 | for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) |
1875 | pi->at[i] = TRINITY_AT_DFLT; | 1875 | pi->at[i] = TRINITY_AT_DFLT; |
1876 | 1876 | ||
1877 | /* There are stability issues reported on latops with | 1877 | /* There are stability issues reported on with |
1878 | * bapm installed when switching between AC and battery | 1878 | * bapm enabled when switching between AC and battery |
1879 | * power. At the same time, some desktop boards hang | 1879 | * power. At the same time, some MSI boards hang |
1880 | * if it's not enabled and dpm is enabled. | 1880 | * if it's not enabled and dpm is enabled. Just enable |
1881 | * it for MSI boards right now. | ||
1881 | */ | 1882 | */ |
1882 | if (rdev->flags & RADEON_IS_MOBILITY) | 1883 | if (rdev->pdev->subsystem_vendor == 0x1462) |
1883 | pi->enable_bapm = false; | ||
1884 | else | ||
1885 | pi->enable_bapm = true; | 1884 | pi->enable_bapm = true; |
1885 | else | ||
1886 | pi->enable_bapm = false; | ||
1886 | pi->enable_nbps_policy = true; | 1887 | pi->enable_nbps_policy = true; |
1887 | pi->enable_sclk_ds = true; | 1888 | pi->enable_sclk_ds = true; |
1888 | pi->enable_gfx_power_gating = true; | 1889 | pi->enable_gfx_power_gating = true; |
diff --git a/drivers/hwmon/smsc47m192.c b/drivers/hwmon/smsc47m192.c index efee4c59239f..34b9a601ad07 100644 --- a/drivers/hwmon/smsc47m192.c +++ b/drivers/hwmon/smsc47m192.c | |||
@@ -86,7 +86,7 @@ static inline u8 IN_TO_REG(unsigned long val, int n) | |||
86 | */ | 86 | */ |
87 | static inline s8 TEMP_TO_REG(int val) | 87 | static inline s8 TEMP_TO_REG(int val) |
88 | { | 88 | { |
89 | return clamp_val(SCALE(val, 1, 1000), -128000, 127000); | 89 | return SCALE(clamp_val(val, -128000, 127000), 1, 1000); |
90 | } | 90 | } |
91 | 91 | ||
92 | static inline int TEMP_FROM_REG(s8 val) | 92 | static inline int TEMP_FROM_REG(s8 val) |
@@ -384,6 +384,8 @@ static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, | |||
384 | err = kstrtoul(buf, 10, &val); | 384 | err = kstrtoul(buf, 10, &val); |
385 | if (err) | 385 | if (err) |
386 | return err; | 386 | return err; |
387 | if (val > 255) | ||
388 | return -EINVAL; | ||
387 | 389 | ||
388 | data->vrm = val; | 390 | data->vrm = val; |
389 | return count; | 391 | return count; |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 8fb46aab2d87..a04c49f2a011 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -416,6 +416,7 @@ config BLK_DEV_CY82C693 | |||
416 | 416 | ||
417 | config BLK_DEV_CS5520 | 417 | config BLK_DEV_CS5520 |
418 | tristate "Cyrix CS5510/20 MediaGX chipset support (VERY EXPERIMENTAL)" | 418 | tristate "Cyrix CS5510/20 MediaGX chipset support (VERY EXPERIMENTAL)" |
419 | depends on X86_32 || COMPILE_TEST | ||
419 | select BLK_DEV_IDEDMA_PCI | 420 | select BLK_DEV_IDEDMA_PCI |
420 | help | 421 | help |
421 | Include support for PIO tuning and virtual DMA on the Cyrix MediaGX | 422 | Include support for PIO tuning and virtual DMA on the Cyrix MediaGX |
@@ -426,6 +427,7 @@ config BLK_DEV_CS5520 | |||
426 | 427 | ||
427 | config BLK_DEV_CS5530 | 428 | config BLK_DEV_CS5530 |
428 | tristate "Cyrix/National Semiconductor CS5530 MediaGX chipset support" | 429 | tristate "Cyrix/National Semiconductor CS5530 MediaGX chipset support" |
430 | depends on X86_32 || COMPILE_TEST | ||
429 | select BLK_DEV_IDEDMA_PCI | 431 | select BLK_DEV_IDEDMA_PCI |
430 | help | 432 | help |
431 | Include support for UDMA on the Cyrix MediaGX 5530 chipset. This | 433 | Include support for UDMA on the Cyrix MediaGX 5530 chipset. This |
@@ -435,7 +437,7 @@ config BLK_DEV_CS5530 | |||
435 | 437 | ||
436 | config BLK_DEV_CS5535 | 438 | config BLK_DEV_CS5535 |
437 | tristate "AMD CS5535 chipset support" | 439 | tristate "AMD CS5535 chipset support" |
438 | depends on X86 && !X86_64 | 440 | depends on X86_32 |
439 | select BLK_DEV_IDEDMA_PCI | 441 | select BLK_DEV_IDEDMA_PCI |
440 | help | 442 | help |
441 | Include support for UDMA on the NSC/AMD CS5535 companion chipset. | 443 | Include support for UDMA on the NSC/AMD CS5535 companion chipset. |
@@ -486,6 +488,7 @@ config BLK_DEV_JMICRON | |||
486 | 488 | ||
487 | config BLK_DEV_SC1200 | 489 | config BLK_DEV_SC1200 |
488 | tristate "National SCx200 chipset support" | 490 | tristate "National SCx200 chipset support" |
491 | depends on X86_32 || COMPILE_TEST | ||
489 | select BLK_DEV_IDEDMA_PCI | 492 | select BLK_DEV_IDEDMA_PCI |
490 | help | 493 | help |
491 | This driver adds support for the on-board IDE controller on the | 494 | This driver adds support for the on-board IDE controller on the |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 2a744a91370e..a3d3b1733c49 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -853,8 +853,9 @@ static int init_irq (ide_hwif_t *hwif) | |||
853 | if (irq_handler == NULL) | 853 | if (irq_handler == NULL) |
854 | irq_handler = ide_intr; | 854 | irq_handler = ide_intr; |
855 | 855 | ||
856 | if (request_irq(hwif->irq, irq_handler, sa, hwif->name, hwif)) | 856 | if (!host->get_lock) |
857 | goto out_up; | 857 | if (request_irq(hwif->irq, irq_handler, sa, hwif->name, hwif)) |
858 | goto out_up; | ||
858 | 859 | ||
859 | #if !defined(__mc68000__) | 860 | #if !defined(__mc68000__) |
860 | printk(KERN_INFO "%s at 0x%03lx-0x%03lx,0x%03lx on irq %d", hwif->name, | 861 | printk(KERN_INFO "%s at 0x%03lx-0x%03lx,0x%03lx on irq %d", hwif->name, |
@@ -1533,7 +1534,8 @@ static void ide_unregister(ide_hwif_t *hwif) | |||
1533 | 1534 | ||
1534 | ide_proc_unregister_port(hwif); | 1535 | ide_proc_unregister_port(hwif); |
1535 | 1536 | ||
1536 | free_irq(hwif->irq, hwif); | 1537 | if (!hwif->host->get_lock) |
1538 | free_irq(hwif->irq, hwif); | ||
1537 | 1539 | ||
1538 | device_unregister(hwif->portdev); | 1540 | device_unregister(hwif->portdev); |
1539 | device_unregister(&hwif->gendev); | 1541 | device_unregister(&hwif->gendev); |
diff --git a/drivers/input/input.c b/drivers/input/input.c index 1c4c0db05550..29ca0bb4f561 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -257,9 +257,10 @@ static int input_handle_abs_event(struct input_dev *dev, | |||
257 | } | 257 | } |
258 | 258 | ||
259 | static int input_get_disposition(struct input_dev *dev, | 259 | static int input_get_disposition(struct input_dev *dev, |
260 | unsigned int type, unsigned int code, int value) | 260 | unsigned int type, unsigned int code, int *pval) |
261 | { | 261 | { |
262 | int disposition = INPUT_IGNORE_EVENT; | 262 | int disposition = INPUT_IGNORE_EVENT; |
263 | int value = *pval; | ||
263 | 264 | ||
264 | switch (type) { | 265 | switch (type) { |
265 | 266 | ||
@@ -357,6 +358,7 @@ static int input_get_disposition(struct input_dev *dev, | |||
357 | break; | 358 | break; |
358 | } | 359 | } |
359 | 360 | ||
361 | *pval = value; | ||
360 | return disposition; | 362 | return disposition; |
361 | } | 363 | } |
362 | 364 | ||
@@ -365,7 +367,7 @@ static void input_handle_event(struct input_dev *dev, | |||
365 | { | 367 | { |
366 | int disposition; | 368 | int disposition; |
367 | 369 | ||
368 | disposition = input_get_disposition(dev, type, code, value); | 370 | disposition = input_get_disposition(dev, type, code, &value); |
369 | 371 | ||
370 | if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) | 372 | if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) |
371 | dev->event(dev, type, code, value); | 373 | dev->event(dev, type, code, value); |
diff --git a/drivers/input/keyboard/st-keyscan.c b/drivers/input/keyboard/st-keyscan.c index 758b48731415..de7be4f03d91 100644 --- a/drivers/input/keyboard/st-keyscan.c +++ b/drivers/input/keyboard/st-keyscan.c | |||
@@ -215,6 +215,7 @@ static int keyscan_probe(struct platform_device *pdev) | |||
215 | return 0; | 215 | return 0; |
216 | } | 216 | } |
217 | 217 | ||
218 | #ifdef CONFIG_PM_SLEEP | ||
218 | static int keyscan_suspend(struct device *dev) | 219 | static int keyscan_suspend(struct device *dev) |
219 | { | 220 | { |
220 | struct platform_device *pdev = to_platform_device(dev); | 221 | struct platform_device *pdev = to_platform_device(dev); |
@@ -249,6 +250,7 @@ static int keyscan_resume(struct device *dev) | |||
249 | mutex_unlock(&input->mutex); | 250 | mutex_unlock(&input->mutex); |
250 | return retval; | 251 | return retval; |
251 | } | 252 | } |
253 | #endif | ||
252 | 254 | ||
253 | static SIMPLE_DEV_PM_OPS(keyscan_dev_pm_ops, keyscan_suspend, keyscan_resume); | 255 | static SIMPLE_DEV_PM_OPS(keyscan_dev_pm_ops, keyscan_suspend, keyscan_resume); |
254 | 256 | ||
diff --git a/drivers/input/misc/sirfsoc-onkey.c b/drivers/input/misc/sirfsoc-onkey.c index e4104f9b2e6d..fed5102e1802 100644 --- a/drivers/input/misc/sirfsoc-onkey.c +++ b/drivers/input/misc/sirfsoc-onkey.c | |||
@@ -213,7 +213,7 @@ static struct platform_driver sirfsoc_pwrc_driver = { | |||
213 | 213 | ||
214 | module_platform_driver(sirfsoc_pwrc_driver); | 214 | module_platform_driver(sirfsoc_pwrc_driver); |
215 | 215 | ||
216 | MODULE_LICENSE("GPLv2"); | 216 | MODULE_LICENSE("GPL v2"); |
217 | MODULE_AUTHOR("Binghua Duan <Binghua.Duan@csr.com>, Xianglong Du <Xianglong.Du@csr.com>"); | 217 | MODULE_AUTHOR("Binghua Duan <Binghua.Duan@csr.com>, Xianglong Du <Xianglong.Du@csr.com>"); |
218 | MODULE_DESCRIPTION("CSR Prima2 PWRC Driver"); | 218 | MODULE_DESCRIPTION("CSR Prima2 PWRC Driver"); |
219 | MODULE_ALIAS("platform:sirfsoc-pwrc"); | 219 | MODULE_ALIAS("platform:sirfsoc-pwrc"); |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index ec772d962f06..ef9e0b8a9aa7 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -132,7 +132,8 @@ static const struct min_max_quirk min_max_pnpid_table[] = { | |||
132 | 1232, 5710, 1156, 4696 | 132 | 1232, 5710, 1156, 4696 |
133 | }, | 133 | }, |
134 | { | 134 | { |
135 | (const char * const []){"LEN0034", "LEN0036", "LEN2004", NULL}, | 135 | (const char * const []){"LEN0034", "LEN0036", "LEN2002", |
136 | "LEN2004", NULL}, | ||
136 | 1024, 5112, 2024, 4832 | 137 | 1024, 5112, 2024, 4832 |
137 | }, | 138 | }, |
138 | { | 139 | { |
@@ -168,7 +169,7 @@ static const char * const topbuttonpad_pnp_ids[] = { | |||
168 | "LEN0049", | 169 | "LEN0049", |
169 | "LEN2000", | 170 | "LEN2000", |
170 | "LEN2001", /* Edge E431 */ | 171 | "LEN2001", /* Edge E431 */ |
171 | "LEN2002", | 172 | "LEN2002", /* Edge E531 */ |
172 | "LEN2003", | 173 | "LEN2003", |
173 | "LEN2004", /* L440 */ | 174 | "LEN2004", /* L440 */ |
174 | "LEN2005", | 175 | "LEN2005", |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 381b20d4c561..136b7b204f56 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -402,6 +402,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { | |||
402 | }, | 402 | }, |
403 | }, | 403 | }, |
404 | { | 404 | { |
405 | /* Acer Aspire 5710 */ | ||
406 | .matches = { | ||
407 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
408 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"), | ||
409 | }, | ||
410 | }, | ||
411 | { | ||
405 | /* Gericom Bellagio */ | 412 | /* Gericom Bellagio */ |
406 | .matches = { | 413 | .matches = { |
407 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | 414 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 977d05cd9e2e..e73cf2c71f35 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
@@ -1217,9 +1217,9 @@ static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) | |||
1217 | * a=(pi*r^2)/C. | 1217 | * a=(pi*r^2)/C. |
1218 | */ | 1218 | */ |
1219 | int a = data[5]; | 1219 | int a = data[5]; |
1220 | int x_res = input_abs_get_res(input, ABS_X); | 1220 | int x_res = input_abs_get_res(input, ABS_MT_POSITION_X); |
1221 | int y_res = input_abs_get_res(input, ABS_Y); | 1221 | int y_res = input_abs_get_res(input, ABS_MT_POSITION_Y); |
1222 | width = 2 * int_sqrt(a * WACOM_CONTACT_AREA_SCALE); | 1222 | width = 2 * int_sqrt(a * WACOM_CONTACT_AREA_SCALE); |
1223 | height = width * y_res / x_res; | 1223 | height = width * y_res / x_res; |
1224 | } | 1224 | } |
1225 | 1225 | ||
@@ -1587,7 +1587,7 @@ static void wacom_abs_set_axis(struct input_dev *input_dev, | |||
1587 | input_abs_set_res(input_dev, ABS_X, features->x_resolution); | 1587 | input_abs_set_res(input_dev, ABS_X, features->x_resolution); |
1588 | input_abs_set_res(input_dev, ABS_Y, features->y_resolution); | 1588 | input_abs_set_res(input_dev, ABS_Y, features->y_resolution); |
1589 | } else { | 1589 | } else { |
1590 | if (features->touch_max <= 2) { | 1590 | if (features->touch_max == 1) { |
1591 | input_set_abs_params(input_dev, ABS_X, 0, | 1591 | input_set_abs_params(input_dev, ABS_X, 0, |
1592 | features->x_max, features->x_fuzz, 0); | 1592 | features->x_max, features->x_fuzz, 0); |
1593 | input_set_abs_params(input_dev, ABS_Y, 0, | 1593 | input_set_abs_params(input_dev, ABS_Y, 0, |
@@ -1815,14 +1815,8 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, | |||
1815 | case MTTPC: | 1815 | case MTTPC: |
1816 | case MTTPC_B: | 1816 | case MTTPC_B: |
1817 | case TABLETPC2FG: | 1817 | case TABLETPC2FG: |
1818 | if (features->device_type == BTN_TOOL_FINGER) { | 1818 | if (features->device_type == BTN_TOOL_FINGER && features->touch_max > 1) |
1819 | unsigned int flags = INPUT_MT_DIRECT; | 1819 | input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT); |
1820 | |||
1821 | if (wacom_wac->features.type == TABLETPC2FG) | ||
1822 | flags = 0; | ||
1823 | |||
1824 | input_mt_init_slots(input_dev, features->touch_max, flags); | ||
1825 | } | ||
1826 | /* fall through */ | 1820 | /* fall through */ |
1827 | 1821 | ||
1828 | case TABLETPC: | 1822 | case TABLETPC: |
@@ -1883,10 +1877,6 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, | |||
1883 | __set_bit(BTN_RIGHT, input_dev->keybit); | 1877 | __set_bit(BTN_RIGHT, input_dev->keybit); |
1884 | 1878 | ||
1885 | if (features->touch_max) { | 1879 | if (features->touch_max) { |
1886 | /* touch interface */ | ||
1887 | unsigned int flags = INPUT_MT_POINTER; | ||
1888 | |||
1889 | __set_bit(INPUT_PROP_POINTER, input_dev->propbit); | ||
1890 | if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) { | 1880 | if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) { |
1891 | input_set_abs_params(input_dev, | 1881 | input_set_abs_params(input_dev, |
1892 | ABS_MT_TOUCH_MAJOR, | 1882 | ABS_MT_TOUCH_MAJOR, |
@@ -1894,12 +1884,8 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, | |||
1894 | input_set_abs_params(input_dev, | 1884 | input_set_abs_params(input_dev, |
1895 | ABS_MT_TOUCH_MINOR, | 1885 | ABS_MT_TOUCH_MINOR, |
1896 | 0, features->y_max, 0, 0); | 1886 | 0, features->y_max, 0, 0); |
1897 | } else { | ||
1898 | __set_bit(BTN_TOOL_FINGER, input_dev->keybit); | ||
1899 | __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); | ||
1900 | flags = 0; | ||
1901 | } | 1887 | } |
1902 | input_mt_init_slots(input_dev, features->touch_max, flags); | 1888 | input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER); |
1903 | } else { | 1889 | } else { |
1904 | /* buttons/keys only interface */ | 1890 | /* buttons/keys only interface */ |
1905 | __clear_bit(ABS_X, input_dev->absbit); | 1891 | __clear_bit(ABS_X, input_dev->absbit); |
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c index 4e793a17361f..2ce649520fe0 100644 --- a/drivers/input/touchscreen/ti_am335x_tsc.c +++ b/drivers/input/touchscreen/ti_am335x_tsc.c | |||
@@ -359,9 +359,12 @@ static int titsc_parse_dt(struct platform_device *pdev, | |||
359 | */ | 359 | */ |
360 | err = of_property_read_u32(node, "ti,coordinate-readouts", | 360 | err = of_property_read_u32(node, "ti,coordinate-readouts", |
361 | &ts_dev->coordinate_readouts); | 361 | &ts_dev->coordinate_readouts); |
362 | if (err < 0) | 362 | if (err < 0) { |
363 | dev_warn(&pdev->dev, "please use 'ti,coordinate-readouts' instead\n"); | ||
363 | err = of_property_read_u32(node, "ti,coordiante-readouts", | 364 | err = of_property_read_u32(node, "ti,coordiante-readouts", |
364 | &ts_dev->coordinate_readouts); | 365 | &ts_dev->coordinate_readouts); |
366 | } | ||
367 | |||
365 | if (err < 0) | 368 | if (err < 0) |
366 | return err; | 369 | return err; |
367 | 370 | ||
diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index a333b7f798d1..62f0688d45a5 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c | |||
@@ -638,9 +638,15 @@ isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg) | |||
638 | fprog.len = len; | 638 | fprog.len = len; |
639 | fprog.filter = code; | 639 | fprog.filter = code; |
640 | 640 | ||
641 | if (is->pass_filter) | 641 | if (is->pass_filter) { |
642 | sk_unattached_filter_destroy(is->pass_filter); | 642 | sk_unattached_filter_destroy(is->pass_filter); |
643 | err = sk_unattached_filter_create(&is->pass_filter, &fprog); | 643 | is->pass_filter = NULL; |
644 | } | ||
645 | if (fprog.filter != NULL) | ||
646 | err = sk_unattached_filter_create(&is->pass_filter, | ||
647 | &fprog); | ||
648 | else | ||
649 | err = 0; | ||
644 | kfree(code); | 650 | kfree(code); |
645 | 651 | ||
646 | return err; | 652 | return err; |
@@ -657,9 +663,15 @@ isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg) | |||
657 | fprog.len = len; | 663 | fprog.len = len; |
658 | fprog.filter = code; | 664 | fprog.filter = code; |
659 | 665 | ||
660 | if (is->active_filter) | 666 | if (is->active_filter) { |
661 | sk_unattached_filter_destroy(is->active_filter); | 667 | sk_unattached_filter_destroy(is->active_filter); |
662 | err = sk_unattached_filter_create(&is->active_filter, &fprog); | 668 | is->active_filter = NULL; |
669 | } | ||
670 | if (fprog.filter != NULL) | ||
671 | err = sk_unattached_filter_create(&is->active_filter, | ||
672 | &fprog); | ||
673 | else | ||
674 | err = 0; | ||
663 | kfree(code); | 675 | kfree(code); |
664 | 676 | ||
665 | return err; | 677 | return err; |
diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c index 8637d2ed7623..2e3cdcfa0a67 100644 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c | |||
@@ -60,7 +60,7 @@ static int si2168_cmd_execute(struct si2168 *s, struct si2168_cmd *cmd) | |||
60 | jiffies_to_msecs(jiffies) - | 60 | jiffies_to_msecs(jiffies) - |
61 | (jiffies_to_msecs(timeout) - TIMEOUT)); | 61 | (jiffies_to_msecs(timeout) - TIMEOUT)); |
62 | 62 | ||
63 | if (!(cmd->args[0] >> 7) & 0x01) { | 63 | if (!((cmd->args[0] >> 7) & 0x01)) { |
64 | ret = -ETIMEDOUT; | 64 | ret = -ETIMEDOUT; |
65 | goto err_mutex_unlock; | 65 | goto err_mutex_unlock; |
66 | } | 66 | } |
@@ -485,20 +485,6 @@ static int si2168_init(struct dvb_frontend *fe) | |||
485 | if (ret) | 485 | if (ret) |
486 | goto err; | 486 | goto err; |
487 | 487 | ||
488 | cmd.args[0] = 0x05; | ||
489 | cmd.args[1] = 0x00; | ||
490 | cmd.args[2] = 0xaa; | ||
491 | cmd.args[3] = 0x4d; | ||
492 | cmd.args[4] = 0x56; | ||
493 | cmd.args[5] = 0x40; | ||
494 | cmd.args[6] = 0x00; | ||
495 | cmd.args[7] = 0x00; | ||
496 | cmd.wlen = 8; | ||
497 | cmd.rlen = 1; | ||
498 | ret = si2168_cmd_execute(s, &cmd); | ||
499 | if (ret) | ||
500 | goto err; | ||
501 | |||
502 | /* cold state - try to download firmware */ | 488 | /* cold state - try to download firmware */ |
503 | dev_info(&s->client->dev, "%s: found a '%s' in cold state\n", | 489 | dev_info(&s->client->dev, "%s: found a '%s' in cold state\n", |
504 | KBUILD_MODNAME, si2168_ops.info.name); | 490 | KBUILD_MODNAME, si2168_ops.info.name); |
diff --git a/drivers/media/dvb-frontends/si2168_priv.h b/drivers/media/dvb-frontends/si2168_priv.h index 2a343e896f40..53f7f06ae343 100644 --- a/drivers/media/dvb-frontends/si2168_priv.h +++ b/drivers/media/dvb-frontends/si2168_priv.h | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/firmware.h> | 22 | #include <linux/firmware.h> |
23 | #include <linux/i2c-mux.h> | 23 | #include <linux/i2c-mux.h> |
24 | 24 | ||
25 | #define SI2168_FIRMWARE "dvb-demod-si2168-01.fw" | 25 | #define SI2168_FIRMWARE "dvb-demod-si2168-02.fw" |
26 | 26 | ||
27 | /* state struct */ | 27 | /* state struct */ |
28 | struct si2168 { | 28 | struct si2168 { |
diff --git a/drivers/media/dvb-frontends/tda10071.c b/drivers/media/dvb-frontends/tda10071.c index 522fe00f5eee..9619be5d4827 100644 --- a/drivers/media/dvb-frontends/tda10071.c +++ b/drivers/media/dvb-frontends/tda10071.c | |||
@@ -668,6 +668,7 @@ static int tda10071_set_frontend(struct dvb_frontend *fe) | |||
668 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | 668 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
669 | int ret, i; | 669 | int ret, i; |
670 | u8 mode, rolloff, pilot, inversion, div; | 670 | u8 mode, rolloff, pilot, inversion, div; |
671 | fe_modulation_t modulation; | ||
671 | 672 | ||
672 | dev_dbg(&priv->i2c->dev, | 673 | dev_dbg(&priv->i2c->dev, |
673 | "%s: delivery_system=%d modulation=%d frequency=%d symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n", | 674 | "%s: delivery_system=%d modulation=%d frequency=%d symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n", |
@@ -702,10 +703,13 @@ static int tda10071_set_frontend(struct dvb_frontend *fe) | |||
702 | 703 | ||
703 | switch (c->delivery_system) { | 704 | switch (c->delivery_system) { |
704 | case SYS_DVBS: | 705 | case SYS_DVBS: |
706 | modulation = QPSK; | ||
705 | rolloff = 0; | 707 | rolloff = 0; |
706 | pilot = 2; | 708 | pilot = 2; |
707 | break; | 709 | break; |
708 | case SYS_DVBS2: | 710 | case SYS_DVBS2: |
711 | modulation = c->modulation; | ||
712 | |||
709 | switch (c->rolloff) { | 713 | switch (c->rolloff) { |
710 | case ROLLOFF_20: | 714 | case ROLLOFF_20: |
711 | rolloff = 2; | 715 | rolloff = 2; |
@@ -750,7 +754,7 @@ static int tda10071_set_frontend(struct dvb_frontend *fe) | |||
750 | 754 | ||
751 | for (i = 0, mode = 0xff; i < ARRAY_SIZE(TDA10071_MODCOD); i++) { | 755 | for (i = 0, mode = 0xff; i < ARRAY_SIZE(TDA10071_MODCOD); i++) { |
752 | if (c->delivery_system == TDA10071_MODCOD[i].delivery_system && | 756 | if (c->delivery_system == TDA10071_MODCOD[i].delivery_system && |
753 | c->modulation == TDA10071_MODCOD[i].modulation && | 757 | modulation == TDA10071_MODCOD[i].modulation && |
754 | c->fec_inner == TDA10071_MODCOD[i].fec) { | 758 | c->fec_inner == TDA10071_MODCOD[i].fec) { |
755 | mode = TDA10071_MODCOD[i].val; | 759 | mode = TDA10071_MODCOD[i].val; |
756 | dev_dbg(&priv->i2c->dev, "%s: mode found=%02x\n", | 760 | dev_dbg(&priv->i2c->dev, "%s: mode found=%02x\n", |
@@ -834,10 +838,10 @@ static int tda10071_get_frontend(struct dvb_frontend *fe) | |||
834 | 838 | ||
835 | switch ((buf[1] >> 0) & 0x01) { | 839 | switch ((buf[1] >> 0) & 0x01) { |
836 | case 0: | 840 | case 0: |
837 | c->inversion = INVERSION_OFF; | 841 | c->inversion = INVERSION_ON; |
838 | break; | 842 | break; |
839 | case 1: | 843 | case 1: |
840 | c->inversion = INVERSION_ON; | 844 | c->inversion = INVERSION_OFF; |
841 | break; | 845 | break; |
842 | } | 846 | } |
843 | 847 | ||
@@ -856,7 +860,7 @@ static int tda10071_get_frontend(struct dvb_frontend *fe) | |||
856 | if (ret) | 860 | if (ret) |
857 | goto error; | 861 | goto error; |
858 | 862 | ||
859 | c->symbol_rate = (buf[0] << 16) | (buf[1] << 8) | (buf[2] << 0); | 863 | c->symbol_rate = ((buf[0] << 16) | (buf[1] << 8) | (buf[2] << 0)) * 1000; |
860 | 864 | ||
861 | return ret; | 865 | return ret; |
862 | error: | 866 | error: |
diff --git a/drivers/media/dvb-frontends/tda10071_priv.h b/drivers/media/dvb-frontends/tda10071_priv.h index 4baf14bfb65a..420486192736 100644 --- a/drivers/media/dvb-frontends/tda10071_priv.h +++ b/drivers/media/dvb-frontends/tda10071_priv.h | |||
@@ -55,6 +55,7 @@ static struct tda10071_modcod { | |||
55 | { SYS_DVBS2, QPSK, FEC_8_9, 0x0a }, | 55 | { SYS_DVBS2, QPSK, FEC_8_9, 0x0a }, |
56 | { SYS_DVBS2, QPSK, FEC_9_10, 0x0b }, | 56 | { SYS_DVBS2, QPSK, FEC_9_10, 0x0b }, |
57 | /* 8PSK */ | 57 | /* 8PSK */ |
58 | { SYS_DVBS2, PSK_8, FEC_AUTO, 0x00 }, | ||
58 | { SYS_DVBS2, PSK_8, FEC_3_5, 0x0c }, | 59 | { SYS_DVBS2, PSK_8, FEC_3_5, 0x0c }, |
59 | { SYS_DVBS2, PSK_8, FEC_2_3, 0x0d }, | 60 | { SYS_DVBS2, PSK_8, FEC_2_3, 0x0d }, |
60 | { SYS_DVBS2, PSK_8, FEC_3_4, 0x0e }, | 61 | { SYS_DVBS2, PSK_8, FEC_3_4, 0x0e }, |
diff --git a/drivers/media/pci/saa7134/saa7134-empress.c b/drivers/media/pci/saa7134/saa7134-empress.c index e65c760e4e8b..0006d6bf8c18 100644 --- a/drivers/media/pci/saa7134/saa7134-empress.c +++ b/drivers/media/pci/saa7134/saa7134-empress.c | |||
@@ -179,7 +179,7 @@ static const struct v4l2_file_operations ts_fops = | |||
179 | .read = vb2_fop_read, | 179 | .read = vb2_fop_read, |
180 | .poll = vb2_fop_poll, | 180 | .poll = vb2_fop_poll, |
181 | .mmap = vb2_fop_mmap, | 181 | .mmap = vb2_fop_mmap, |
182 | .ioctl = video_ioctl2, | 182 | .unlocked_ioctl = video_ioctl2, |
183 | }; | 183 | }; |
184 | 184 | ||
185 | static const struct v4l2_ioctl_ops ts_ioctl_ops = { | 185 | static const struct v4l2_ioctl_ops ts_ioctl_ops = { |
diff --git a/drivers/media/platform/davinci/vpif_capture.c b/drivers/media/platform/davinci/vpif_capture.c index a7ed16497903..1e4ec697fb10 100644 --- a/drivers/media/platform/davinci/vpif_capture.c +++ b/drivers/media/platform/davinci/vpif_capture.c | |||
@@ -269,6 +269,7 @@ err: | |||
269 | list_del(&buf->list); | 269 | list_del(&buf->list); |
270 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED); | 270 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED); |
271 | } | 271 | } |
272 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
272 | 273 | ||
273 | return ret; | 274 | return ret; |
274 | } | 275 | } |
diff --git a/drivers/media/platform/davinci/vpif_display.c b/drivers/media/platform/davinci/vpif_display.c index 5bb085b19bcb..b431b58f39e3 100644 --- a/drivers/media/platform/davinci/vpif_display.c +++ b/drivers/media/platform/davinci/vpif_display.c | |||
@@ -233,6 +233,7 @@ err: | |||
233 | list_del(&buf->list); | 233 | list_del(&buf->list); |
234 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED); | 234 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED); |
235 | } | 235 | } |
236 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
236 | 237 | ||
237 | return ret; | 238 | return ret; |
238 | } | 239 | } |
diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c index 271a752cee54..fa4cc7b880aa 100644 --- a/drivers/media/tuners/si2157.c +++ b/drivers/media/tuners/si2157.c | |||
@@ -57,7 +57,7 @@ static int si2157_cmd_execute(struct si2157 *s, struct si2157_cmd *cmd) | |||
57 | jiffies_to_msecs(jiffies) - | 57 | jiffies_to_msecs(jiffies) - |
58 | (jiffies_to_msecs(timeout) - TIMEOUT)); | 58 | (jiffies_to_msecs(timeout) - TIMEOUT)); |
59 | 59 | ||
60 | if (!(buf[0] >> 7) & 0x01) { | 60 | if (!((buf[0] >> 7) & 0x01)) { |
61 | ret = -ETIMEDOUT; | 61 | ret = -ETIMEDOUT; |
62 | goto err_mutex_unlock; | 62 | goto err_mutex_unlock; |
63 | } else { | 63 | } else { |
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c index 021e4d35e4d7..7b9b75f60774 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.c +++ b/drivers/media/usb/dvb-usb-v2/af9035.c | |||
@@ -704,15 +704,41 @@ static int af9035_read_config(struct dvb_usb_device *d) | |||
704 | if (ret < 0) | 704 | if (ret < 0) |
705 | goto err; | 705 | goto err; |
706 | 706 | ||
707 | if (tmp == 0x00) | 707 | dev_dbg(&d->udev->dev, "%s: [%d]tuner=%02x\n", |
708 | dev_dbg(&d->udev->dev, | 708 | __func__, i, tmp); |
709 | "%s: [%d]tuner not set, using default\n", | 709 | |
710 | __func__, i); | 710 | /* tuner sanity check */ |
711 | else | 711 | if (state->chip_type == 0x9135) { |
712 | if (state->chip_version == 0x02) { | ||
713 | /* IT9135 BX (v2) */ | ||
714 | switch (tmp) { | ||
715 | case AF9033_TUNER_IT9135_60: | ||
716 | case AF9033_TUNER_IT9135_61: | ||
717 | case AF9033_TUNER_IT9135_62: | ||
718 | state->af9033_config[i].tuner = tmp; | ||
719 | break; | ||
720 | } | ||
721 | } else { | ||
722 | /* IT9135 AX (v1) */ | ||
723 | switch (tmp) { | ||
724 | case AF9033_TUNER_IT9135_38: | ||
725 | case AF9033_TUNER_IT9135_51: | ||
726 | case AF9033_TUNER_IT9135_52: | ||
727 | state->af9033_config[i].tuner = tmp; | ||
728 | break; | ||
729 | } | ||
730 | } | ||
731 | } else { | ||
732 | /* AF9035 */ | ||
712 | state->af9033_config[i].tuner = tmp; | 733 | state->af9033_config[i].tuner = tmp; |
734 | } | ||
713 | 735 | ||
714 | dev_dbg(&d->udev->dev, "%s: [%d]tuner=%02x\n", | 736 | if (state->af9033_config[i].tuner != tmp) { |
715 | __func__, i, state->af9033_config[i].tuner); | 737 | dev_info(&d->udev->dev, |
738 | "%s: [%d] overriding tuner from %02x to %02x\n", | ||
739 | KBUILD_MODNAME, i, tmp, | ||
740 | state->af9033_config[i].tuner); | ||
741 | } | ||
716 | 742 | ||
717 | switch (state->af9033_config[i].tuner) { | 743 | switch (state->af9033_config[i].tuner) { |
718 | case AF9033_TUNER_TUA9001: | 744 | case AF9033_TUNER_TUA9001: |
diff --git a/drivers/media/usb/gspca/pac7302.c b/drivers/media/usb/gspca/pac7302.c index 2fd1c5e31a0f..339adce7c7a5 100644 --- a/drivers/media/usb/gspca/pac7302.c +++ b/drivers/media/usb/gspca/pac7302.c | |||
@@ -928,6 +928,7 @@ static const struct usb_device_id device_table[] = { | |||
928 | {USB_DEVICE(0x093a, 0x2620)}, | 928 | {USB_DEVICE(0x093a, 0x2620)}, |
929 | {USB_DEVICE(0x093a, 0x2621)}, | 929 | {USB_DEVICE(0x093a, 0x2621)}, |
930 | {USB_DEVICE(0x093a, 0x2622), .driver_info = FL_VFLIP}, | 930 | {USB_DEVICE(0x093a, 0x2622), .driver_info = FL_VFLIP}, |
931 | {USB_DEVICE(0x093a, 0x2623), .driver_info = FL_VFLIP}, | ||
931 | {USB_DEVICE(0x093a, 0x2624), .driver_info = FL_VFLIP}, | 932 | {USB_DEVICE(0x093a, 0x2624), .driver_info = FL_VFLIP}, |
932 | {USB_DEVICE(0x093a, 0x2625)}, | 933 | {USB_DEVICE(0x093a, 0x2625)}, |
933 | {USB_DEVICE(0x093a, 0x2626)}, | 934 | {USB_DEVICE(0x093a, 0x2626)}, |
diff --git a/drivers/media/usb/hdpvr/hdpvr-video.c b/drivers/media/usb/hdpvr/hdpvr-video.c index 0500c4175d5f..6bce01a674f9 100644 --- a/drivers/media/usb/hdpvr/hdpvr-video.c +++ b/drivers/media/usb/hdpvr/hdpvr-video.c | |||
@@ -82,7 +82,7 @@ static void hdpvr_read_bulk_callback(struct urb *urb) | |||
82 | } | 82 | } |
83 | 83 | ||
84 | /*=========================================================================*/ | 84 | /*=========================================================================*/ |
85 | /* bufffer bits */ | 85 | /* buffer bits */ |
86 | 86 | ||
87 | /* function expects dev->io_mutex to be hold by caller */ | 87 | /* function expects dev->io_mutex to be hold by caller */ |
88 | int hdpvr_cancel_queue(struct hdpvr_device *dev) | 88 | int hdpvr_cancel_queue(struct hdpvr_device *dev) |
@@ -926,7 +926,7 @@ static int hdpvr_s_ctrl(struct v4l2_ctrl *ctrl) | |||
926 | case V4L2_CID_MPEG_AUDIO_ENCODING: | 926 | case V4L2_CID_MPEG_AUDIO_ENCODING: |
927 | if (dev->flags & HDPVR_FLAG_AC3_CAP) { | 927 | if (dev->flags & HDPVR_FLAG_AC3_CAP) { |
928 | opt->audio_codec = ctrl->val; | 928 | opt->audio_codec = ctrl->val; |
929 | return hdpvr_set_audio(dev, opt->audio_input, | 929 | return hdpvr_set_audio(dev, opt->audio_input + 1, |
930 | opt->audio_codec); | 930 | opt->audio_codec); |
931 | } | 931 | } |
932 | return 0; | 932 | return 0; |
@@ -1198,7 +1198,7 @@ int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent, | |||
1198 | v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops, | 1198 | v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops, |
1199 | V4L2_CID_MPEG_AUDIO_ENCODING, | 1199 | V4L2_CID_MPEG_AUDIO_ENCODING, |
1200 | ac3 ? V4L2_MPEG_AUDIO_ENCODING_AC3 : V4L2_MPEG_AUDIO_ENCODING_AAC, | 1200 | ac3 ? V4L2_MPEG_AUDIO_ENCODING_AC3 : V4L2_MPEG_AUDIO_ENCODING_AAC, |
1201 | 0x7, V4L2_MPEG_AUDIO_ENCODING_AAC); | 1201 | 0x7, ac3 ? dev->options.audio_codec : V4L2_MPEG_AUDIO_ENCODING_AAC); |
1202 | v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops, | 1202 | v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops, |
1203 | V4L2_CID_MPEG_VIDEO_ENCODING, | 1203 | V4L2_CID_MPEG_VIDEO_ENCODING, |
1204 | V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC, 0x3, | 1204 | V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC, 0x3, |
diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c index 4ae54caadd03..ce1c9f5d9dee 100644 --- a/drivers/media/v4l2-core/v4l2-dv-timings.c +++ b/drivers/media/v4l2-core/v4l2-dv-timings.c | |||
@@ -610,10 +610,10 @@ struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait) | |||
610 | aspect.denominator = 9; | 610 | aspect.denominator = 9; |
611 | } else if (ratio == 34) { | 611 | } else if (ratio == 34) { |
612 | aspect.numerator = 4; | 612 | aspect.numerator = 4; |
613 | aspect.numerator = 3; | 613 | aspect.denominator = 3; |
614 | } else if (ratio == 68) { | 614 | } else if (ratio == 68) { |
615 | aspect.numerator = 15; | 615 | aspect.numerator = 15; |
616 | aspect.numerator = 9; | 616 | aspect.denominator = 9; |
617 | } else { | 617 | } else { |
618 | aspect.numerator = hor_landscape + 99; | 618 | aspect.numerator = hor_landscape + 99; |
619 | aspect.denominator = 100; | 619 | aspect.denominator = 100; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_cq.c b/drivers/net/ethernet/mellanox/mlx4/en_cq.c index 14c00048bbec..82322b1c8411 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_cq.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_cq.c | |||
@@ -129,14 +129,15 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, | |||
129 | name); | 129 | name); |
130 | } | 130 | } |
131 | 131 | ||
132 | cq->irq_desc = | ||
133 | irq_to_desc(mlx4_eq_get_irq(mdev->dev, | ||
134 | cq->vector)); | ||
135 | } | 132 | } |
136 | } else { | 133 | } else { |
137 | cq->vector = (cq->ring + 1 + priv->port) % | 134 | cq->vector = (cq->ring + 1 + priv->port) % |
138 | mdev->dev->caps.num_comp_vectors; | 135 | mdev->dev->caps.num_comp_vectors; |
139 | } | 136 | } |
137 | |||
138 | cq->irq_desc = | ||
139 | irq_to_desc(mlx4_eq_get_irq(mdev->dev, | ||
140 | cq->vector)); | ||
140 | } else { | 141 | } else { |
141 | /* For TX we use the same irq per | 142 | /* For TX we use the same irq per |
142 | ring we assigned for the RX */ | 143 | ring we assigned for the RX */ |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 06bdc31a828d..61623e9af574 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -4240,6 +4240,8 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp) | |||
4240 | RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST); | 4240 | RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST); |
4241 | break; | 4241 | break; |
4242 | case RTL_GIGA_MAC_VER_40: | 4242 | case RTL_GIGA_MAC_VER_40: |
4243 | RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF); | ||
4244 | break; | ||
4243 | case RTL_GIGA_MAC_VER_41: | 4245 | case RTL_GIGA_MAC_VER_41: |
4244 | case RTL_GIGA_MAC_VER_42: | 4246 | case RTL_GIGA_MAC_VER_42: |
4245 | case RTL_GIGA_MAC_VER_43: | 4247 | case RTL_GIGA_MAC_VER_43: |
diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c index 1c24a8f368bd..fd411d6e19a2 100644 --- a/drivers/net/ethernet/sun/sunvnet.c +++ b/drivers/net/ethernet/sun/sunvnet.c | |||
@@ -1083,6 +1083,24 @@ static struct vnet *vnet_find_or_create(const u64 *local_mac) | |||
1083 | return vp; | 1083 | return vp; |
1084 | } | 1084 | } |
1085 | 1085 | ||
1086 | static void vnet_cleanup(void) | ||
1087 | { | ||
1088 | struct vnet *vp; | ||
1089 | struct net_device *dev; | ||
1090 | |||
1091 | mutex_lock(&vnet_list_mutex); | ||
1092 | while (!list_empty(&vnet_list)) { | ||
1093 | vp = list_first_entry(&vnet_list, struct vnet, list); | ||
1094 | list_del(&vp->list); | ||
1095 | dev = vp->dev; | ||
1096 | /* vio_unregister_driver() should have cleaned up port_list */ | ||
1097 | BUG_ON(!list_empty(&vp->port_list)); | ||
1098 | unregister_netdev(dev); | ||
1099 | free_netdev(dev); | ||
1100 | } | ||
1101 | mutex_unlock(&vnet_list_mutex); | ||
1102 | } | ||
1103 | |||
1086 | static const char *local_mac_prop = "local-mac-address"; | 1104 | static const char *local_mac_prop = "local-mac-address"; |
1087 | 1105 | ||
1088 | static struct vnet *vnet_find_parent(struct mdesc_handle *hp, | 1106 | static struct vnet *vnet_find_parent(struct mdesc_handle *hp, |
@@ -1240,7 +1258,6 @@ static int vnet_port_remove(struct vio_dev *vdev) | |||
1240 | 1258 | ||
1241 | kfree(port); | 1259 | kfree(port); |
1242 | 1260 | ||
1243 | unregister_netdev(vp->dev); | ||
1244 | } | 1261 | } |
1245 | return 0; | 1262 | return 0; |
1246 | } | 1263 | } |
@@ -1268,6 +1285,7 @@ static int __init vnet_init(void) | |||
1268 | static void __exit vnet_exit(void) | 1285 | static void __exit vnet_exit(void) |
1269 | { | 1286 | { |
1270 | vio_unregister_driver(&vnet_port_driver); | 1287 | vio_unregister_driver(&vnet_port_driver); |
1288 | vnet_cleanup(); | ||
1271 | } | 1289 | } |
1272 | 1290 | ||
1273 | module_init(vnet_init); | 1291 | module_init(vnet_init); |
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index e2f20f807de8..d5b77ef3a210 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c | |||
@@ -757,10 +757,15 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
757 | }; | 757 | }; |
758 | 758 | ||
759 | ppp_lock(ppp); | 759 | ppp_lock(ppp); |
760 | if (ppp->pass_filter) | 760 | if (ppp->pass_filter) { |
761 | sk_unattached_filter_destroy(ppp->pass_filter); | 761 | sk_unattached_filter_destroy(ppp->pass_filter); |
762 | err = sk_unattached_filter_create(&ppp->pass_filter, | 762 | ppp->pass_filter = NULL; |
763 | &fprog); | 763 | } |
764 | if (fprog.filter != NULL) | ||
765 | err = sk_unattached_filter_create(&ppp->pass_filter, | ||
766 | &fprog); | ||
767 | else | ||
768 | err = 0; | ||
764 | kfree(code); | 769 | kfree(code); |
765 | ppp_unlock(ppp); | 770 | ppp_unlock(ppp); |
766 | } | 771 | } |
@@ -778,10 +783,15 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
778 | }; | 783 | }; |
779 | 784 | ||
780 | ppp_lock(ppp); | 785 | ppp_lock(ppp); |
781 | if (ppp->active_filter) | 786 | if (ppp->active_filter) { |
782 | sk_unattached_filter_destroy(ppp->active_filter); | 787 | sk_unattached_filter_destroy(ppp->active_filter); |
783 | err = sk_unattached_filter_create(&ppp->active_filter, | 788 | ppp->active_filter = NULL; |
784 | &fprog); | 789 | } |
790 | if (fprog.filter != NULL) | ||
791 | err = sk_unattached_filter_create(&ppp->active_filter, | ||
792 | &fprog); | ||
793 | else | ||
794 | err = 0; | ||
785 | kfree(code); | 795 | kfree(code); |
786 | ppp_unlock(ppp); | 796 | ppp_unlock(ppp); |
787 | } | 797 | } |
diff --git a/drivers/net/usb/huawei_cdc_ncm.c b/drivers/net/usb/huawei_cdc_ncm.c index 5d95a13dbe2a..735f7dadb9a0 100644 --- a/drivers/net/usb/huawei_cdc_ncm.c +++ b/drivers/net/usb/huawei_cdc_ncm.c | |||
@@ -194,6 +194,9 @@ static const struct usb_device_id huawei_cdc_ncm_devs[] = { | |||
194 | { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x76), | 194 | { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x76), |
195 | .driver_info = (unsigned long)&huawei_cdc_ncm_info, | 195 | .driver_info = (unsigned long)&huawei_cdc_ncm_info, |
196 | }, | 196 | }, |
197 | { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x03, 0x16), | ||
198 | .driver_info = (unsigned long)&huawei_cdc_ncm_info, | ||
199 | }, | ||
197 | 200 | ||
198 | /* Terminating entry */ | 201 | /* Terminating entry */ |
199 | { | 202 | { |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index c4638c67f6b9..22756db53dca 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -667,6 +667,7 @@ static const struct usb_device_id products[] = { | |||
667 | {QMI_FIXED_INTF(0x05c6, 0x9084, 4)}, | 667 | {QMI_FIXED_INTF(0x05c6, 0x9084, 4)}, |
668 | {QMI_FIXED_INTF(0x05c6, 0x920d, 0)}, | 668 | {QMI_FIXED_INTF(0x05c6, 0x920d, 0)}, |
669 | {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, | 669 | {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, |
670 | {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, | ||
670 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ | 671 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
671 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ | 672 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ |
672 | {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ | 673 | {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ |
@@ -757,6 +758,7 @@ static const struct usb_device_id products[] = { | |||
757 | {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */ | 758 | {QMI_FIXED_INTF(0x1199, 0x9054, 8)}, /* Sierra Wireless Modem */ |
758 | {QMI_FIXED_INTF(0x1199, 0x9055, 8)}, /* Netgear AirCard 341U */ | 759 | {QMI_FIXED_INTF(0x1199, 0x9055, 8)}, /* Netgear AirCard 341U */ |
759 | {QMI_FIXED_INTF(0x1199, 0x9056, 8)}, /* Sierra Wireless Modem */ | 760 | {QMI_FIXED_INTF(0x1199, 0x9056, 8)}, /* Sierra Wireless Modem */ |
761 | {QMI_FIXED_INTF(0x1199, 0x9057, 8)}, | ||
760 | {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */ | 762 | {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */ |
761 | {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ | 763 | {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ |
762 | {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ | 764 | {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ |
diff --git a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c index 5895f1978691..fa9fdfa128c1 100644 --- a/drivers/net/wan/x25_asy.c +++ b/drivers/net/wan/x25_asy.c | |||
@@ -122,8 +122,12 @@ static int x25_asy_change_mtu(struct net_device *dev, int newmtu) | |||
122 | { | 122 | { |
123 | struct x25_asy *sl = netdev_priv(dev); | 123 | struct x25_asy *sl = netdev_priv(dev); |
124 | unsigned char *xbuff, *rbuff; | 124 | unsigned char *xbuff, *rbuff; |
125 | int len = 2 * newmtu; | 125 | int len; |
126 | 126 | ||
127 | if (newmtu > 65534) | ||
128 | return -EINVAL; | ||
129 | |||
130 | len = 2 * newmtu; | ||
127 | xbuff = kmalloc(len + 4, GFP_ATOMIC); | 131 | xbuff = kmalloc(len + 4, GFP_ATOMIC); |
128 | rbuff = kmalloc(len + 4, GFP_ATOMIC); | 132 | rbuff = kmalloc(len + 4, GFP_ATOMIC); |
129 | 133 | ||
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 1844a47636b6..c65b636bcab9 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -1030,14 +1030,21 @@ static int xenvif_tx_check_gop(struct xenvif_queue *queue, | |||
1030 | { | 1030 | { |
1031 | struct gnttab_map_grant_ref *gop_map = *gopp_map; | 1031 | struct gnttab_map_grant_ref *gop_map = *gopp_map; |
1032 | u16 pending_idx = XENVIF_TX_CB(skb)->pending_idx; | 1032 | u16 pending_idx = XENVIF_TX_CB(skb)->pending_idx; |
1033 | /* This always points to the shinfo of the skb being checked, which | ||
1034 | * could be either the first or the one on the frag_list | ||
1035 | */ | ||
1033 | struct skb_shared_info *shinfo = skb_shinfo(skb); | 1036 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
1037 | /* If this is non-NULL, we are currently checking the frag_list skb, and | ||
1038 | * this points to the shinfo of the first one | ||
1039 | */ | ||
1040 | struct skb_shared_info *first_shinfo = NULL; | ||
1034 | int nr_frags = shinfo->nr_frags; | 1041 | int nr_frags = shinfo->nr_frags; |
1042 | const bool sharedslot = nr_frags && | ||
1043 | frag_get_pending_idx(&shinfo->frags[0]) == pending_idx; | ||
1035 | int i, err; | 1044 | int i, err; |
1036 | struct sk_buff *first_skb = NULL; | ||
1037 | 1045 | ||
1038 | /* Check status of header. */ | 1046 | /* Check status of header. */ |
1039 | err = (*gopp_copy)->status; | 1047 | err = (*gopp_copy)->status; |
1040 | (*gopp_copy)++; | ||
1041 | if (unlikely(err)) { | 1048 | if (unlikely(err)) { |
1042 | if (net_ratelimit()) | 1049 | if (net_ratelimit()) |
1043 | netdev_dbg(queue->vif->dev, | 1050 | netdev_dbg(queue->vif->dev, |
@@ -1045,8 +1052,12 @@ static int xenvif_tx_check_gop(struct xenvif_queue *queue, | |||
1045 | (*gopp_copy)->status, | 1052 | (*gopp_copy)->status, |
1046 | pending_idx, | 1053 | pending_idx, |
1047 | (*gopp_copy)->source.u.ref); | 1054 | (*gopp_copy)->source.u.ref); |
1048 | xenvif_idx_release(queue, pending_idx, XEN_NETIF_RSP_ERROR); | 1055 | /* The first frag might still have this slot mapped */ |
1056 | if (!sharedslot) | ||
1057 | xenvif_idx_release(queue, pending_idx, | ||
1058 | XEN_NETIF_RSP_ERROR); | ||
1049 | } | 1059 | } |
1060 | (*gopp_copy)++; | ||
1050 | 1061 | ||
1051 | check_frags: | 1062 | check_frags: |
1052 | for (i = 0; i < nr_frags; i++, gop_map++) { | 1063 | for (i = 0; i < nr_frags; i++, gop_map++) { |
@@ -1062,8 +1073,19 @@ check_frags: | |||
1062 | pending_idx, | 1073 | pending_idx, |
1063 | gop_map->handle); | 1074 | gop_map->handle); |
1064 | /* Had a previous error? Invalidate this fragment. */ | 1075 | /* Had a previous error? Invalidate this fragment. */ |
1065 | if (unlikely(err)) | 1076 | if (unlikely(err)) { |
1066 | xenvif_idx_unmap(queue, pending_idx); | 1077 | xenvif_idx_unmap(queue, pending_idx); |
1078 | /* If the mapping of the first frag was OK, but | ||
1079 | * the header's copy failed, and they are | ||
1080 | * sharing a slot, send an error | ||
1081 | */ | ||
1082 | if (i == 0 && sharedslot) | ||
1083 | xenvif_idx_release(queue, pending_idx, | ||
1084 | XEN_NETIF_RSP_ERROR); | ||
1085 | else | ||
1086 | xenvif_idx_release(queue, pending_idx, | ||
1087 | XEN_NETIF_RSP_OKAY); | ||
1088 | } | ||
1067 | continue; | 1089 | continue; |
1068 | } | 1090 | } |
1069 | 1091 | ||
@@ -1075,42 +1097,53 @@ check_frags: | |||
1075 | gop_map->status, | 1097 | gop_map->status, |
1076 | pending_idx, | 1098 | pending_idx, |
1077 | gop_map->ref); | 1099 | gop_map->ref); |
1100 | |||
1078 | xenvif_idx_release(queue, pending_idx, XEN_NETIF_RSP_ERROR); | 1101 | xenvif_idx_release(queue, pending_idx, XEN_NETIF_RSP_ERROR); |
1079 | 1102 | ||
1080 | /* Not the first error? Preceding frags already invalidated. */ | 1103 | /* Not the first error? Preceding frags already invalidated. */ |
1081 | if (err) | 1104 | if (err) |
1082 | continue; | 1105 | continue; |
1083 | /* First error: invalidate preceding fragments. */ | 1106 | |
1107 | /* First error: if the header haven't shared a slot with the | ||
1108 | * first frag, release it as well. | ||
1109 | */ | ||
1110 | if (!sharedslot) | ||
1111 | xenvif_idx_release(queue, | ||
1112 | XENVIF_TX_CB(skb)->pending_idx, | ||
1113 | XEN_NETIF_RSP_OKAY); | ||
1114 | |||
1115 | /* Invalidate preceding fragments of this skb. */ | ||
1084 | for (j = 0; j < i; j++) { | 1116 | for (j = 0; j < i; j++) { |
1085 | pending_idx = frag_get_pending_idx(&shinfo->frags[j]); | 1117 | pending_idx = frag_get_pending_idx(&shinfo->frags[j]); |
1086 | xenvif_idx_unmap(queue, pending_idx); | 1118 | xenvif_idx_unmap(queue, pending_idx); |
1119 | xenvif_idx_release(queue, pending_idx, | ||
1120 | XEN_NETIF_RSP_OKAY); | ||
1121 | } | ||
1122 | |||
1123 | /* And if we found the error while checking the frag_list, unmap | ||
1124 | * the first skb's frags | ||
1125 | */ | ||
1126 | if (first_shinfo) { | ||
1127 | for (j = 0; j < first_shinfo->nr_frags; j++) { | ||
1128 | pending_idx = frag_get_pending_idx(&first_shinfo->frags[j]); | ||
1129 | xenvif_idx_unmap(queue, pending_idx); | ||
1130 | xenvif_idx_release(queue, pending_idx, | ||
1131 | XEN_NETIF_RSP_OKAY); | ||
1132 | } | ||
1087 | } | 1133 | } |
1088 | 1134 | ||
1089 | /* Remember the error: invalidate all subsequent fragments. */ | 1135 | /* Remember the error: invalidate all subsequent fragments. */ |
1090 | err = newerr; | 1136 | err = newerr; |
1091 | } | 1137 | } |
1092 | 1138 | ||
1093 | if (skb_has_frag_list(skb)) { | 1139 | if (skb_has_frag_list(skb) && !first_shinfo) { |
1094 | first_skb = skb; | 1140 | first_shinfo = skb_shinfo(skb); |
1095 | skb = shinfo->frag_list; | 1141 | shinfo = skb_shinfo(skb_shinfo(skb)->frag_list); |
1096 | shinfo = skb_shinfo(skb); | ||
1097 | nr_frags = shinfo->nr_frags; | 1142 | nr_frags = shinfo->nr_frags; |
1098 | 1143 | ||
1099 | goto check_frags; | 1144 | goto check_frags; |
1100 | } | 1145 | } |
1101 | 1146 | ||
1102 | /* There was a mapping error in the frag_list skb. We have to unmap | ||
1103 | * the first skb's frags | ||
1104 | */ | ||
1105 | if (first_skb && err) { | ||
1106 | int j; | ||
1107 | shinfo = skb_shinfo(first_skb); | ||
1108 | for (j = 0; j < shinfo->nr_frags; j++) { | ||
1109 | pending_idx = frag_get_pending_idx(&shinfo->frags[j]); | ||
1110 | xenvif_idx_unmap(queue, pending_idx); | ||
1111 | } | ||
1112 | } | ||
1113 | |||
1114 | *gopp_map = gop_map; | 1147 | *gopp_map = gop_map; |
1115 | return err; | 1148 | return err; |
1116 | } | 1149 | } |
@@ -1518,7 +1551,16 @@ static int xenvif_tx_submit(struct xenvif_queue *queue) | |||
1518 | 1551 | ||
1519 | /* Check the remap error code. */ | 1552 | /* Check the remap error code. */ |
1520 | if (unlikely(xenvif_tx_check_gop(queue, skb, &gop_map, &gop_copy))) { | 1553 | if (unlikely(xenvif_tx_check_gop(queue, skb, &gop_map, &gop_copy))) { |
1554 | /* If there was an error, xenvif_tx_check_gop is | ||
1555 | * expected to release all the frags which were mapped, | ||
1556 | * so kfree_skb shouldn't do it again | ||
1557 | */ | ||
1521 | skb_shinfo(skb)->nr_frags = 0; | 1558 | skb_shinfo(skb)->nr_frags = 0; |
1559 | if (skb_has_frag_list(skb)) { | ||
1560 | struct sk_buff *nskb = | ||
1561 | skb_shinfo(skb)->frag_list; | ||
1562 | skb_shinfo(nskb)->nr_frags = 0; | ||
1563 | } | ||
1522 | kfree_skb(skb); | 1564 | kfree_skb(skb); |
1523 | continue; | 1565 | continue; |
1524 | } | 1566 | } |
@@ -1822,8 +1864,6 @@ void xenvif_idx_unmap(struct xenvif_queue *queue, u16 pending_idx) | |||
1822 | tx_unmap_op.status); | 1864 | tx_unmap_op.status); |
1823 | BUG(); | 1865 | BUG(); |
1824 | } | 1866 | } |
1825 | |||
1826 | xenvif_idx_release(queue, pending_idx, XEN_NETIF_RSP_OKAY); | ||
1827 | } | 1867 | } |
1828 | 1868 | ||
1829 | static inline int rx_work_todo(struct xenvif_queue *queue) | 1869 | static inline int rx_work_todo(struct xenvif_queue *queue) |
diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index 2872ece81f35..44333bd8f908 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig | |||
@@ -5,6 +5,12 @@ | |||
5 | # Parport configuration. | 5 | # Parport configuration. |
6 | # | 6 | # |
7 | 7 | ||
8 | config ARCH_MIGHT_HAVE_PC_PARPORT | ||
9 | bool | ||
10 | help | ||
11 | Select this config option from the architecture Kconfig if | ||
12 | the architecture might have PC parallel port hardware. | ||
13 | |||
8 | menuconfig PARPORT | 14 | menuconfig PARPORT |
9 | tristate "Parallel port support" | 15 | tristate "Parallel port support" |
10 | depends on HAS_IOMEM | 16 | depends on HAS_IOMEM |
@@ -31,12 +37,6 @@ menuconfig PARPORT | |||
31 | 37 | ||
32 | If unsure, say Y. | 38 | If unsure, say Y. |
33 | 39 | ||
34 | config ARCH_MIGHT_HAVE_PC_PARPORT | ||
35 | bool | ||
36 | help | ||
37 | Select this config option from the architecture Kconfig if | ||
38 | the architecture might have PC parallel port hardware. | ||
39 | |||
40 | if PARPORT | 40 | if PARPORT |
41 | 41 | ||
42 | config PARPORT_PC | 42 | config PARPORT_PC |
diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c index 1bd6363bc95e..9f43916637ca 100644 --- a/drivers/pinctrl/pinctrl-st.c +++ b/drivers/pinctrl/pinctrl-st.c | |||
@@ -1431,7 +1431,7 @@ static void st_gpio_irqmux_handler(unsigned irq, struct irq_desc *desc) | |||
1431 | 1431 | ||
1432 | status = readl(info->irqmux_base); | 1432 | status = readl(info->irqmux_base); |
1433 | 1433 | ||
1434 | for_each_set_bit(n, &status, ST_GPIO_PINS_PER_BANK) | 1434 | for_each_set_bit(n, &status, info->nbanks) |
1435 | __gpio_irq_handler(&info->banks[n]); | 1435 | __gpio_irq_handler(&info->banks[n]); |
1436 | 1436 | ||
1437 | chained_irq_exit(chip, desc); | 1437 | chained_irq_exit(chip, desc); |
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index 15b3459f8656..220acb4cbee5 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c | |||
@@ -633,7 +633,6 @@ raw3270_reset_device_cb(struct raw3270_request *rq, void *data) | |||
633 | } else | 633 | } else |
634 | raw3270_writesf_readpart(rp); | 634 | raw3270_writesf_readpart(rp); |
635 | memset(&rp->init_reset, 0, sizeof(rp->init_reset)); | 635 | memset(&rp->init_reset, 0, sizeof(rp->init_reset)); |
636 | memset(&rp->init_data, 0, sizeof(rp->init_data)); | ||
637 | } | 636 | } |
638 | 637 | ||
639 | static int | 638 | static int |
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index 69ef4f8cfac8..4038437ff033 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -901,10 +901,15 @@ static int ap_device_probe(struct device *dev) | |||
901 | int rc; | 901 | int rc; |
902 | 902 | ||
903 | ap_dev->drv = ap_drv; | 903 | ap_dev->drv = ap_drv; |
904 | |||
905 | spin_lock_bh(&ap_device_list_lock); | ||
906 | list_add(&ap_dev->list, &ap_device_list); | ||
907 | spin_unlock_bh(&ap_device_list_lock); | ||
908 | |||
904 | rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; | 909 | rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; |
905 | if (!rc) { | 910 | if (rc) { |
906 | spin_lock_bh(&ap_device_list_lock); | 911 | spin_lock_bh(&ap_device_list_lock); |
907 | list_add(&ap_dev->list, &ap_device_list); | 912 | list_del_init(&ap_dev->list); |
908 | spin_unlock_bh(&ap_device_list_lock); | 913 | spin_unlock_bh(&ap_device_list_lock); |
909 | } | 914 | } |
910 | return rc; | 915 | return rc; |
diff --git a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c index 160e7510aca6..0787b9756165 100644 --- a/drivers/sbus/char/bbc_envctrl.c +++ b/drivers/sbus/char/bbc_envctrl.c | |||
@@ -452,6 +452,9 @@ static void attach_one_temp(struct bbc_i2c_bus *bp, struct platform_device *op, | |||
452 | if (!tp) | 452 | if (!tp) |
453 | return; | 453 | return; |
454 | 454 | ||
455 | INIT_LIST_HEAD(&tp->bp_list); | ||
456 | INIT_LIST_HEAD(&tp->glob_list); | ||
457 | |||
455 | tp->client = bbc_i2c_attach(bp, op); | 458 | tp->client = bbc_i2c_attach(bp, op); |
456 | if (!tp->client) { | 459 | if (!tp->client) { |
457 | kfree(tp); | 460 | kfree(tp); |
@@ -497,6 +500,9 @@ static void attach_one_fan(struct bbc_i2c_bus *bp, struct platform_device *op, | |||
497 | if (!fp) | 500 | if (!fp) |
498 | return; | 501 | return; |
499 | 502 | ||
503 | INIT_LIST_HEAD(&fp->bp_list); | ||
504 | INIT_LIST_HEAD(&fp->glob_list); | ||
505 | |||
500 | fp->client = bbc_i2c_attach(bp, op); | 506 | fp->client = bbc_i2c_attach(bp, op); |
501 | if (!fp->client) { | 507 | if (!fp->client) { |
502 | kfree(fp); | 508 | kfree(fp); |
diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c index c7763e482eb2..812b5f0361b6 100644 --- a/drivers/sbus/char/bbc_i2c.c +++ b/drivers/sbus/char/bbc_i2c.c | |||
@@ -300,13 +300,18 @@ static struct bbc_i2c_bus * attach_one_i2c(struct platform_device *op, int index | |||
300 | if (!bp) | 300 | if (!bp) |
301 | return NULL; | 301 | return NULL; |
302 | 302 | ||
303 | INIT_LIST_HEAD(&bp->temps); | ||
304 | INIT_LIST_HEAD(&bp->fans); | ||
305 | |||
303 | bp->i2c_control_regs = of_ioremap(&op->resource[0], 0, 0x2, "bbc_i2c_regs"); | 306 | bp->i2c_control_regs = of_ioremap(&op->resource[0], 0, 0x2, "bbc_i2c_regs"); |
304 | if (!bp->i2c_control_regs) | 307 | if (!bp->i2c_control_regs) |
305 | goto fail; | 308 | goto fail; |
306 | 309 | ||
307 | bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel"); | 310 | if (op->num_resources == 2) { |
308 | if (!bp->i2c_bussel_reg) | 311 | bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel"); |
309 | goto fail; | 312 | if (!bp->i2c_bussel_reg) |
313 | goto fail; | ||
314 | } | ||
310 | 315 | ||
311 | bp->waiting = 0; | 316 | bp->waiting = 0; |
312 | init_waitqueue_head(&bp->wq); | 317 | init_waitqueue_head(&bp->wq); |
diff --git a/drivers/staging/media/omap4iss/Kconfig b/drivers/staging/media/omap4iss/Kconfig index 78b0fba7047e..8afc6fee40c5 100644 --- a/drivers/staging/media/omap4iss/Kconfig +++ b/drivers/staging/media/omap4iss/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config VIDEO_OMAP4 | 1 | config VIDEO_OMAP4 |
2 | bool "OMAP 4 Camera support" | 2 | bool "OMAP 4 Camera support" |
3 | depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API && I2C && ARCH_OMAP4 | 3 | depends on VIDEO_V4L2=y && VIDEO_V4L2_SUBDEV_API && I2C=y && ARCH_OMAP4 |
4 | select VIDEOBUF2_DMA_CONTIG | 4 | select VIDEOBUF2_DMA_CONTIG |
5 | ---help--- | 5 | ---help--- |
6 | Driver for an OMAP 4 ISS controller. | 6 | Driver for an OMAP 4 ISS controller. |
diff --git a/drivers/tty/serial/sunsab.c b/drivers/tty/serial/sunsab.c index 2f57df9a71d9..a1e09c0d46f2 100644 --- a/drivers/tty/serial/sunsab.c +++ b/drivers/tty/serial/sunsab.c | |||
@@ -157,6 +157,15 @@ receive_chars(struct uart_sunsab_port *up, | |||
157 | (up->port.line == up->port.cons->index)) | 157 | (up->port.line == up->port.cons->index)) |
158 | saw_console_brk = 1; | 158 | saw_console_brk = 1; |
159 | 159 | ||
160 | if (count == 0) { | ||
161 | if (unlikely(stat->sreg.isr1 & SAB82532_ISR1_BRK)) { | ||
162 | stat->sreg.isr0 &= ~(SAB82532_ISR0_PERR | | ||
163 | SAB82532_ISR0_FERR); | ||
164 | up->port.icount.brk++; | ||
165 | uart_handle_break(&up->port); | ||
166 | } | ||
167 | } | ||
168 | |||
160 | for (i = 0; i < count; i++) { | 169 | for (i = 0; i < count; i++) { |
161 | unsigned char ch = buf[i], flag; | 170 | unsigned char ch = buf[i], flag; |
162 | 171 | ||
diff --git a/fs/coredump.c b/fs/coredump.c index 0b2528fb640e..a93f7e6ea4cf 100644 --- a/fs/coredump.c +++ b/fs/coredump.c | |||
@@ -306,7 +306,7 @@ static int zap_threads(struct task_struct *tsk, struct mm_struct *mm, | |||
306 | if (unlikely(nr < 0)) | 306 | if (unlikely(nr < 0)) |
307 | return nr; | 307 | return nr; |
308 | 308 | ||
309 | tsk->flags = PF_DUMPCORE; | 309 | tsk->flags |= PF_DUMPCORE; |
310 | if (atomic_read(&mm->mm_users) == nr + 1) | 310 | if (atomic_read(&mm->mm_users) == nr + 1) |
311 | goto done; | 311 | goto done; |
312 | /* | 312 | /* |
diff --git a/fs/direct-io.c b/fs/direct-io.c index 98040ba388ac..194d0d122cae 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -198,9 +198,8 @@ static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio) | |||
198 | * L1 cache. | 198 | * L1 cache. |
199 | */ | 199 | */ |
200 | static inline struct page *dio_get_page(struct dio *dio, | 200 | static inline struct page *dio_get_page(struct dio *dio, |
201 | struct dio_submit *sdio, size_t *from, size_t *to) | 201 | struct dio_submit *sdio) |
202 | { | 202 | { |
203 | int n; | ||
204 | if (dio_pages_present(sdio) == 0) { | 203 | if (dio_pages_present(sdio) == 0) { |
205 | int ret; | 204 | int ret; |
206 | 205 | ||
@@ -209,10 +208,7 @@ static inline struct page *dio_get_page(struct dio *dio, | |||
209 | return ERR_PTR(ret); | 208 | return ERR_PTR(ret); |
210 | BUG_ON(dio_pages_present(sdio) == 0); | 209 | BUG_ON(dio_pages_present(sdio) == 0); |
211 | } | 210 | } |
212 | n = sdio->head++; | 211 | return dio->pages[sdio->head]; |
213 | *from = n ? 0 : sdio->from; | ||
214 | *to = (n == sdio->tail - 1) ? sdio->to : PAGE_SIZE; | ||
215 | return dio->pages[n]; | ||
216 | } | 212 | } |
217 | 213 | ||
218 | /** | 214 | /** |
@@ -911,11 +907,15 @@ static int do_direct_IO(struct dio *dio, struct dio_submit *sdio, | |||
911 | while (sdio->block_in_file < sdio->final_block_in_request) { | 907 | while (sdio->block_in_file < sdio->final_block_in_request) { |
912 | struct page *page; | 908 | struct page *page; |
913 | size_t from, to; | 909 | size_t from, to; |
914 | page = dio_get_page(dio, sdio, &from, &to); | 910 | |
911 | page = dio_get_page(dio, sdio); | ||
915 | if (IS_ERR(page)) { | 912 | if (IS_ERR(page)) { |
916 | ret = PTR_ERR(page); | 913 | ret = PTR_ERR(page); |
917 | goto out; | 914 | goto out; |
918 | } | 915 | } |
916 | from = sdio->head ? 0 : sdio->from; | ||
917 | to = (sdio->head == sdio->tail - 1) ? sdio->to : PAGE_SIZE; | ||
918 | sdio->head++; | ||
919 | 919 | ||
920 | while (from < to) { | 920 | while (from < to) { |
921 | unsigned this_chunk_bytes; /* # of bytes mapped */ | 921 | unsigned this_chunk_bytes; /* # of bytes mapped */ |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 8474028d7848..03246cd9d47a 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -907,9 +907,6 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req) | |||
907 | fc->writeback_cache = 1; | 907 | fc->writeback_cache = 1; |
908 | if (arg->time_gran && arg->time_gran <= 1000000000) | 908 | if (arg->time_gran && arg->time_gran <= 1000000000) |
909 | fc->sb->s_time_gran = arg->time_gran; | 909 | fc->sb->s_time_gran = arg->time_gran; |
910 | else | ||
911 | fc->sb->s_time_gran = 1000000000; | ||
912 | |||
913 | } else { | 910 | } else { |
914 | ra_pages = fc->max_read / PAGE_CACHE_SIZE; | 911 | ra_pages = fc->max_read / PAGE_CACHE_SIZE; |
915 | fc->no_lock = 1; | 912 | fc->no_lock = 1; |
@@ -938,7 +935,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req) | |||
938 | FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ | | 935 | FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ | |
939 | FUSE_FLOCK_LOCKS | FUSE_IOCTL_DIR | FUSE_AUTO_INVAL_DATA | | 936 | FUSE_FLOCK_LOCKS | FUSE_IOCTL_DIR | FUSE_AUTO_INVAL_DATA | |
940 | FUSE_DO_READDIRPLUS | FUSE_READDIRPLUS_AUTO | FUSE_ASYNC_DIO | | 937 | FUSE_DO_READDIRPLUS | FUSE_READDIRPLUS_AUTO | FUSE_ASYNC_DIO | |
941 | FUSE_WRITEBACK_CACHE; | 938 | FUSE_WRITEBACK_CACHE | FUSE_NO_OPEN_SUPPORT; |
942 | req->in.h.opcode = FUSE_INIT; | 939 | req->in.h.opcode = FUSE_INIT; |
943 | req->in.numargs = 1; | 940 | req->in.numargs = 1; |
944 | req->in.args[0].size = sizeof(*arg); | 941 | req->in.args[0].size = sizeof(*arg); |
diff --git a/fs/namei.c b/fs/namei.c index 985c6f368485..9eb787e5c167 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -2256,9 +2256,10 @@ done: | |||
2256 | goto out; | 2256 | goto out; |
2257 | } | 2257 | } |
2258 | path->dentry = dentry; | 2258 | path->dentry = dentry; |
2259 | path->mnt = mntget(nd->path.mnt); | 2259 | path->mnt = nd->path.mnt; |
2260 | if (should_follow_link(dentry, nd->flags & LOOKUP_FOLLOW)) | 2260 | if (should_follow_link(dentry, nd->flags & LOOKUP_FOLLOW)) |
2261 | return 1; | 2261 | return 1; |
2262 | mntget(path->mnt); | ||
2262 | follow_mount(path); | 2263 | follow_mount(path); |
2263 | error = 0; | 2264 | error = 0; |
2264 | out: | 2265 | out: |
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index b56b1cc02718..944275c8f56d 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -2879,6 +2879,7 @@ again: | |||
2879 | * return the conflicting open: | 2879 | * return the conflicting open: |
2880 | */ | 2880 | */ |
2881 | if (conf->len) { | 2881 | if (conf->len) { |
2882 | kfree(conf->data); | ||
2882 | conf->len = 0; | 2883 | conf->len = 0; |
2883 | conf->data = NULL; | 2884 | conf->data = NULL; |
2884 | goto again; | 2885 | goto again; |
@@ -2891,6 +2892,7 @@ again: | |||
2891 | if (conf->len) { | 2892 | if (conf->len) { |
2892 | p = xdr_encode_opaque_fixed(p, &ld->ld_clientid, 8); | 2893 | p = xdr_encode_opaque_fixed(p, &ld->ld_clientid, 8); |
2893 | p = xdr_encode_opaque(p, conf->data, conf->len); | 2894 | p = xdr_encode_opaque(p, conf->data, conf->len); |
2895 | kfree(conf->data); | ||
2894 | } else { /* non - nfsv4 lock in conflict, no clientid nor owner */ | 2896 | } else { /* non - nfsv4 lock in conflict, no clientid nor owner */ |
2895 | p = xdr_encode_hyper(p, (u64)0); /* clientid */ | 2897 | p = xdr_encode_hyper(p, (u64)0); /* clientid */ |
2896 | *p++ = cpu_to_be32(0); /* length of owner name */ | 2898 | *p++ = cpu_to_be32(0); /* length of owner name */ |
@@ -2907,7 +2909,7 @@ nfsd4_encode_lock(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_lo | |||
2907 | nfserr = nfsd4_encode_stateid(xdr, &lock->lk_resp_stateid); | 2909 | nfserr = nfsd4_encode_stateid(xdr, &lock->lk_resp_stateid); |
2908 | else if (nfserr == nfserr_denied) | 2910 | else if (nfserr == nfserr_denied) |
2909 | nfserr = nfsd4_encode_lock_denied(xdr, &lock->lk_denied); | 2911 | nfserr = nfsd4_encode_lock_denied(xdr, &lock->lk_denied); |
2910 | kfree(lock->lk_denied.ld_owner.data); | 2912 | |
2911 | return nfserr; | 2913 | return nfserr; |
2912 | } | 2914 | } |
2913 | 2915 | ||
diff --git a/fs/xattr.c b/fs/xattr.c index 3377dff18404..c69e6d43a0d2 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -843,7 +843,7 @@ struct simple_xattr *simple_xattr_alloc(const void *value, size_t size) | |||
843 | 843 | ||
844 | /* wrap around? */ | 844 | /* wrap around? */ |
845 | len = sizeof(*new_xattr) + size; | 845 | len = sizeof(*new_xattr) + size; |
846 | if (len <= sizeof(*new_xattr)) | 846 | if (len < sizeof(*new_xattr)) |
847 | return NULL; | 847 | return NULL; |
848 | 848 | ||
849 | new_xattr = kmalloc(len, GFP_KERNEL); | 849 | new_xattr = kmalloc(len, GFP_KERNEL); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 5ab4e3a76721..92abb497ab14 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -593,6 +593,7 @@ struct ata_host { | |||
593 | struct device *dev; | 593 | struct device *dev; |
594 | void __iomem * const *iomap; | 594 | void __iomem * const *iomap; |
595 | unsigned int n_ports; | 595 | unsigned int n_ports; |
596 | unsigned int n_tags; /* nr of NCQ tags */ | ||
596 | void *private_data; | 597 | void *private_data; |
597 | struct ata_port_operations *ops; | 598 | struct ata_port_operations *ops; |
598 | unsigned long flags; | 599 | unsigned long flags; |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 0a97b583ee8d..e1474ae18c88 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -399,6 +399,18 @@ static inline struct page *read_mapping_page(struct address_space *mapping, | |||
399 | } | 399 | } |
400 | 400 | ||
401 | /* | 401 | /* |
402 | * Get the offset in PAGE_SIZE. | ||
403 | * (TODO: hugepage should have ->index in PAGE_SIZE) | ||
404 | */ | ||
405 | static inline pgoff_t page_to_pgoff(struct page *page) | ||
406 | { | ||
407 | if (unlikely(PageHeadHuge(page))) | ||
408 | return page->index << compound_order(page); | ||
409 | else | ||
410 | return page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | ||
411 | } | ||
412 | |||
413 | /* | ||
402 | * Return byte-offset into filesystem object for page. | 414 | * Return byte-offset into filesystem object for page. |
403 | */ | 415 | */ |
404 | static inline loff_t page_offset(struct page *page) | 416 | static inline loff_t page_offset(struct page *page) |
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index 713b0b88bd5a..c4d86198d3d6 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/netfilter/nfnetlink.h> | 6 | #include <linux/netfilter/nfnetlink.h> |
7 | #include <linux/netfilter/x_tables.h> | 7 | #include <linux/netfilter/x_tables.h> |
8 | #include <linux/netfilter/nf_tables.h> | 8 | #include <linux/netfilter/nf_tables.h> |
9 | #include <linux/u64_stats_sync.h> | ||
9 | #include <net/netlink.h> | 10 | #include <net/netlink.h> |
10 | 11 | ||
11 | #define NFT_JUMP_STACK_SIZE 16 | 12 | #define NFT_JUMP_STACK_SIZE 16 |
@@ -528,8 +529,9 @@ enum nft_chain_type { | |||
528 | }; | 529 | }; |
529 | 530 | ||
530 | struct nft_stats { | 531 | struct nft_stats { |
531 | u64 bytes; | 532 | u64 bytes; |
532 | u64 pkts; | 533 | u64 pkts; |
534 | struct u64_stats_sync syncp; | ||
533 | }; | 535 | }; |
534 | 536 | ||
535 | #define NFT_HOOK_OPS_MAX 2 | 537 | #define NFT_HOOK_OPS_MAX 2 |
diff --git a/include/net/netns/nftables.h b/include/net/netns/nftables.h index 26a394cb91a8..eee608b12cc9 100644 --- a/include/net/netns/nftables.h +++ b/include/net/netns/nftables.h | |||
@@ -13,8 +13,8 @@ struct netns_nftables { | |||
13 | struct nft_af_info *inet; | 13 | struct nft_af_info *inet; |
14 | struct nft_af_info *arp; | 14 | struct nft_af_info *arp; |
15 | struct nft_af_info *bridge; | 15 | struct nft_af_info *bridge; |
16 | unsigned int base_seq; | ||
16 | u8 gencursor; | 17 | u8 gencursor; |
17 | u8 genctr; | ||
18 | }; | 18 | }; |
19 | 19 | ||
20 | #endif | 20 | #endif |
diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h index 40b5ca8a1b1f..25084a052a1e 100644 --- a/include/uapi/linux/fuse.h +++ b/include/uapi/linux/fuse.h | |||
@@ -101,6 +101,7 @@ | |||
101 | * - add FATTR_CTIME | 101 | * - add FATTR_CTIME |
102 | * - add ctime and ctimensec to fuse_setattr_in | 102 | * - add ctime and ctimensec to fuse_setattr_in |
103 | * - add FUSE_RENAME2 request | 103 | * - add FUSE_RENAME2 request |
104 | * - add FUSE_NO_OPEN_SUPPORT flag | ||
104 | */ | 105 | */ |
105 | 106 | ||
106 | #ifndef _LINUX_FUSE_H | 107 | #ifndef _LINUX_FUSE_H |
@@ -229,6 +230,7 @@ struct fuse_file_lock { | |||
229 | * FUSE_READDIRPLUS_AUTO: adaptive readdirplus | 230 | * FUSE_READDIRPLUS_AUTO: adaptive readdirplus |
230 | * FUSE_ASYNC_DIO: asynchronous direct I/O submission | 231 | * FUSE_ASYNC_DIO: asynchronous direct I/O submission |
231 | * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes | 232 | * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes |
233 | * FUSE_NO_OPEN_SUPPORT: kernel supports zero-message opens | ||
232 | */ | 234 | */ |
233 | #define FUSE_ASYNC_READ (1 << 0) | 235 | #define FUSE_ASYNC_READ (1 << 0) |
234 | #define FUSE_POSIX_LOCKS (1 << 1) | 236 | #define FUSE_POSIX_LOCKS (1 << 1) |
@@ -247,6 +249,7 @@ struct fuse_file_lock { | |||
247 | #define FUSE_READDIRPLUS_AUTO (1 << 14) | 249 | #define FUSE_READDIRPLUS_AUTO (1 << 14) |
248 | #define FUSE_ASYNC_DIO (1 << 15) | 250 | #define FUSE_ASYNC_DIO (1 << 15) |
249 | #define FUSE_WRITEBACK_CACHE (1 << 16) | 251 | #define FUSE_WRITEBACK_CACHE (1 << 16) |
252 | #define FUSE_NO_OPEN_SUPPORT (1 << 17) | ||
250 | 253 | ||
251 | /** | 254 | /** |
252 | * CUSE INIT request/reply flags | 255 | * CUSE INIT request/reply flags |
diff --git a/kernel/events/core.c b/kernel/events/core.c index b0c95f0f06fd..6b17ac1b0c2a 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -7458,7 +7458,19 @@ __perf_event_exit_task(struct perf_event *child_event, | |||
7458 | struct perf_event_context *child_ctx, | 7458 | struct perf_event_context *child_ctx, |
7459 | struct task_struct *child) | 7459 | struct task_struct *child) |
7460 | { | 7460 | { |
7461 | perf_remove_from_context(child_event, true); | 7461 | /* |
7462 | * Do not destroy the 'original' grouping; because of the context | ||
7463 | * switch optimization the original events could've ended up in a | ||
7464 | * random child task. | ||
7465 | * | ||
7466 | * If we were to destroy the original group, all group related | ||
7467 | * operations would cease to function properly after this random | ||
7468 | * child dies. | ||
7469 | * | ||
7470 | * Do destroy all inherited groups, we don't care about those | ||
7471 | * and being thorough is better. | ||
7472 | */ | ||
7473 | perf_remove_from_context(child_event, !!child_event->parent); | ||
7462 | 7474 | ||
7463 | /* | 7475 | /* |
7464 | * It can happen that the parent exits first, and has events | 7476 | * It can happen that the parent exits first, and has events |
@@ -7474,7 +7486,7 @@ __perf_event_exit_task(struct perf_event *child_event, | |||
7474 | static void perf_event_exit_task_context(struct task_struct *child, int ctxn) | 7486 | static void perf_event_exit_task_context(struct task_struct *child, int ctxn) |
7475 | { | 7487 | { |
7476 | struct perf_event *child_event, *next; | 7488 | struct perf_event *child_event, *next; |
7477 | struct perf_event_context *child_ctx; | 7489 | struct perf_event_context *child_ctx, *parent_ctx; |
7478 | unsigned long flags; | 7490 | unsigned long flags; |
7479 | 7491 | ||
7480 | if (likely(!child->perf_event_ctxp[ctxn])) { | 7492 | if (likely(!child->perf_event_ctxp[ctxn])) { |
@@ -7499,6 +7511,15 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn) | |||
7499 | raw_spin_lock(&child_ctx->lock); | 7511 | raw_spin_lock(&child_ctx->lock); |
7500 | task_ctx_sched_out(child_ctx); | 7512 | task_ctx_sched_out(child_ctx); |
7501 | child->perf_event_ctxp[ctxn] = NULL; | 7513 | child->perf_event_ctxp[ctxn] = NULL; |
7514 | |||
7515 | /* | ||
7516 | * In order to avoid freeing: child_ctx->parent_ctx->task | ||
7517 | * under perf_event_context::lock, grab another reference. | ||
7518 | */ | ||
7519 | parent_ctx = child_ctx->parent_ctx; | ||
7520 | if (parent_ctx) | ||
7521 | get_ctx(parent_ctx); | ||
7522 | |||
7502 | /* | 7523 | /* |
7503 | * If this context is a clone; unclone it so it can't get | 7524 | * If this context is a clone; unclone it so it can't get |
7504 | * swapped to another process while we're removing all | 7525 | * swapped to another process while we're removing all |
@@ -7509,6 +7530,13 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn) | |||
7509 | raw_spin_unlock_irqrestore(&child_ctx->lock, flags); | 7530 | raw_spin_unlock_irqrestore(&child_ctx->lock, flags); |
7510 | 7531 | ||
7511 | /* | 7532 | /* |
7533 | * Now that we no longer hold perf_event_context::lock, drop | ||
7534 | * our extra child_ctx->parent_ctx reference. | ||
7535 | */ | ||
7536 | if (parent_ctx) | ||
7537 | put_ctx(parent_ctx); | ||
7538 | |||
7539 | /* | ||
7512 | * Report the task dead after unscheduling the events so that we | 7540 | * Report the task dead after unscheduling the events so that we |
7513 | * won't get any samples after PERF_RECORD_EXIT. We can however still | 7541 | * won't get any samples after PERF_RECORD_EXIT. We can however still |
7514 | * get a few PERF_RECORD_READ events. | 7542 | * get a few PERF_RECORD_READ events. |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 3214289df5a7..734e9a7d280b 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -2037,19 +2037,23 @@ static int __init populate_kprobe_blacklist(unsigned long *start, | |||
2037 | { | 2037 | { |
2038 | unsigned long *iter; | 2038 | unsigned long *iter; |
2039 | struct kprobe_blacklist_entry *ent; | 2039 | struct kprobe_blacklist_entry *ent; |
2040 | unsigned long offset = 0, size = 0; | 2040 | unsigned long entry, offset = 0, size = 0; |
2041 | 2041 | ||
2042 | for (iter = start; iter < end; iter++) { | 2042 | for (iter = start; iter < end; iter++) { |
2043 | if (!kallsyms_lookup_size_offset(*iter, &size, &offset)) { | 2043 | entry = arch_deref_entry_point((void *)*iter); |
2044 | pr_err("Failed to find blacklist %p\n", (void *)*iter); | 2044 | |
2045 | if (!kernel_text_address(entry) || | ||
2046 | !kallsyms_lookup_size_offset(entry, &size, &offset)) { | ||
2047 | pr_err("Failed to find blacklist at %p\n", | ||
2048 | (void *)entry); | ||
2045 | continue; | 2049 | continue; |
2046 | } | 2050 | } |
2047 | 2051 | ||
2048 | ent = kmalloc(sizeof(*ent), GFP_KERNEL); | 2052 | ent = kmalloc(sizeof(*ent), GFP_KERNEL); |
2049 | if (!ent) | 2053 | if (!ent) |
2050 | return -ENOMEM; | 2054 | return -ENOMEM; |
2051 | ent->start_addr = *iter; | 2055 | ent->start_addr = entry; |
2052 | ent->end_addr = *iter + size; | 2056 | ent->end_addr = entry + size; |
2053 | INIT_LIST_HEAD(&ent->list); | 2057 | INIT_LIST_HEAD(&ent->list); |
2054 | list_add_tail(&ent->list, &kprobe_blacklist); | 2058 | list_add_tail(&ent->list, &kprobe_blacklist); |
2055 | } | 2059 | } |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index bda9621638cc..291397e66669 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -823,7 +823,7 @@ static struct { | |||
823 | { trace_clock_local, "local", 1 }, | 823 | { trace_clock_local, "local", 1 }, |
824 | { trace_clock_global, "global", 1 }, | 824 | { trace_clock_global, "global", 1 }, |
825 | { trace_clock_counter, "counter", 0 }, | 825 | { trace_clock_counter, "counter", 0 }, |
826 | { trace_clock_jiffies, "uptime", 1 }, | 826 | { trace_clock_jiffies, "uptime", 0 }, |
827 | { trace_clock, "perf", 1 }, | 827 | { trace_clock, "perf", 1 }, |
828 | ARCH_TRACE_CLOCKS | 828 | ARCH_TRACE_CLOCKS |
829 | }; | 829 | }; |
diff --git a/kernel/trace/trace_clock.c b/kernel/trace/trace_clock.c index 26dc348332b7..57b67b1f24d1 100644 --- a/kernel/trace/trace_clock.c +++ b/kernel/trace/trace_clock.c | |||
@@ -59,13 +59,14 @@ u64 notrace trace_clock(void) | |||
59 | 59 | ||
60 | /* | 60 | /* |
61 | * trace_jiffy_clock(): Simply use jiffies as a clock counter. | 61 | * trace_jiffy_clock(): Simply use jiffies as a clock counter. |
62 | * Note that this use of jiffies_64 is not completely safe on | ||
63 | * 32-bit systems. But the window is tiny, and the effect if | ||
64 | * we are affected is that we will have an obviously bogus | ||
65 | * timestamp on a trace event - i.e. not life threatening. | ||
62 | */ | 66 | */ |
63 | u64 notrace trace_clock_jiffies(void) | 67 | u64 notrace trace_clock_jiffies(void) |
64 | { | 68 | { |
65 | u64 jiffy = jiffies - INITIAL_JIFFIES; | 69 | return jiffies_64_to_clock_t(jiffies_64 - INITIAL_JIFFIES); |
66 | |||
67 | /* Return nsecs */ | ||
68 | return (u64)jiffies_to_usecs(jiffy) * 1000ULL; | ||
69 | } | 70 | } |
70 | 71 | ||
71 | /* | 72 | /* |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 2024bbd573d2..9221c02ed9e2 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -2604,6 +2604,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, | |||
2604 | } else { | 2604 | } else { |
2605 | if (cow) | 2605 | if (cow) |
2606 | huge_ptep_set_wrprotect(src, addr, src_pte); | 2606 | huge_ptep_set_wrprotect(src, addr, src_pte); |
2607 | entry = huge_ptep_get(src_pte); | ||
2607 | ptepage = pte_page(entry); | 2608 | ptepage = pte_page(entry); |
2608 | get_page(ptepage); | 2609 | get_page(ptepage); |
2609 | page_dup_rmap(ptepage); | 2610 | page_dup_rmap(ptepage); |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index c6399e328931..7211a73ba14d 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
@@ -435,7 +435,7 @@ static void collect_procs_anon(struct page *page, struct list_head *to_kill, | |||
435 | if (av == NULL) /* Not actually mapped anymore */ | 435 | if (av == NULL) /* Not actually mapped anymore */ |
436 | return; | 436 | return; |
437 | 437 | ||
438 | pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 438 | pgoff = page_to_pgoff(page); |
439 | read_lock(&tasklist_lock); | 439 | read_lock(&tasklist_lock); |
440 | for_each_process (tsk) { | 440 | for_each_process (tsk) { |
441 | struct anon_vma_chain *vmac; | 441 | struct anon_vma_chain *vmac; |
@@ -469,7 +469,7 @@ static void collect_procs_file(struct page *page, struct list_head *to_kill, | |||
469 | mutex_lock(&mapping->i_mmap_mutex); | 469 | mutex_lock(&mapping->i_mmap_mutex); |
470 | read_lock(&tasklist_lock); | 470 | read_lock(&tasklist_lock); |
471 | for_each_process(tsk) { | 471 | for_each_process(tsk) { |
472 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 472 | pgoff_t pgoff = page_to_pgoff(page); |
473 | struct task_struct *t = task_early_kill(tsk, force_early); | 473 | struct task_struct *t = task_early_kill(tsk, force_early); |
474 | 474 | ||
475 | if (!t) | 475 | if (!t) |
diff --git a/mm/memory.c b/mm/memory.c index d67fd9fcf1f2..7e8d8205b610 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2882,7 +2882,8 @@ static int do_read_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2882 | * if page by the offset is not ready to be mapped (cold cache or | 2882 | * if page by the offset is not ready to be mapped (cold cache or |
2883 | * something). | 2883 | * something). |
2884 | */ | 2884 | */ |
2885 | if (vma->vm_ops->map_pages && fault_around_pages() > 1) { | 2885 | if (vma->vm_ops->map_pages && !(flags & FAULT_FLAG_NONLINEAR) && |
2886 | fault_around_pages() > 1) { | ||
2886 | pte = pte_offset_map_lock(mm, pmd, address, &ptl); | 2887 | pte = pte_offset_map_lock(mm, pmd, address, &ptl); |
2887 | do_fault_around(vma, address, pte, pgoff, flags); | 2888 | do_fault_around(vma, address, pte, pgoff, flags); |
2888 | if (!pte_same(*pte, orig_pte)) | 2889 | if (!pte_same(*pte, orig_pte)) |
diff --git a/mm/migrate.c b/mm/migrate.c index 9e0beaa91845..be6dbf995c0c 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -988,9 +988,10 @@ out: | |||
988 | * it. Otherwise, putback_lru_page() will drop the reference grabbed | 988 | * it. Otherwise, putback_lru_page() will drop the reference grabbed |
989 | * during isolation. | 989 | * during isolation. |
990 | */ | 990 | */ |
991 | if (rc != MIGRATEPAGE_SUCCESS && put_new_page) | 991 | if (rc != MIGRATEPAGE_SUCCESS && put_new_page) { |
992 | ClearPageSwapBacked(newpage); | ||
992 | put_new_page(newpage, private); | 993 | put_new_page(newpage, private); |
993 | else | 994 | } else |
994 | putback_lru_page(newpage); | 995 | putback_lru_page(newpage); |
995 | 996 | ||
996 | if (result) { | 997 | if (result) { |
@@ -517,11 +517,7 @@ void page_unlock_anon_vma_read(struct anon_vma *anon_vma) | |||
517 | static inline unsigned long | 517 | static inline unsigned long |
518 | __vma_address(struct page *page, struct vm_area_struct *vma) | 518 | __vma_address(struct page *page, struct vm_area_struct *vma) |
519 | { | 519 | { |
520 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 520 | pgoff_t pgoff = page_to_pgoff(page); |
521 | |||
522 | if (unlikely(is_vm_hugetlb_page(vma))) | ||
523 | pgoff = page->index << huge_page_order(page_hstate(page)); | ||
524 | |||
525 | return vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); | 521 | return vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); |
526 | } | 522 | } |
527 | 523 | ||
@@ -1639,7 +1635,7 @@ static struct anon_vma *rmap_walk_anon_lock(struct page *page, | |||
1639 | static int rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc) | 1635 | static int rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc) |
1640 | { | 1636 | { |
1641 | struct anon_vma *anon_vma; | 1637 | struct anon_vma *anon_vma; |
1642 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 1638 | pgoff_t pgoff = page_to_pgoff(page); |
1643 | struct anon_vma_chain *avc; | 1639 | struct anon_vma_chain *avc; |
1644 | int ret = SWAP_AGAIN; | 1640 | int ret = SWAP_AGAIN; |
1645 | 1641 | ||
@@ -1680,7 +1676,7 @@ static int rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc) | |||
1680 | static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc) | 1676 | static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc) |
1681 | { | 1677 | { |
1682 | struct address_space *mapping = page->mapping; | 1678 | struct address_space *mapping = page->mapping; |
1683 | pgoff_t pgoff = page->index << compound_order(page); | 1679 | pgoff_t pgoff = page_to_pgoff(page); |
1684 | struct vm_area_struct *vma; | 1680 | struct vm_area_struct *vma; |
1685 | int ret = SWAP_AGAIN; | 1681 | int ret = SWAP_AGAIN; |
1686 | 1682 | ||
diff --git a/mm/shmem.c b/mm/shmem.c index 1140f49b6ded..af68b15a8fc1 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -85,7 +85,7 @@ static struct vfsmount *shm_mnt; | |||
85 | * a time): we would prefer not to enlarge the shmem inode just for that. | 85 | * a time): we would prefer not to enlarge the shmem inode just for that. |
86 | */ | 86 | */ |
87 | struct shmem_falloc { | 87 | struct shmem_falloc { |
88 | int mode; /* FALLOC_FL mode currently operating */ | 88 | wait_queue_head_t *waitq; /* faults into hole wait for punch to end */ |
89 | pgoff_t start; /* start of range currently being fallocated */ | 89 | pgoff_t start; /* start of range currently being fallocated */ |
90 | pgoff_t next; /* the next page offset to be fallocated */ | 90 | pgoff_t next; /* the next page offset to be fallocated */ |
91 | pgoff_t nr_falloced; /* how many new pages have been fallocated */ | 91 | pgoff_t nr_falloced; /* how many new pages have been fallocated */ |
@@ -468,23 +468,20 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, | |||
468 | return; | 468 | return; |
469 | 469 | ||
470 | index = start; | 470 | index = start; |
471 | for ( ; ; ) { | 471 | while (index < end) { |
472 | cond_resched(); | 472 | cond_resched(); |
473 | 473 | ||
474 | pvec.nr = find_get_entries(mapping, index, | 474 | pvec.nr = find_get_entries(mapping, index, |
475 | min(end - index, (pgoff_t)PAGEVEC_SIZE), | 475 | min(end - index, (pgoff_t)PAGEVEC_SIZE), |
476 | pvec.pages, indices); | 476 | pvec.pages, indices); |
477 | if (!pvec.nr) { | 477 | if (!pvec.nr) { |
478 | if (index == start || unfalloc) | 478 | /* If all gone or hole-punch or unfalloc, we're done */ |
479 | if (index == start || end != -1) | ||
479 | break; | 480 | break; |
481 | /* But if truncating, restart to make sure all gone */ | ||
480 | index = start; | 482 | index = start; |
481 | continue; | 483 | continue; |
482 | } | 484 | } |
483 | if ((index == start || unfalloc) && indices[0] >= end) { | ||
484 | pagevec_remove_exceptionals(&pvec); | ||
485 | pagevec_release(&pvec); | ||
486 | break; | ||
487 | } | ||
488 | mem_cgroup_uncharge_start(); | 485 | mem_cgroup_uncharge_start(); |
489 | for (i = 0; i < pagevec_count(&pvec); i++) { | 486 | for (i = 0; i < pagevec_count(&pvec); i++) { |
490 | struct page *page = pvec.pages[i]; | 487 | struct page *page = pvec.pages[i]; |
@@ -496,8 +493,12 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, | |||
496 | if (radix_tree_exceptional_entry(page)) { | 493 | if (radix_tree_exceptional_entry(page)) { |
497 | if (unfalloc) | 494 | if (unfalloc) |
498 | continue; | 495 | continue; |
499 | nr_swaps_freed += !shmem_free_swap(mapping, | 496 | if (shmem_free_swap(mapping, index, page)) { |
500 | index, page); | 497 | /* Swap was replaced by page: retry */ |
498 | index--; | ||
499 | break; | ||
500 | } | ||
501 | nr_swaps_freed++; | ||
501 | continue; | 502 | continue; |
502 | } | 503 | } |
503 | 504 | ||
@@ -506,6 +507,11 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, | |||
506 | if (page->mapping == mapping) { | 507 | if (page->mapping == mapping) { |
507 | VM_BUG_ON_PAGE(PageWriteback(page), page); | 508 | VM_BUG_ON_PAGE(PageWriteback(page), page); |
508 | truncate_inode_page(mapping, page); | 509 | truncate_inode_page(mapping, page); |
510 | } else { | ||
511 | /* Page was replaced by swap: retry */ | ||
512 | unlock_page(page); | ||
513 | index--; | ||
514 | break; | ||
509 | } | 515 | } |
510 | } | 516 | } |
511 | unlock_page(page); | 517 | unlock_page(page); |
@@ -760,7 +766,7 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc) | |||
760 | spin_lock(&inode->i_lock); | 766 | spin_lock(&inode->i_lock); |
761 | shmem_falloc = inode->i_private; | 767 | shmem_falloc = inode->i_private; |
762 | if (shmem_falloc && | 768 | if (shmem_falloc && |
763 | !shmem_falloc->mode && | 769 | !shmem_falloc->waitq && |
764 | index >= shmem_falloc->start && | 770 | index >= shmem_falloc->start && |
765 | index < shmem_falloc->next) | 771 | index < shmem_falloc->next) |
766 | shmem_falloc->nr_unswapped++; | 772 | shmem_falloc->nr_unswapped++; |
@@ -1248,38 +1254,58 @@ static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1248 | * Trinity finds that probing a hole which tmpfs is punching can | 1254 | * Trinity finds that probing a hole which tmpfs is punching can |
1249 | * prevent the hole-punch from ever completing: which in turn | 1255 | * prevent the hole-punch from ever completing: which in turn |
1250 | * locks writers out with its hold on i_mutex. So refrain from | 1256 | * locks writers out with its hold on i_mutex. So refrain from |
1251 | * faulting pages into the hole while it's being punched, and | 1257 | * faulting pages into the hole while it's being punched. Although |
1252 | * wait on i_mutex to be released if vmf->flags permits. | 1258 | * shmem_undo_range() does remove the additions, it may be unable to |
1259 | * keep up, as each new page needs its own unmap_mapping_range() call, | ||
1260 | * and the i_mmap tree grows ever slower to scan if new vmas are added. | ||
1261 | * | ||
1262 | * It does not matter if we sometimes reach this check just before the | ||
1263 | * hole-punch begins, so that one fault then races with the punch: | ||
1264 | * we just need to make racing faults a rare case. | ||
1265 | * | ||
1266 | * The implementation below would be much simpler if we just used a | ||
1267 | * standard mutex or completion: but we cannot take i_mutex in fault, | ||
1268 | * and bloating every shmem inode for this unlikely case would be sad. | ||
1253 | */ | 1269 | */ |
1254 | if (unlikely(inode->i_private)) { | 1270 | if (unlikely(inode->i_private)) { |
1255 | struct shmem_falloc *shmem_falloc; | 1271 | struct shmem_falloc *shmem_falloc; |
1256 | 1272 | ||
1257 | spin_lock(&inode->i_lock); | 1273 | spin_lock(&inode->i_lock); |
1258 | shmem_falloc = inode->i_private; | 1274 | shmem_falloc = inode->i_private; |
1259 | if (!shmem_falloc || | 1275 | if (shmem_falloc && |
1260 | shmem_falloc->mode != FALLOC_FL_PUNCH_HOLE || | 1276 | shmem_falloc->waitq && |
1261 | vmf->pgoff < shmem_falloc->start || | 1277 | vmf->pgoff >= shmem_falloc->start && |
1262 | vmf->pgoff >= shmem_falloc->next) | 1278 | vmf->pgoff < shmem_falloc->next) { |
1263 | shmem_falloc = NULL; | 1279 | wait_queue_head_t *shmem_falloc_waitq; |
1264 | spin_unlock(&inode->i_lock); | 1280 | DEFINE_WAIT(shmem_fault_wait); |
1265 | /* | 1281 | |
1266 | * i_lock has protected us from taking shmem_falloc seriously | 1282 | ret = VM_FAULT_NOPAGE; |
1267 | * once return from shmem_fallocate() went back up that stack. | ||
1268 | * i_lock does not serialize with i_mutex at all, but it does | ||
1269 | * not matter if sometimes we wait unnecessarily, or sometimes | ||
1270 | * miss out on waiting: we just need to make those cases rare. | ||
1271 | */ | ||
1272 | if (shmem_falloc) { | ||
1273 | if ((vmf->flags & FAULT_FLAG_ALLOW_RETRY) && | 1283 | if ((vmf->flags & FAULT_FLAG_ALLOW_RETRY) && |
1274 | !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { | 1284 | !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { |
1285 | /* It's polite to up mmap_sem if we can */ | ||
1275 | up_read(&vma->vm_mm->mmap_sem); | 1286 | up_read(&vma->vm_mm->mmap_sem); |
1276 | mutex_lock(&inode->i_mutex); | 1287 | ret = VM_FAULT_RETRY; |
1277 | mutex_unlock(&inode->i_mutex); | ||
1278 | return VM_FAULT_RETRY; | ||
1279 | } | 1288 | } |
1280 | /* cond_resched? Leave that to GUP or return to user */ | 1289 | |
1281 | return VM_FAULT_NOPAGE; | 1290 | shmem_falloc_waitq = shmem_falloc->waitq; |
1291 | prepare_to_wait(shmem_falloc_waitq, &shmem_fault_wait, | ||
1292 | TASK_UNINTERRUPTIBLE); | ||
1293 | spin_unlock(&inode->i_lock); | ||
1294 | schedule(); | ||
1295 | |||
1296 | /* | ||
1297 | * shmem_falloc_waitq points into the shmem_fallocate() | ||
1298 | * stack of the hole-punching task: shmem_falloc_waitq | ||
1299 | * is usually invalid by the time we reach here, but | ||
1300 | * finish_wait() does not dereference it in that case; | ||
1301 | * though i_lock needed lest racing with wake_up_all(). | ||
1302 | */ | ||
1303 | spin_lock(&inode->i_lock); | ||
1304 | finish_wait(shmem_falloc_waitq, &shmem_fault_wait); | ||
1305 | spin_unlock(&inode->i_lock); | ||
1306 | return ret; | ||
1282 | } | 1307 | } |
1308 | spin_unlock(&inode->i_lock); | ||
1283 | } | 1309 | } |
1284 | 1310 | ||
1285 | error = shmem_getpage(inode, vmf->pgoff, &vmf->page, SGP_CACHE, &ret); | 1311 | error = shmem_getpage(inode, vmf->pgoff, &vmf->page, SGP_CACHE, &ret); |
@@ -1774,13 +1800,13 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset, | |||
1774 | 1800 | ||
1775 | mutex_lock(&inode->i_mutex); | 1801 | mutex_lock(&inode->i_mutex); |
1776 | 1802 | ||
1777 | shmem_falloc.mode = mode & ~FALLOC_FL_KEEP_SIZE; | ||
1778 | |||
1779 | if (mode & FALLOC_FL_PUNCH_HOLE) { | 1803 | if (mode & FALLOC_FL_PUNCH_HOLE) { |
1780 | struct address_space *mapping = file->f_mapping; | 1804 | struct address_space *mapping = file->f_mapping; |
1781 | loff_t unmap_start = round_up(offset, PAGE_SIZE); | 1805 | loff_t unmap_start = round_up(offset, PAGE_SIZE); |
1782 | loff_t unmap_end = round_down(offset + len, PAGE_SIZE) - 1; | 1806 | loff_t unmap_end = round_down(offset + len, PAGE_SIZE) - 1; |
1807 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(shmem_falloc_waitq); | ||
1783 | 1808 | ||
1809 | shmem_falloc.waitq = &shmem_falloc_waitq; | ||
1784 | shmem_falloc.start = unmap_start >> PAGE_SHIFT; | 1810 | shmem_falloc.start = unmap_start >> PAGE_SHIFT; |
1785 | shmem_falloc.next = (unmap_end + 1) >> PAGE_SHIFT; | 1811 | shmem_falloc.next = (unmap_end + 1) >> PAGE_SHIFT; |
1786 | spin_lock(&inode->i_lock); | 1812 | spin_lock(&inode->i_lock); |
@@ -1792,8 +1818,13 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset, | |||
1792 | 1 + unmap_end - unmap_start, 0); | 1818 | 1 + unmap_end - unmap_start, 0); |
1793 | shmem_truncate_range(inode, offset, offset + len - 1); | 1819 | shmem_truncate_range(inode, offset, offset + len - 1); |
1794 | /* No need to unmap again: hole-punching leaves COWed pages */ | 1820 | /* No need to unmap again: hole-punching leaves COWed pages */ |
1821 | |||
1822 | spin_lock(&inode->i_lock); | ||
1823 | inode->i_private = NULL; | ||
1824 | wake_up_all(&shmem_falloc_waitq); | ||
1825 | spin_unlock(&inode->i_lock); | ||
1795 | error = 0; | 1826 | error = 0; |
1796 | goto undone; | 1827 | goto out; |
1797 | } | 1828 | } |
1798 | 1829 | ||
1799 | /* We need to check rlimit even when FALLOC_FL_KEEP_SIZE */ | 1830 | /* We need to check rlimit even when FALLOC_FL_KEEP_SIZE */ |
@@ -1809,6 +1840,7 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset, | |||
1809 | goto out; | 1840 | goto out; |
1810 | } | 1841 | } |
1811 | 1842 | ||
1843 | shmem_falloc.waitq = NULL; | ||
1812 | shmem_falloc.start = start; | 1844 | shmem_falloc.start = start; |
1813 | shmem_falloc.next = start; | 1845 | shmem_falloc.next = start; |
1814 | shmem_falloc.nr_falloced = 0; | 1846 | shmem_falloc.nr_falloced = 0; |
diff --git a/mm/slab_common.c b/mm/slab_common.c index 735e01a0db6f..d31c4bacc6a2 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
@@ -55,7 +55,7 @@ static int kmem_cache_sanity_check(const char *name, size_t size) | |||
55 | continue; | 55 | continue; |
56 | } | 56 | } |
57 | 57 | ||
58 | #if !defined(CONFIG_SLUB) || !defined(CONFIG_SLUB_DEBUG_ON) | 58 | #if !defined(CONFIG_SLUB) |
59 | if (!strcmp(s->name, name)) { | 59 | if (!strcmp(s->name, name)) { |
60 | pr_err("%s (%s): Cache name already exists.\n", | 60 | pr_err("%s (%s): Cache name already exists.\n", |
61 | __func__, name); | 61 | __func__, name); |
diff --git a/mm/truncate.c b/mm/truncate.c index 6a78c814bebf..eda247307164 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -355,14 +355,16 @@ void truncate_inode_pages_range(struct address_space *mapping, | |||
355 | for ( ; ; ) { | 355 | for ( ; ; ) { |
356 | cond_resched(); | 356 | cond_resched(); |
357 | if (!pagevec_lookup_entries(&pvec, mapping, index, | 357 | if (!pagevec_lookup_entries(&pvec, mapping, index, |
358 | min(end - index, (pgoff_t)PAGEVEC_SIZE), | 358 | min(end - index, (pgoff_t)PAGEVEC_SIZE), indices)) { |
359 | indices)) { | 359 | /* If all gone from start onwards, we're done */ |
360 | if (index == start) | 360 | if (index == start) |
361 | break; | 361 | break; |
362 | /* Otherwise restart to make sure all gone */ | ||
362 | index = start; | 363 | index = start; |
363 | continue; | 364 | continue; |
364 | } | 365 | } |
365 | if (index == start && indices[0] >= end) { | 366 | if (index == start && indices[0] >= end) { |
367 | /* All gone out of hole to be punched, we're done */ | ||
366 | pagevec_remove_exceptionals(&pvec); | 368 | pagevec_remove_exceptionals(&pvec); |
367 | pagevec_release(&pvec); | 369 | pagevec_release(&pvec); |
368 | break; | 370 | break; |
@@ -373,8 +375,11 @@ void truncate_inode_pages_range(struct address_space *mapping, | |||
373 | 375 | ||
374 | /* We rely upon deletion not changing page->index */ | 376 | /* We rely upon deletion not changing page->index */ |
375 | index = indices[i]; | 377 | index = indices[i]; |
376 | if (index >= end) | 378 | if (index >= end) { |
379 | /* Restart punch to make sure all gone */ | ||
380 | index = start - 1; | ||
377 | break; | 381 | break; |
382 | } | ||
378 | 383 | ||
379 | if (radix_tree_exceptional_entry(page)) { | 384 | if (radix_tree_exceptional_entry(page)) { |
380 | clear_exceptional_entry(mapping, index, page); | 385 | clear_exceptional_entry(mapping, index, page); |
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c index 6f0d9ec37950..a957c8140721 100644 --- a/net/batman-adv/bridge_loop_avoidance.c +++ b/net/batman-adv/bridge_loop_avoidance.c | |||
@@ -800,11 +800,6 @@ static int batadv_check_claim_group(struct batadv_priv *bat_priv, | |||
800 | bla_dst = (struct batadv_bla_claim_dst *)hw_dst; | 800 | bla_dst = (struct batadv_bla_claim_dst *)hw_dst; |
801 | bla_dst_own = &bat_priv->bla.claim_dest; | 801 | bla_dst_own = &bat_priv->bla.claim_dest; |
802 | 802 | ||
803 | /* check if it is a claim packet in general */ | ||
804 | if (memcmp(bla_dst->magic, bla_dst_own->magic, | ||
805 | sizeof(bla_dst->magic)) != 0) | ||
806 | return 0; | ||
807 | |||
808 | /* if announcement packet, use the source, | 803 | /* if announcement packet, use the source, |
809 | * otherwise assume it is in the hw_src | 804 | * otherwise assume it is in the hw_src |
810 | */ | 805 | */ |
@@ -866,12 +861,13 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv, | |||
866 | struct batadv_hard_iface *primary_if, | 861 | struct batadv_hard_iface *primary_if, |
867 | struct sk_buff *skb) | 862 | struct sk_buff *skb) |
868 | { | 863 | { |
869 | struct batadv_bla_claim_dst *bla_dst; | 864 | struct batadv_bla_claim_dst *bla_dst, *bla_dst_own; |
870 | uint8_t *hw_src, *hw_dst; | 865 | uint8_t *hw_src, *hw_dst; |
871 | struct vlan_ethhdr *vhdr; | 866 | struct vlan_hdr *vhdr, vhdr_buf; |
872 | struct ethhdr *ethhdr; | 867 | struct ethhdr *ethhdr; |
873 | struct arphdr *arphdr; | 868 | struct arphdr *arphdr; |
874 | unsigned short vid; | 869 | unsigned short vid; |
870 | int vlan_depth = 0; | ||
875 | __be16 proto; | 871 | __be16 proto; |
876 | int headlen; | 872 | int headlen; |
877 | int ret; | 873 | int ret; |
@@ -882,9 +878,24 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv, | |||
882 | proto = ethhdr->h_proto; | 878 | proto = ethhdr->h_proto; |
883 | headlen = ETH_HLEN; | 879 | headlen = ETH_HLEN; |
884 | if (vid & BATADV_VLAN_HAS_TAG) { | 880 | if (vid & BATADV_VLAN_HAS_TAG) { |
885 | vhdr = vlan_eth_hdr(skb); | 881 | /* Traverse the VLAN/Ethertypes. |
886 | proto = vhdr->h_vlan_encapsulated_proto; | 882 | * |
887 | headlen += VLAN_HLEN; | 883 | * At this point it is known that the first protocol is a VLAN |
884 | * header, so start checking at the encapsulated protocol. | ||
885 | * | ||
886 | * The depth of the VLAN headers is recorded to drop BLA claim | ||
887 | * frames encapsulated into multiple VLAN headers (QinQ). | ||
888 | */ | ||
889 | do { | ||
890 | vhdr = skb_header_pointer(skb, headlen, VLAN_HLEN, | ||
891 | &vhdr_buf); | ||
892 | if (!vhdr) | ||
893 | return 0; | ||
894 | |||
895 | proto = vhdr->h_vlan_encapsulated_proto; | ||
896 | headlen += VLAN_HLEN; | ||
897 | vlan_depth++; | ||
898 | } while (proto == htons(ETH_P_8021Q)); | ||
888 | } | 899 | } |
889 | 900 | ||
890 | if (proto != htons(ETH_P_ARP)) | 901 | if (proto != htons(ETH_P_ARP)) |
@@ -914,6 +925,19 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv, | |||
914 | hw_src = (uint8_t *)arphdr + sizeof(struct arphdr); | 925 | hw_src = (uint8_t *)arphdr + sizeof(struct arphdr); |
915 | hw_dst = hw_src + ETH_ALEN + 4; | 926 | hw_dst = hw_src + ETH_ALEN + 4; |
916 | bla_dst = (struct batadv_bla_claim_dst *)hw_dst; | 927 | bla_dst = (struct batadv_bla_claim_dst *)hw_dst; |
928 | bla_dst_own = &bat_priv->bla.claim_dest; | ||
929 | |||
930 | /* check if it is a claim frame in general */ | ||
931 | if (memcmp(bla_dst->magic, bla_dst_own->magic, | ||
932 | sizeof(bla_dst->magic)) != 0) | ||
933 | return 0; | ||
934 | |||
935 | /* check if there is a claim frame encapsulated deeper in (QinQ) and | ||
936 | * drop that, as this is not supported by BLA but should also not be | ||
937 | * sent via the mesh. | ||
938 | */ | ||
939 | if (vlan_depth > 1) | ||
940 | return 1; | ||
917 | 941 | ||
918 | /* check if it is a claim frame. */ | 942 | /* check if it is a claim frame. */ |
919 | ret = batadv_check_claim_group(bat_priv, primary_if, hw_src, hw_dst, | 943 | ret = batadv_check_claim_group(bat_priv, primary_if, hw_src, hw_dst, |
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index e7ee65dc20bf..cbd677f48c00 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c | |||
@@ -448,10 +448,15 @@ out: | |||
448 | * possibly free it | 448 | * possibly free it |
449 | * @softif_vlan: the vlan object to release | 449 | * @softif_vlan: the vlan object to release |
450 | */ | 450 | */ |
451 | void batadv_softif_vlan_free_ref(struct batadv_softif_vlan *softif_vlan) | 451 | void batadv_softif_vlan_free_ref(struct batadv_softif_vlan *vlan) |
452 | { | 452 | { |
453 | if (atomic_dec_and_test(&softif_vlan->refcount)) | 453 | if (atomic_dec_and_test(&vlan->refcount)) { |
454 | kfree_rcu(softif_vlan, rcu); | 454 | spin_lock_bh(&vlan->bat_priv->softif_vlan_list_lock); |
455 | hlist_del_rcu(&vlan->list); | ||
456 | spin_unlock_bh(&vlan->bat_priv->softif_vlan_list_lock); | ||
457 | |||
458 | kfree_rcu(vlan, rcu); | ||
459 | } | ||
455 | } | 460 | } |
456 | 461 | ||
457 | /** | 462 | /** |
@@ -505,6 +510,7 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid) | |||
505 | if (!vlan) | 510 | if (!vlan) |
506 | return -ENOMEM; | 511 | return -ENOMEM; |
507 | 512 | ||
513 | vlan->bat_priv = bat_priv; | ||
508 | vlan->vid = vid; | 514 | vlan->vid = vid; |
509 | atomic_set(&vlan->refcount, 1); | 515 | atomic_set(&vlan->refcount, 1); |
510 | 516 | ||
@@ -516,6 +522,10 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid) | |||
516 | return err; | 522 | return err; |
517 | } | 523 | } |
518 | 524 | ||
525 | spin_lock_bh(&bat_priv->softif_vlan_list_lock); | ||
526 | hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list); | ||
527 | spin_unlock_bh(&bat_priv->softif_vlan_list_lock); | ||
528 | |||
519 | /* add a new TT local entry. This one will be marked with the NOPURGE | 529 | /* add a new TT local entry. This one will be marked with the NOPURGE |
520 | * flag | 530 | * flag |
521 | */ | 531 | */ |
@@ -523,10 +533,6 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid) | |||
523 | bat_priv->soft_iface->dev_addr, vid, | 533 | bat_priv->soft_iface->dev_addr, vid, |
524 | BATADV_NULL_IFINDEX, BATADV_NO_MARK); | 534 | BATADV_NULL_IFINDEX, BATADV_NO_MARK); |
525 | 535 | ||
526 | spin_lock_bh(&bat_priv->softif_vlan_list_lock); | ||
527 | hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list); | ||
528 | spin_unlock_bh(&bat_priv->softif_vlan_list_lock); | ||
529 | |||
530 | return 0; | 536 | return 0; |
531 | } | 537 | } |
532 | 538 | ||
@@ -538,18 +544,13 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid) | |||
538 | static void batadv_softif_destroy_vlan(struct batadv_priv *bat_priv, | 544 | static void batadv_softif_destroy_vlan(struct batadv_priv *bat_priv, |
539 | struct batadv_softif_vlan *vlan) | 545 | struct batadv_softif_vlan *vlan) |
540 | { | 546 | { |
541 | spin_lock_bh(&bat_priv->softif_vlan_list_lock); | ||
542 | hlist_del_rcu(&vlan->list); | ||
543 | spin_unlock_bh(&bat_priv->softif_vlan_list_lock); | ||
544 | |||
545 | batadv_sysfs_del_vlan(bat_priv, vlan); | ||
546 | |||
547 | /* explicitly remove the associated TT local entry because it is marked | 547 | /* explicitly remove the associated TT local entry because it is marked |
548 | * with the NOPURGE flag | 548 | * with the NOPURGE flag |
549 | */ | 549 | */ |
550 | batadv_tt_local_remove(bat_priv, bat_priv->soft_iface->dev_addr, | 550 | batadv_tt_local_remove(bat_priv, bat_priv->soft_iface->dev_addr, |
551 | vlan->vid, "vlan interface destroyed", false); | 551 | vlan->vid, "vlan interface destroyed", false); |
552 | 552 | ||
553 | batadv_sysfs_del_vlan(bat_priv, vlan); | ||
553 | batadv_softif_vlan_free_ref(vlan); | 554 | batadv_softif_vlan_free_ref(vlan); |
554 | } | 555 | } |
555 | 556 | ||
@@ -567,6 +568,8 @@ static int batadv_interface_add_vid(struct net_device *dev, __be16 proto, | |||
567 | unsigned short vid) | 568 | unsigned short vid) |
568 | { | 569 | { |
569 | struct batadv_priv *bat_priv = netdev_priv(dev); | 570 | struct batadv_priv *bat_priv = netdev_priv(dev); |
571 | struct batadv_softif_vlan *vlan; | ||
572 | int ret; | ||
570 | 573 | ||
571 | /* only 802.1Q vlans are supported. | 574 | /* only 802.1Q vlans are supported. |
572 | * batman-adv does not know how to handle other types | 575 | * batman-adv does not know how to handle other types |
@@ -576,7 +579,36 @@ static int batadv_interface_add_vid(struct net_device *dev, __be16 proto, | |||
576 | 579 | ||
577 | vid |= BATADV_VLAN_HAS_TAG; | 580 | vid |= BATADV_VLAN_HAS_TAG; |
578 | 581 | ||
579 | return batadv_softif_create_vlan(bat_priv, vid); | 582 | /* if a new vlan is getting created and it already exists, it means that |
583 | * it was not deleted yet. batadv_softif_vlan_get() increases the | ||
584 | * refcount in order to revive the object. | ||
585 | * | ||
586 | * if it does not exist then create it. | ||
587 | */ | ||
588 | vlan = batadv_softif_vlan_get(bat_priv, vid); | ||
589 | if (!vlan) | ||
590 | return batadv_softif_create_vlan(bat_priv, vid); | ||
591 | |||
592 | /* recreate the sysfs object if it was already destroyed (and it should | ||
593 | * be since we received a kill_vid() for this vlan | ||
594 | */ | ||
595 | if (!vlan->kobj) { | ||
596 | ret = batadv_sysfs_add_vlan(bat_priv->soft_iface, vlan); | ||
597 | if (ret) { | ||
598 | batadv_softif_vlan_free_ref(vlan); | ||
599 | return ret; | ||
600 | } | ||
601 | } | ||
602 | |||
603 | /* add a new TT local entry. This one will be marked with the NOPURGE | ||
604 | * flag. This must be added again, even if the vlan object already | ||
605 | * exists, because the entry was deleted by kill_vid() | ||
606 | */ | ||
607 | batadv_tt_local_add(bat_priv->soft_iface, | ||
608 | bat_priv->soft_iface->dev_addr, vid, | ||
609 | BATADV_NULL_IFINDEX, BATADV_NO_MARK); | ||
610 | |||
611 | return 0; | ||
580 | } | 612 | } |
581 | 613 | ||
582 | /** | 614 | /** |
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index d636bde72c9a..5f59e7f899a0 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
@@ -511,6 +511,7 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | |||
511 | struct batadv_priv *bat_priv = netdev_priv(soft_iface); | 511 | struct batadv_priv *bat_priv = netdev_priv(soft_iface); |
512 | struct batadv_tt_local_entry *tt_local; | 512 | struct batadv_tt_local_entry *tt_local; |
513 | struct batadv_tt_global_entry *tt_global = NULL; | 513 | struct batadv_tt_global_entry *tt_global = NULL; |
514 | struct batadv_softif_vlan *vlan; | ||
514 | struct net_device *in_dev = NULL; | 515 | struct net_device *in_dev = NULL; |
515 | struct hlist_head *head; | 516 | struct hlist_head *head; |
516 | struct batadv_tt_orig_list_entry *orig_entry; | 517 | struct batadv_tt_orig_list_entry *orig_entry; |
@@ -572,6 +573,9 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | |||
572 | if (!tt_local) | 573 | if (!tt_local) |
573 | goto out; | 574 | goto out; |
574 | 575 | ||
576 | /* increase the refcounter of the related vlan */ | ||
577 | vlan = batadv_softif_vlan_get(bat_priv, vid); | ||
578 | |||
575 | batadv_dbg(BATADV_DBG_TT, bat_priv, | 579 | batadv_dbg(BATADV_DBG_TT, bat_priv, |
576 | "Creating new local tt entry: %pM (vid: %d, ttvn: %d)\n", | 580 | "Creating new local tt entry: %pM (vid: %d, ttvn: %d)\n", |
577 | addr, BATADV_PRINT_VID(vid), | 581 | addr, BATADV_PRINT_VID(vid), |
@@ -604,6 +608,7 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | |||
604 | if (unlikely(hash_added != 0)) { | 608 | if (unlikely(hash_added != 0)) { |
605 | /* remove the reference for the hash */ | 609 | /* remove the reference for the hash */ |
606 | batadv_tt_local_entry_free_ref(tt_local); | 610 | batadv_tt_local_entry_free_ref(tt_local); |
611 | batadv_softif_vlan_free_ref(vlan); | ||
607 | goto out; | 612 | goto out; |
608 | } | 613 | } |
609 | 614 | ||
@@ -1009,6 +1014,7 @@ uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv, | |||
1009 | { | 1014 | { |
1010 | struct batadv_tt_local_entry *tt_local_entry; | 1015 | struct batadv_tt_local_entry *tt_local_entry; |
1011 | uint16_t flags, curr_flags = BATADV_NO_FLAGS; | 1016 | uint16_t flags, curr_flags = BATADV_NO_FLAGS; |
1017 | struct batadv_softif_vlan *vlan; | ||
1012 | 1018 | ||
1013 | tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); | 1019 | tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); |
1014 | if (!tt_local_entry) | 1020 | if (!tt_local_entry) |
@@ -1039,6 +1045,11 @@ uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv, | |||
1039 | hlist_del_rcu(&tt_local_entry->common.hash_entry); | 1045 | hlist_del_rcu(&tt_local_entry->common.hash_entry); |
1040 | batadv_tt_local_entry_free_ref(tt_local_entry); | 1046 | batadv_tt_local_entry_free_ref(tt_local_entry); |
1041 | 1047 | ||
1048 | /* decrease the reference held for this vlan */ | ||
1049 | vlan = batadv_softif_vlan_get(bat_priv, vid); | ||
1050 | batadv_softif_vlan_free_ref(vlan); | ||
1051 | batadv_softif_vlan_free_ref(vlan); | ||
1052 | |||
1042 | out: | 1053 | out: |
1043 | if (tt_local_entry) | 1054 | if (tt_local_entry) |
1044 | batadv_tt_local_entry_free_ref(tt_local_entry); | 1055 | batadv_tt_local_entry_free_ref(tt_local_entry); |
@@ -1111,6 +1122,7 @@ static void batadv_tt_local_table_free(struct batadv_priv *bat_priv) | |||
1111 | spinlock_t *list_lock; /* protects write access to the hash lists */ | 1122 | spinlock_t *list_lock; /* protects write access to the hash lists */ |
1112 | struct batadv_tt_common_entry *tt_common_entry; | 1123 | struct batadv_tt_common_entry *tt_common_entry; |
1113 | struct batadv_tt_local_entry *tt_local; | 1124 | struct batadv_tt_local_entry *tt_local; |
1125 | struct batadv_softif_vlan *vlan; | ||
1114 | struct hlist_node *node_tmp; | 1126 | struct hlist_node *node_tmp; |
1115 | struct hlist_head *head; | 1127 | struct hlist_head *head; |
1116 | uint32_t i; | 1128 | uint32_t i; |
@@ -1131,6 +1143,13 @@ static void batadv_tt_local_table_free(struct batadv_priv *bat_priv) | |||
1131 | tt_local = container_of(tt_common_entry, | 1143 | tt_local = container_of(tt_common_entry, |
1132 | struct batadv_tt_local_entry, | 1144 | struct batadv_tt_local_entry, |
1133 | common); | 1145 | common); |
1146 | |||
1147 | /* decrease the reference held for this vlan */ | ||
1148 | vlan = batadv_softif_vlan_get(bat_priv, | ||
1149 | tt_common_entry->vid); | ||
1150 | batadv_softif_vlan_free_ref(vlan); | ||
1151 | batadv_softif_vlan_free_ref(vlan); | ||
1152 | |||
1134 | batadv_tt_local_entry_free_ref(tt_local); | 1153 | batadv_tt_local_entry_free_ref(tt_local); |
1135 | } | 1154 | } |
1136 | spin_unlock_bh(list_lock); | 1155 | spin_unlock_bh(list_lock); |
@@ -3139,6 +3158,7 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv) | |||
3139 | struct batadv_hashtable *hash = bat_priv->tt.local_hash; | 3158 | struct batadv_hashtable *hash = bat_priv->tt.local_hash; |
3140 | struct batadv_tt_common_entry *tt_common; | 3159 | struct batadv_tt_common_entry *tt_common; |
3141 | struct batadv_tt_local_entry *tt_local; | 3160 | struct batadv_tt_local_entry *tt_local; |
3161 | struct batadv_softif_vlan *vlan; | ||
3142 | struct hlist_node *node_tmp; | 3162 | struct hlist_node *node_tmp; |
3143 | struct hlist_head *head; | 3163 | struct hlist_head *head; |
3144 | spinlock_t *list_lock; /* protects write access to the hash lists */ | 3164 | spinlock_t *list_lock; /* protects write access to the hash lists */ |
@@ -3167,6 +3187,12 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv) | |||
3167 | tt_local = container_of(tt_common, | 3187 | tt_local = container_of(tt_common, |
3168 | struct batadv_tt_local_entry, | 3188 | struct batadv_tt_local_entry, |
3169 | common); | 3189 | common); |
3190 | |||
3191 | /* decrease the reference held for this vlan */ | ||
3192 | vlan = batadv_softif_vlan_get(bat_priv, tt_common->vid); | ||
3193 | batadv_softif_vlan_free_ref(vlan); | ||
3194 | batadv_softif_vlan_free_ref(vlan); | ||
3195 | |||
3170 | batadv_tt_local_entry_free_ref(tt_local); | 3196 | batadv_tt_local_entry_free_ref(tt_local); |
3171 | } | 3197 | } |
3172 | spin_unlock_bh(list_lock); | 3198 | spin_unlock_bh(list_lock); |
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h index 34891a56773f..8854c05622a9 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h | |||
@@ -687,6 +687,7 @@ struct batadv_priv_nc { | |||
687 | 687 | ||
688 | /** | 688 | /** |
689 | * struct batadv_softif_vlan - per VLAN attributes set | 689 | * struct batadv_softif_vlan - per VLAN attributes set |
690 | * @bat_priv: pointer to the mesh object | ||
690 | * @vid: VLAN identifier | 691 | * @vid: VLAN identifier |
691 | * @kobj: kobject for sysfs vlan subdirectory | 692 | * @kobj: kobject for sysfs vlan subdirectory |
692 | * @ap_isolation: AP isolation state | 693 | * @ap_isolation: AP isolation state |
@@ -696,6 +697,7 @@ struct batadv_priv_nc { | |||
696 | * @rcu: struct used for freeing in a RCU-safe manner | 697 | * @rcu: struct used for freeing in a RCU-safe manner |
697 | */ | 698 | */ |
698 | struct batadv_softif_vlan { | 699 | struct batadv_softif_vlan { |
700 | struct batadv_priv *bat_priv; | ||
699 | unsigned short vid; | 701 | unsigned short vid; |
700 | struct kobject *kobj; | 702 | struct kobject *kobj; |
701 | atomic_t ap_isolation; /* boolean */ | 703 | atomic_t ap_isolation; /* boolean */ |
diff --git a/net/core/dev.c b/net/core/dev.c index 7990984ca364..367a586d0c8a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -4096,6 +4096,8 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) | |||
4096 | skb->vlan_tci = 0; | 4096 | skb->vlan_tci = 0; |
4097 | skb->dev = napi->dev; | 4097 | skb->dev = napi->dev; |
4098 | skb->skb_iif = 0; | 4098 | skb->skb_iif = 0; |
4099 | skb->encapsulation = 0; | ||
4100 | skb_shinfo(skb)->gso_type = 0; | ||
4099 | skb->truesize = SKB_TRUESIZE(skb_end_offset(skb)); | 4101 | skb->truesize = SKB_TRUESIZE(skb_end_offset(skb)); |
4100 | 4102 | ||
4101 | napi->skb = skb; | 4103 | napi->skb = skb; |
diff --git a/net/dns_resolver/dns_query.c b/net/dns_resolver/dns_query.c index 9acec61f5433..dd8696a3dbec 100644 --- a/net/dns_resolver/dns_query.c +++ b/net/dns_resolver/dns_query.c | |||
@@ -150,7 +150,7 @@ int dns_query(const char *type, const char *name, size_t namelen, | |||
150 | goto put; | 150 | goto put; |
151 | 151 | ||
152 | memcpy(*_result, upayload->data, len); | 152 | memcpy(*_result, upayload->data, len); |
153 | *_result[len] = '\0'; | 153 | (*_result)[len] = '\0'; |
154 | 154 | ||
155 | if (_expiry) | 155 | if (_expiry) |
156 | *_expiry = rkey->expiry; | 156 | *_expiry = rkey->expiry; |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index d5e6836cf772..d156b3c5f363 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1429,6 +1429,9 @@ static int inet_gro_complete(struct sk_buff *skb, int nhoff) | |||
1429 | int proto = iph->protocol; | 1429 | int proto = iph->protocol; |
1430 | int err = -ENOSYS; | 1430 | int err = -ENOSYS; |
1431 | 1431 | ||
1432 | if (skb->encapsulation) | ||
1433 | skb_set_inner_network_header(skb, nhoff); | ||
1434 | |||
1432 | csum_replace2(&iph->check, iph->tot_len, newlen); | 1435 | csum_replace2(&iph->check, iph->tot_len, newlen); |
1433 | iph->tot_len = newlen; | 1436 | iph->tot_len = newlen; |
1434 | 1437 | ||
diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c index eb92deb12666..f0bdd47bbbcb 100644 --- a/net/ipv4/gre_offload.c +++ b/net/ipv4/gre_offload.c | |||
@@ -263,6 +263,9 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff) | |||
263 | int err = -ENOENT; | 263 | int err = -ENOENT; |
264 | __be16 type; | 264 | __be16 type; |
265 | 265 | ||
266 | skb->encapsulation = 1; | ||
267 | skb_shinfo(skb)->gso_type = SKB_GSO_GRE; | ||
268 | |||
266 | type = greh->protocol; | 269 | type = greh->protocol; |
267 | if (greh->flags & GRE_KEY) | 270 | if (greh->flags & GRE_KEY) |
268 | grehlen += GRE_HEADER_SECTION; | 271 | grehlen += GRE_HEADER_SECTION; |
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c index 5e7aecea05cd..ad382499bace 100644 --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c | |||
@@ -288,6 +288,10 @@ int ip_options_compile(struct net *net, | |||
288 | optptr++; | 288 | optptr++; |
289 | continue; | 289 | continue; |
290 | } | 290 | } |
291 | if (unlikely(l < 2)) { | ||
292 | pp_ptr = optptr; | ||
293 | goto error; | ||
294 | } | ||
291 | optlen = optptr[1]; | 295 | optlen = optptr[1]; |
292 | if (optlen < 2 || optlen > l) { | 296 | if (optlen < 2 || optlen > l) { |
293 | pp_ptr = optptr; | 297 | pp_ptr = optptr; |
diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index 4e86c59ec7f7..55046ecd083e 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c | |||
@@ -309,7 +309,7 @@ static int tcp4_gro_complete(struct sk_buff *skb, int thoff) | |||
309 | 309 | ||
310 | th->check = ~tcp_v4_check(skb->len - thoff, iph->saddr, | 310 | th->check = ~tcp_v4_check(skb->len - thoff, iph->saddr, |
311 | iph->daddr, 0); | 311 | iph->daddr, 0); |
312 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; | 312 | skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV4; |
313 | 313 | ||
314 | return tcp_gro_complete(skb); | 314 | return tcp_gro_complete(skb); |
315 | } | 315 | } |
diff --git a/net/ipv6/tcpv6_offload.c b/net/ipv6/tcpv6_offload.c index 8517d3cd1aed..01b0ff9a0c2c 100644 --- a/net/ipv6/tcpv6_offload.c +++ b/net/ipv6/tcpv6_offload.c | |||
@@ -73,7 +73,7 @@ static int tcp6_gro_complete(struct sk_buff *skb, int thoff) | |||
73 | 73 | ||
74 | th->check = ~tcp_v6_check(skb->len - thoff, &iph->saddr, | 74 | th->check = ~tcp_v6_check(skb->len - thoff, &iph->saddr, |
75 | &iph->daddr, 0); | 75 | &iph->daddr, 0); |
76 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; | 76 | skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV6; |
77 | 77 | ||
78 | return tcp_gro_complete(skb); | 78 | return tcp_gro_complete(skb); |
79 | } | 79 | } |
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index ab4566cfcbe4..8746ff9a8357 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c | |||
@@ -35,7 +35,7 @@ int nft_register_afinfo(struct net *net, struct nft_af_info *afi) | |||
35 | { | 35 | { |
36 | INIT_LIST_HEAD(&afi->tables); | 36 | INIT_LIST_HEAD(&afi->tables); |
37 | nfnl_lock(NFNL_SUBSYS_NFTABLES); | 37 | nfnl_lock(NFNL_SUBSYS_NFTABLES); |
38 | list_add_tail(&afi->list, &net->nft.af_info); | 38 | list_add_tail_rcu(&afi->list, &net->nft.af_info); |
39 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); | 39 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); |
40 | return 0; | 40 | return 0; |
41 | } | 41 | } |
@@ -51,7 +51,7 @@ EXPORT_SYMBOL_GPL(nft_register_afinfo); | |||
51 | void nft_unregister_afinfo(struct nft_af_info *afi) | 51 | void nft_unregister_afinfo(struct nft_af_info *afi) |
52 | { | 52 | { |
53 | nfnl_lock(NFNL_SUBSYS_NFTABLES); | 53 | nfnl_lock(NFNL_SUBSYS_NFTABLES); |
54 | list_del(&afi->list); | 54 | list_del_rcu(&afi->list); |
55 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); | 55 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); |
56 | } | 56 | } |
57 | EXPORT_SYMBOL_GPL(nft_unregister_afinfo); | 57 | EXPORT_SYMBOL_GPL(nft_unregister_afinfo); |
@@ -277,11 +277,14 @@ static int nf_tables_dump_tables(struct sk_buff *skb, | |||
277 | struct net *net = sock_net(skb->sk); | 277 | struct net *net = sock_net(skb->sk); |
278 | int family = nfmsg->nfgen_family; | 278 | int family = nfmsg->nfgen_family; |
279 | 279 | ||
280 | list_for_each_entry(afi, &net->nft.af_info, list) { | 280 | rcu_read_lock(); |
281 | cb->seq = net->nft.base_seq; | ||
282 | |||
283 | list_for_each_entry_rcu(afi, &net->nft.af_info, list) { | ||
281 | if (family != NFPROTO_UNSPEC && family != afi->family) | 284 | if (family != NFPROTO_UNSPEC && family != afi->family) |
282 | continue; | 285 | continue; |
283 | 286 | ||
284 | list_for_each_entry(table, &afi->tables, list) { | 287 | list_for_each_entry_rcu(table, &afi->tables, list) { |
285 | if (idx < s_idx) | 288 | if (idx < s_idx) |
286 | goto cont; | 289 | goto cont; |
287 | if (idx > s_idx) | 290 | if (idx > s_idx) |
@@ -294,11 +297,14 @@ static int nf_tables_dump_tables(struct sk_buff *skb, | |||
294 | NLM_F_MULTI, | 297 | NLM_F_MULTI, |
295 | afi->family, table) < 0) | 298 | afi->family, table) < 0) |
296 | goto done; | 299 | goto done; |
300 | |||
301 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
297 | cont: | 302 | cont: |
298 | idx++; | 303 | idx++; |
299 | } | 304 | } |
300 | } | 305 | } |
301 | done: | 306 | done: |
307 | rcu_read_unlock(); | ||
302 | cb->args[0] = idx; | 308 | cb->args[0] = idx; |
303 | return skb->len; | 309 | return skb->len; |
304 | } | 310 | } |
@@ -407,6 +413,9 @@ static int nf_tables_updtable(struct nft_ctx *ctx) | |||
407 | if (flags & ~NFT_TABLE_F_DORMANT) | 413 | if (flags & ~NFT_TABLE_F_DORMANT) |
408 | return -EINVAL; | 414 | return -EINVAL; |
409 | 415 | ||
416 | if (flags == ctx->table->flags) | ||
417 | return 0; | ||
418 | |||
410 | trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE, | 419 | trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE, |
411 | sizeof(struct nft_trans_table)); | 420 | sizeof(struct nft_trans_table)); |
412 | if (trans == NULL) | 421 | if (trans == NULL) |
@@ -514,7 +523,7 @@ static int nf_tables_newtable(struct sock *nlsk, struct sk_buff *skb, | |||
514 | module_put(afi->owner); | 523 | module_put(afi->owner); |
515 | return err; | 524 | return err; |
516 | } | 525 | } |
517 | list_add_tail(&table->list, &afi->tables); | 526 | list_add_tail_rcu(&table->list, &afi->tables); |
518 | return 0; | 527 | return 0; |
519 | } | 528 | } |
520 | 529 | ||
@@ -546,7 +555,7 @@ static int nf_tables_deltable(struct sock *nlsk, struct sk_buff *skb, | |||
546 | if (err < 0) | 555 | if (err < 0) |
547 | return err; | 556 | return err; |
548 | 557 | ||
549 | list_del(&table->list); | 558 | list_del_rcu(&table->list); |
550 | return 0; | 559 | return 0; |
551 | } | 560 | } |
552 | 561 | ||
@@ -635,13 +644,20 @@ static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats) | |||
635 | { | 644 | { |
636 | struct nft_stats *cpu_stats, total; | 645 | struct nft_stats *cpu_stats, total; |
637 | struct nlattr *nest; | 646 | struct nlattr *nest; |
647 | unsigned int seq; | ||
648 | u64 pkts, bytes; | ||
638 | int cpu; | 649 | int cpu; |
639 | 650 | ||
640 | memset(&total, 0, sizeof(total)); | 651 | memset(&total, 0, sizeof(total)); |
641 | for_each_possible_cpu(cpu) { | 652 | for_each_possible_cpu(cpu) { |
642 | cpu_stats = per_cpu_ptr(stats, cpu); | 653 | cpu_stats = per_cpu_ptr(stats, cpu); |
643 | total.pkts += cpu_stats->pkts; | 654 | do { |
644 | total.bytes += cpu_stats->bytes; | 655 | seq = u64_stats_fetch_begin_irq(&cpu_stats->syncp); |
656 | pkts = cpu_stats->pkts; | ||
657 | bytes = cpu_stats->bytes; | ||
658 | } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, seq)); | ||
659 | total.pkts += pkts; | ||
660 | total.bytes += bytes; | ||
645 | } | 661 | } |
646 | nest = nla_nest_start(skb, NFTA_CHAIN_COUNTERS); | 662 | nest = nla_nest_start(skb, NFTA_CHAIN_COUNTERS); |
647 | if (nest == NULL) | 663 | if (nest == NULL) |
@@ -761,12 +777,15 @@ static int nf_tables_dump_chains(struct sk_buff *skb, | |||
761 | struct net *net = sock_net(skb->sk); | 777 | struct net *net = sock_net(skb->sk); |
762 | int family = nfmsg->nfgen_family; | 778 | int family = nfmsg->nfgen_family; |
763 | 779 | ||
764 | list_for_each_entry(afi, &net->nft.af_info, list) { | 780 | rcu_read_lock(); |
781 | cb->seq = net->nft.base_seq; | ||
782 | |||
783 | list_for_each_entry_rcu(afi, &net->nft.af_info, list) { | ||
765 | if (family != NFPROTO_UNSPEC && family != afi->family) | 784 | if (family != NFPROTO_UNSPEC && family != afi->family) |
766 | continue; | 785 | continue; |
767 | 786 | ||
768 | list_for_each_entry(table, &afi->tables, list) { | 787 | list_for_each_entry_rcu(table, &afi->tables, list) { |
769 | list_for_each_entry(chain, &table->chains, list) { | 788 | list_for_each_entry_rcu(chain, &table->chains, list) { |
770 | if (idx < s_idx) | 789 | if (idx < s_idx) |
771 | goto cont; | 790 | goto cont; |
772 | if (idx > s_idx) | 791 | if (idx > s_idx) |
@@ -778,17 +797,19 @@ static int nf_tables_dump_chains(struct sk_buff *skb, | |||
778 | NLM_F_MULTI, | 797 | NLM_F_MULTI, |
779 | afi->family, table, chain) < 0) | 798 | afi->family, table, chain) < 0) |
780 | goto done; | 799 | goto done; |
800 | |||
801 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
781 | cont: | 802 | cont: |
782 | idx++; | 803 | idx++; |
783 | } | 804 | } |
784 | } | 805 | } |
785 | } | 806 | } |
786 | done: | 807 | done: |
808 | rcu_read_unlock(); | ||
787 | cb->args[0] = idx; | 809 | cb->args[0] = idx; |
788 | return skb->len; | 810 | return skb->len; |
789 | } | 811 | } |
790 | 812 | ||
791 | |||
792 | static int nf_tables_getchain(struct sock *nlsk, struct sk_buff *skb, | 813 | static int nf_tables_getchain(struct sock *nlsk, struct sk_buff *skb, |
793 | const struct nlmsghdr *nlh, | 814 | const struct nlmsghdr *nlh, |
794 | const struct nlattr * const nla[]) | 815 | const struct nlattr * const nla[]) |
@@ -861,7 +882,7 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr) | |||
861 | if (!tb[NFTA_COUNTER_BYTES] || !tb[NFTA_COUNTER_PACKETS]) | 882 | if (!tb[NFTA_COUNTER_BYTES] || !tb[NFTA_COUNTER_PACKETS]) |
862 | return ERR_PTR(-EINVAL); | 883 | return ERR_PTR(-EINVAL); |
863 | 884 | ||
864 | newstats = alloc_percpu(struct nft_stats); | 885 | newstats = netdev_alloc_pcpu_stats(struct nft_stats); |
865 | if (newstats == NULL) | 886 | if (newstats == NULL) |
866 | return ERR_PTR(-ENOMEM); | 887 | return ERR_PTR(-ENOMEM); |
867 | 888 | ||
@@ -1077,7 +1098,7 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, | |||
1077 | } | 1098 | } |
1078 | basechain->stats = stats; | 1099 | basechain->stats = stats; |
1079 | } else { | 1100 | } else { |
1080 | stats = alloc_percpu(struct nft_stats); | 1101 | stats = netdev_alloc_pcpu_stats(struct nft_stats); |
1081 | if (IS_ERR(stats)) { | 1102 | if (IS_ERR(stats)) { |
1082 | module_put(type->owner); | 1103 | module_put(type->owner); |
1083 | kfree(basechain); | 1104 | kfree(basechain); |
@@ -1130,7 +1151,7 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, | |||
1130 | goto err2; | 1151 | goto err2; |
1131 | 1152 | ||
1132 | table->use++; | 1153 | table->use++; |
1133 | list_add_tail(&chain->list, &table->chains); | 1154 | list_add_tail_rcu(&chain->list, &table->chains); |
1134 | return 0; | 1155 | return 0; |
1135 | err2: | 1156 | err2: |
1136 | if (!(table->flags & NFT_TABLE_F_DORMANT) && | 1157 | if (!(table->flags & NFT_TABLE_F_DORMANT) && |
@@ -1180,7 +1201,7 @@ static int nf_tables_delchain(struct sock *nlsk, struct sk_buff *skb, | |||
1180 | return err; | 1201 | return err; |
1181 | 1202 | ||
1182 | table->use--; | 1203 | table->use--; |
1183 | list_del(&chain->list); | 1204 | list_del_rcu(&chain->list); |
1184 | return 0; | 1205 | return 0; |
1185 | } | 1206 | } |
1186 | 1207 | ||
@@ -1199,9 +1220,9 @@ int nft_register_expr(struct nft_expr_type *type) | |||
1199 | { | 1220 | { |
1200 | nfnl_lock(NFNL_SUBSYS_NFTABLES); | 1221 | nfnl_lock(NFNL_SUBSYS_NFTABLES); |
1201 | if (type->family == NFPROTO_UNSPEC) | 1222 | if (type->family == NFPROTO_UNSPEC) |
1202 | list_add_tail(&type->list, &nf_tables_expressions); | 1223 | list_add_tail_rcu(&type->list, &nf_tables_expressions); |
1203 | else | 1224 | else |
1204 | list_add(&type->list, &nf_tables_expressions); | 1225 | list_add_rcu(&type->list, &nf_tables_expressions); |
1205 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); | 1226 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); |
1206 | return 0; | 1227 | return 0; |
1207 | } | 1228 | } |
@@ -1216,7 +1237,7 @@ EXPORT_SYMBOL_GPL(nft_register_expr); | |||
1216 | void nft_unregister_expr(struct nft_expr_type *type) | 1237 | void nft_unregister_expr(struct nft_expr_type *type) |
1217 | { | 1238 | { |
1218 | nfnl_lock(NFNL_SUBSYS_NFTABLES); | 1239 | nfnl_lock(NFNL_SUBSYS_NFTABLES); |
1219 | list_del(&type->list); | 1240 | list_del_rcu(&type->list); |
1220 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); | 1241 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); |
1221 | } | 1242 | } |
1222 | EXPORT_SYMBOL_GPL(nft_unregister_expr); | 1243 | EXPORT_SYMBOL_GPL(nft_unregister_expr); |
@@ -1549,16 +1570,17 @@ static int nf_tables_dump_rules(struct sk_buff *skb, | |||
1549 | unsigned int idx = 0, s_idx = cb->args[0]; | 1570 | unsigned int idx = 0, s_idx = cb->args[0]; |
1550 | struct net *net = sock_net(skb->sk); | 1571 | struct net *net = sock_net(skb->sk); |
1551 | int family = nfmsg->nfgen_family; | 1572 | int family = nfmsg->nfgen_family; |
1552 | u8 genctr = ACCESS_ONCE(net->nft.genctr); | ||
1553 | u8 gencursor = ACCESS_ONCE(net->nft.gencursor); | ||
1554 | 1573 | ||
1555 | list_for_each_entry(afi, &net->nft.af_info, list) { | 1574 | rcu_read_lock(); |
1575 | cb->seq = net->nft.base_seq; | ||
1576 | |||
1577 | list_for_each_entry_rcu(afi, &net->nft.af_info, list) { | ||
1556 | if (family != NFPROTO_UNSPEC && family != afi->family) | 1578 | if (family != NFPROTO_UNSPEC && family != afi->family) |
1557 | continue; | 1579 | continue; |
1558 | 1580 | ||
1559 | list_for_each_entry(table, &afi->tables, list) { | 1581 | list_for_each_entry_rcu(table, &afi->tables, list) { |
1560 | list_for_each_entry(chain, &table->chains, list) { | 1582 | list_for_each_entry_rcu(chain, &table->chains, list) { |
1561 | list_for_each_entry(rule, &chain->rules, list) { | 1583 | list_for_each_entry_rcu(rule, &chain->rules, list) { |
1562 | if (!nft_rule_is_active(net, rule)) | 1584 | if (!nft_rule_is_active(net, rule)) |
1563 | goto cont; | 1585 | goto cont; |
1564 | if (idx < s_idx) | 1586 | if (idx < s_idx) |
@@ -1572,6 +1594,8 @@ static int nf_tables_dump_rules(struct sk_buff *skb, | |||
1572 | NLM_F_MULTI | NLM_F_APPEND, | 1594 | NLM_F_MULTI | NLM_F_APPEND, |
1573 | afi->family, table, chain, rule) < 0) | 1595 | afi->family, table, chain, rule) < 0) |
1574 | goto done; | 1596 | goto done; |
1597 | |||
1598 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
1575 | cont: | 1599 | cont: |
1576 | idx++; | 1600 | idx++; |
1577 | } | 1601 | } |
@@ -1579,9 +1603,7 @@ cont: | |||
1579 | } | 1603 | } |
1580 | } | 1604 | } |
1581 | done: | 1605 | done: |
1582 | /* Invalidate this dump, a transition to the new generation happened */ | 1606 | rcu_read_unlock(); |
1583 | if (gencursor != net->nft.gencursor || genctr != net->nft.genctr) | ||
1584 | return -EBUSY; | ||
1585 | 1607 | ||
1586 | cb->args[0] = idx; | 1608 | cb->args[0] = idx; |
1587 | return skb->len; | 1609 | return skb->len; |
@@ -1932,7 +1954,7 @@ static LIST_HEAD(nf_tables_set_ops); | |||
1932 | int nft_register_set(struct nft_set_ops *ops) | 1954 | int nft_register_set(struct nft_set_ops *ops) |
1933 | { | 1955 | { |
1934 | nfnl_lock(NFNL_SUBSYS_NFTABLES); | 1956 | nfnl_lock(NFNL_SUBSYS_NFTABLES); |
1935 | list_add_tail(&ops->list, &nf_tables_set_ops); | 1957 | list_add_tail_rcu(&ops->list, &nf_tables_set_ops); |
1936 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); | 1958 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); |
1937 | return 0; | 1959 | return 0; |
1938 | } | 1960 | } |
@@ -1941,7 +1963,7 @@ EXPORT_SYMBOL_GPL(nft_register_set); | |||
1941 | void nft_unregister_set(struct nft_set_ops *ops) | 1963 | void nft_unregister_set(struct nft_set_ops *ops) |
1942 | { | 1964 | { |
1943 | nfnl_lock(NFNL_SUBSYS_NFTABLES); | 1965 | nfnl_lock(NFNL_SUBSYS_NFTABLES); |
1944 | list_del(&ops->list); | 1966 | list_del_rcu(&ops->list); |
1945 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); | 1967 | nfnl_unlock(NFNL_SUBSYS_NFTABLES); |
1946 | } | 1968 | } |
1947 | EXPORT_SYMBOL_GPL(nft_unregister_set); | 1969 | EXPORT_SYMBOL_GPL(nft_unregister_set); |
@@ -2234,7 +2256,10 @@ static int nf_tables_dump_sets_table(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2234 | if (cb->args[1]) | 2256 | if (cb->args[1]) |
2235 | return skb->len; | 2257 | return skb->len; |
2236 | 2258 | ||
2237 | list_for_each_entry(set, &ctx->table->sets, list) { | 2259 | rcu_read_lock(); |
2260 | cb->seq = ctx->net->nft.base_seq; | ||
2261 | |||
2262 | list_for_each_entry_rcu(set, &ctx->table->sets, list) { | ||
2238 | if (idx < s_idx) | 2263 | if (idx < s_idx) |
2239 | goto cont; | 2264 | goto cont; |
2240 | if (nf_tables_fill_set(skb, ctx, set, NFT_MSG_NEWSET, | 2265 | if (nf_tables_fill_set(skb, ctx, set, NFT_MSG_NEWSET, |
@@ -2242,11 +2267,13 @@ static int nf_tables_dump_sets_table(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2242 | cb->args[0] = idx; | 2267 | cb->args[0] = idx; |
2243 | goto done; | 2268 | goto done; |
2244 | } | 2269 | } |
2270 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
2245 | cont: | 2271 | cont: |
2246 | idx++; | 2272 | idx++; |
2247 | } | 2273 | } |
2248 | cb->args[1] = 1; | 2274 | cb->args[1] = 1; |
2249 | done: | 2275 | done: |
2276 | rcu_read_unlock(); | ||
2250 | return skb->len; | 2277 | return skb->len; |
2251 | } | 2278 | } |
2252 | 2279 | ||
@@ -2260,7 +2287,10 @@ static int nf_tables_dump_sets_family(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2260 | if (cb->args[1]) | 2287 | if (cb->args[1]) |
2261 | return skb->len; | 2288 | return skb->len; |
2262 | 2289 | ||
2263 | list_for_each_entry(table, &ctx->afi->tables, list) { | 2290 | rcu_read_lock(); |
2291 | cb->seq = ctx->net->nft.base_seq; | ||
2292 | |||
2293 | list_for_each_entry_rcu(table, &ctx->afi->tables, list) { | ||
2264 | if (cur_table) { | 2294 | if (cur_table) { |
2265 | if (cur_table != table) | 2295 | if (cur_table != table) |
2266 | continue; | 2296 | continue; |
@@ -2269,7 +2299,7 @@ static int nf_tables_dump_sets_family(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2269 | } | 2299 | } |
2270 | ctx->table = table; | 2300 | ctx->table = table; |
2271 | idx = 0; | 2301 | idx = 0; |
2272 | list_for_each_entry(set, &ctx->table->sets, list) { | 2302 | list_for_each_entry_rcu(set, &ctx->table->sets, list) { |
2273 | if (idx < s_idx) | 2303 | if (idx < s_idx) |
2274 | goto cont; | 2304 | goto cont; |
2275 | if (nf_tables_fill_set(skb, ctx, set, NFT_MSG_NEWSET, | 2305 | if (nf_tables_fill_set(skb, ctx, set, NFT_MSG_NEWSET, |
@@ -2278,12 +2308,14 @@ static int nf_tables_dump_sets_family(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2278 | cb->args[2] = (unsigned long) table; | 2308 | cb->args[2] = (unsigned long) table; |
2279 | goto done; | 2309 | goto done; |
2280 | } | 2310 | } |
2311 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
2281 | cont: | 2312 | cont: |
2282 | idx++; | 2313 | idx++; |
2283 | } | 2314 | } |
2284 | } | 2315 | } |
2285 | cb->args[1] = 1; | 2316 | cb->args[1] = 1; |
2286 | done: | 2317 | done: |
2318 | rcu_read_unlock(); | ||
2287 | return skb->len; | 2319 | return skb->len; |
2288 | } | 2320 | } |
2289 | 2321 | ||
@@ -2300,7 +2332,10 @@ static int nf_tables_dump_sets_all(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2300 | if (cb->args[1]) | 2332 | if (cb->args[1]) |
2301 | return skb->len; | 2333 | return skb->len; |
2302 | 2334 | ||
2303 | list_for_each_entry(afi, &net->nft.af_info, list) { | 2335 | rcu_read_lock(); |
2336 | cb->seq = net->nft.base_seq; | ||
2337 | |||
2338 | list_for_each_entry_rcu(afi, &net->nft.af_info, list) { | ||
2304 | if (cur_family) { | 2339 | if (cur_family) { |
2305 | if (afi->family != cur_family) | 2340 | if (afi->family != cur_family) |
2306 | continue; | 2341 | continue; |
@@ -2308,7 +2343,7 @@ static int nf_tables_dump_sets_all(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2308 | cur_family = 0; | 2343 | cur_family = 0; |
2309 | } | 2344 | } |
2310 | 2345 | ||
2311 | list_for_each_entry(table, &afi->tables, list) { | 2346 | list_for_each_entry_rcu(table, &afi->tables, list) { |
2312 | if (cur_table) { | 2347 | if (cur_table) { |
2313 | if (cur_table != table) | 2348 | if (cur_table != table) |
2314 | continue; | 2349 | continue; |
@@ -2319,7 +2354,7 @@ static int nf_tables_dump_sets_all(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2319 | ctx->table = table; | 2354 | ctx->table = table; |
2320 | ctx->afi = afi; | 2355 | ctx->afi = afi; |
2321 | idx = 0; | 2356 | idx = 0; |
2322 | list_for_each_entry(set, &ctx->table->sets, list) { | 2357 | list_for_each_entry_rcu(set, &ctx->table->sets, list) { |
2323 | if (idx < s_idx) | 2358 | if (idx < s_idx) |
2324 | goto cont; | 2359 | goto cont; |
2325 | if (nf_tables_fill_set(skb, ctx, set, | 2360 | if (nf_tables_fill_set(skb, ctx, set, |
@@ -2330,6 +2365,7 @@ static int nf_tables_dump_sets_all(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2330 | cb->args[3] = afi->family; | 2365 | cb->args[3] = afi->family; |
2331 | goto done; | 2366 | goto done; |
2332 | } | 2367 | } |
2368 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
2333 | cont: | 2369 | cont: |
2334 | idx++; | 2370 | idx++; |
2335 | } | 2371 | } |
@@ -2339,6 +2375,7 @@ cont: | |||
2339 | } | 2375 | } |
2340 | cb->args[1] = 1; | 2376 | cb->args[1] = 1; |
2341 | done: | 2377 | done: |
2378 | rcu_read_unlock(); | ||
2342 | return skb->len; | 2379 | return skb->len; |
2343 | } | 2380 | } |
2344 | 2381 | ||
@@ -2597,7 +2634,7 @@ static int nf_tables_newset(struct sock *nlsk, struct sk_buff *skb, | |||
2597 | if (err < 0) | 2634 | if (err < 0) |
2598 | goto err2; | 2635 | goto err2; |
2599 | 2636 | ||
2600 | list_add_tail(&set->list, &table->sets); | 2637 | list_add_tail_rcu(&set->list, &table->sets); |
2601 | table->use++; | 2638 | table->use++; |
2602 | return 0; | 2639 | return 0; |
2603 | 2640 | ||
@@ -2617,7 +2654,7 @@ static void nft_set_destroy(struct nft_set *set) | |||
2617 | 2654 | ||
2618 | static void nf_tables_set_destroy(const struct nft_ctx *ctx, struct nft_set *set) | 2655 | static void nf_tables_set_destroy(const struct nft_ctx *ctx, struct nft_set *set) |
2619 | { | 2656 | { |
2620 | list_del(&set->list); | 2657 | list_del_rcu(&set->list); |
2621 | nf_tables_set_notify(ctx, set, NFT_MSG_DELSET, GFP_ATOMIC); | 2658 | nf_tables_set_notify(ctx, set, NFT_MSG_DELSET, GFP_ATOMIC); |
2622 | nft_set_destroy(set); | 2659 | nft_set_destroy(set); |
2623 | } | 2660 | } |
@@ -2652,7 +2689,7 @@ static int nf_tables_delset(struct sock *nlsk, struct sk_buff *skb, | |||
2652 | if (err < 0) | 2689 | if (err < 0) |
2653 | return err; | 2690 | return err; |
2654 | 2691 | ||
2655 | list_del(&set->list); | 2692 | list_del_rcu(&set->list); |
2656 | ctx.table->use--; | 2693 | ctx.table->use--; |
2657 | return 0; | 2694 | return 0; |
2658 | } | 2695 | } |
@@ -2704,14 +2741,14 @@ int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set, | |||
2704 | } | 2741 | } |
2705 | bind: | 2742 | bind: |
2706 | binding->chain = ctx->chain; | 2743 | binding->chain = ctx->chain; |
2707 | list_add_tail(&binding->list, &set->bindings); | 2744 | list_add_tail_rcu(&binding->list, &set->bindings); |
2708 | return 0; | 2745 | return 0; |
2709 | } | 2746 | } |
2710 | 2747 | ||
2711 | void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set, | 2748 | void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set, |
2712 | struct nft_set_binding *binding) | 2749 | struct nft_set_binding *binding) |
2713 | { | 2750 | { |
2714 | list_del(&binding->list); | 2751 | list_del_rcu(&binding->list); |
2715 | 2752 | ||
2716 | if (list_empty(&set->bindings) && set->flags & NFT_SET_ANONYMOUS && | 2753 | if (list_empty(&set->bindings) && set->flags & NFT_SET_ANONYMOUS && |
2717 | !(set->flags & NFT_SET_INACTIVE)) | 2754 | !(set->flags & NFT_SET_INACTIVE)) |
@@ -3346,7 +3383,7 @@ static int nf_tables_commit(struct sk_buff *skb) | |||
3346 | struct nft_set *set; | 3383 | struct nft_set *set; |
3347 | 3384 | ||
3348 | /* Bump generation counter, invalidate any dump in progress */ | 3385 | /* Bump generation counter, invalidate any dump in progress */ |
3349 | net->nft.genctr++; | 3386 | while (++net->nft.base_seq == 0); |
3350 | 3387 | ||
3351 | /* A new generation has just started */ | 3388 | /* A new generation has just started */ |
3352 | net->nft.gencursor = gencursor_next(net); | 3389 | net->nft.gencursor = gencursor_next(net); |
@@ -3491,12 +3528,12 @@ static int nf_tables_abort(struct sk_buff *skb) | |||
3491 | } | 3528 | } |
3492 | nft_trans_destroy(trans); | 3529 | nft_trans_destroy(trans); |
3493 | } else { | 3530 | } else { |
3494 | list_del(&trans->ctx.table->list); | 3531 | list_del_rcu(&trans->ctx.table->list); |
3495 | } | 3532 | } |
3496 | break; | 3533 | break; |
3497 | case NFT_MSG_DELTABLE: | 3534 | case NFT_MSG_DELTABLE: |
3498 | list_add_tail(&trans->ctx.table->list, | 3535 | list_add_tail_rcu(&trans->ctx.table->list, |
3499 | &trans->ctx.afi->tables); | 3536 | &trans->ctx.afi->tables); |
3500 | nft_trans_destroy(trans); | 3537 | nft_trans_destroy(trans); |
3501 | break; | 3538 | break; |
3502 | case NFT_MSG_NEWCHAIN: | 3539 | case NFT_MSG_NEWCHAIN: |
@@ -3507,7 +3544,7 @@ static int nf_tables_abort(struct sk_buff *skb) | |||
3507 | nft_trans_destroy(trans); | 3544 | nft_trans_destroy(trans); |
3508 | } else { | 3545 | } else { |
3509 | trans->ctx.table->use--; | 3546 | trans->ctx.table->use--; |
3510 | list_del(&trans->ctx.chain->list); | 3547 | list_del_rcu(&trans->ctx.chain->list); |
3511 | if (!(trans->ctx.table->flags & NFT_TABLE_F_DORMANT) && | 3548 | if (!(trans->ctx.table->flags & NFT_TABLE_F_DORMANT) && |
3512 | trans->ctx.chain->flags & NFT_BASE_CHAIN) { | 3549 | trans->ctx.chain->flags & NFT_BASE_CHAIN) { |
3513 | nf_unregister_hooks(nft_base_chain(trans->ctx.chain)->ops, | 3550 | nf_unregister_hooks(nft_base_chain(trans->ctx.chain)->ops, |
@@ -3517,8 +3554,8 @@ static int nf_tables_abort(struct sk_buff *skb) | |||
3517 | break; | 3554 | break; |
3518 | case NFT_MSG_DELCHAIN: | 3555 | case NFT_MSG_DELCHAIN: |
3519 | trans->ctx.table->use++; | 3556 | trans->ctx.table->use++; |
3520 | list_add_tail(&trans->ctx.chain->list, | 3557 | list_add_tail_rcu(&trans->ctx.chain->list, |
3521 | &trans->ctx.table->chains); | 3558 | &trans->ctx.table->chains); |
3522 | nft_trans_destroy(trans); | 3559 | nft_trans_destroy(trans); |
3523 | break; | 3560 | break; |
3524 | case NFT_MSG_NEWRULE: | 3561 | case NFT_MSG_NEWRULE: |
@@ -3532,12 +3569,12 @@ static int nf_tables_abort(struct sk_buff *skb) | |||
3532 | break; | 3569 | break; |
3533 | case NFT_MSG_NEWSET: | 3570 | case NFT_MSG_NEWSET: |
3534 | trans->ctx.table->use--; | 3571 | trans->ctx.table->use--; |
3535 | list_del(&nft_trans_set(trans)->list); | 3572 | list_del_rcu(&nft_trans_set(trans)->list); |
3536 | break; | 3573 | break; |
3537 | case NFT_MSG_DELSET: | 3574 | case NFT_MSG_DELSET: |
3538 | trans->ctx.table->use++; | 3575 | trans->ctx.table->use++; |
3539 | list_add_tail(&nft_trans_set(trans)->list, | 3576 | list_add_tail_rcu(&nft_trans_set(trans)->list, |
3540 | &trans->ctx.table->sets); | 3577 | &trans->ctx.table->sets); |
3541 | nft_trans_destroy(trans); | 3578 | nft_trans_destroy(trans); |
3542 | break; | 3579 | break; |
3543 | case NFT_MSG_NEWSETELEM: | 3580 | case NFT_MSG_NEWSETELEM: |
@@ -3951,6 +3988,7 @@ static int nf_tables_init_net(struct net *net) | |||
3951 | { | 3988 | { |
3952 | INIT_LIST_HEAD(&net->nft.af_info); | 3989 | INIT_LIST_HEAD(&net->nft.af_info); |
3953 | INIT_LIST_HEAD(&net->nft.commit_list); | 3990 | INIT_LIST_HEAD(&net->nft.commit_list); |
3991 | net->nft.base_seq = 1; | ||
3954 | return 0; | 3992 | return 0; |
3955 | } | 3993 | } |
3956 | 3994 | ||
diff --git a/net/netfilter/nf_tables_core.c b/net/netfilter/nf_tables_core.c index 345acfb1720b..3b90eb2b2c55 100644 --- a/net/netfilter/nf_tables_core.c +++ b/net/netfilter/nf_tables_core.c | |||
@@ -109,7 +109,7 @@ nft_do_chain(struct nft_pktinfo *pkt, const struct nf_hook_ops *ops) | |||
109 | struct nft_data data[NFT_REG_MAX + 1]; | 109 | struct nft_data data[NFT_REG_MAX + 1]; |
110 | unsigned int stackptr = 0; | 110 | unsigned int stackptr = 0; |
111 | struct nft_jumpstack jumpstack[NFT_JUMP_STACK_SIZE]; | 111 | struct nft_jumpstack jumpstack[NFT_JUMP_STACK_SIZE]; |
112 | struct nft_stats __percpu *stats; | 112 | struct nft_stats *stats; |
113 | int rulenum; | 113 | int rulenum; |
114 | /* | 114 | /* |
115 | * Cache cursor to avoid problems in case that the cursor is updated | 115 | * Cache cursor to avoid problems in case that the cursor is updated |
@@ -205,9 +205,11 @@ next_rule: | |||
205 | nft_trace_packet(pkt, basechain, -1, NFT_TRACE_POLICY); | 205 | nft_trace_packet(pkt, basechain, -1, NFT_TRACE_POLICY); |
206 | 206 | ||
207 | rcu_read_lock_bh(); | 207 | rcu_read_lock_bh(); |
208 | stats = rcu_dereference(nft_base_chain(basechain)->stats); | 208 | stats = this_cpu_ptr(rcu_dereference(nft_base_chain(basechain)->stats)); |
209 | __this_cpu_inc(stats->pkts); | 209 | u64_stats_update_begin(&stats->syncp); |
210 | __this_cpu_add(stats->bytes, pkt->skb->len); | 210 | stats->pkts++; |
211 | stats->bytes += pkt->skb->len; | ||
212 | u64_stats_update_end(&stats->syncp); | ||
211 | rcu_read_unlock_bh(); | 213 | rcu_read_unlock_bh(); |
212 | 214 | ||
213 | return nft_base_chain(basechain)->policy; | 215 | return nft_base_chain(basechain)->policy; |
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index c39b583ace32..70c0be8d0121 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/errno.h> | 38 | #include <linux/errno.h> |
39 | #include <linux/rtnetlink.h> | 39 | #include <linux/rtnetlink.h> |
40 | #include <linux/skbuff.h> | 40 | #include <linux/skbuff.h> |
41 | #include <linux/bitmap.h> | ||
41 | #include <net/netlink.h> | 42 | #include <net/netlink.h> |
42 | #include <net/act_api.h> | 43 | #include <net/act_api.h> |
43 | #include <net/pkt_cls.h> | 44 | #include <net/pkt_cls.h> |
@@ -460,17 +461,25 @@ static int u32_delete(struct tcf_proto *tp, unsigned long arg) | |||
460 | return 0; | 461 | return 0; |
461 | } | 462 | } |
462 | 463 | ||
464 | #define NR_U32_NODE (1<<12) | ||
463 | static u32 gen_new_kid(struct tc_u_hnode *ht, u32 handle) | 465 | static u32 gen_new_kid(struct tc_u_hnode *ht, u32 handle) |
464 | { | 466 | { |
465 | struct tc_u_knode *n; | 467 | struct tc_u_knode *n; |
466 | unsigned int i = 0x7FF; | 468 | unsigned long i; |
469 | unsigned long *bitmap = kzalloc(BITS_TO_LONGS(NR_U32_NODE) * sizeof(unsigned long), | ||
470 | GFP_KERNEL); | ||
471 | if (!bitmap) | ||
472 | return handle | 0xFFF; | ||
467 | 473 | ||
468 | for (n = ht->ht[TC_U32_HASH(handle)]; n; n = n->next) | 474 | for (n = ht->ht[TC_U32_HASH(handle)]; n; n = n->next) |
469 | if (i < TC_U32_NODE(n->handle)) | 475 | set_bit(TC_U32_NODE(n->handle), bitmap); |
470 | i = TC_U32_NODE(n->handle); | ||
471 | i++; | ||
472 | 476 | ||
473 | return handle | (i > 0xFFF ? 0xFFF : i); | 477 | i = find_next_zero_bit(bitmap, NR_U32_NODE, 0x800); |
478 | if (i >= NR_U32_NODE) | ||
479 | i = find_next_zero_bit(bitmap, NR_U32_NODE, 1); | ||
480 | |||
481 | kfree(bitmap); | ||
482 | return handle | (i >= NR_U32_NODE ? 0xFFF : i); | ||
474 | } | 483 | } |
475 | 484 | ||
476 | static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = { | 485 | static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = { |
diff --git a/sound/firewire/bebob/bebob_maudio.c b/sound/firewire/bebob/bebob_maudio.c index 6af50eb80ea7..70faa3a32526 100644 --- a/sound/firewire/bebob/bebob_maudio.c +++ b/sound/firewire/bebob/bebob_maudio.c | |||
@@ -379,11 +379,11 @@ static int special_clk_ctl_put(struct snd_kcontrol *kctl, | |||
379 | struct special_params *params = bebob->maudio_special_quirk; | 379 | struct special_params *params = bebob->maudio_special_quirk; |
380 | int err, id; | 380 | int err, id; |
381 | 381 | ||
382 | mutex_lock(&bebob->mutex); | ||
383 | |||
384 | id = uval->value.enumerated.item[0]; | 382 | id = uval->value.enumerated.item[0]; |
385 | if (id >= ARRAY_SIZE(special_clk_labels)) | 383 | if (id >= ARRAY_SIZE(special_clk_labels)) |
386 | return 0; | 384 | return -EINVAL; |
385 | |||
386 | mutex_lock(&bebob->mutex); | ||
387 | 387 | ||
388 | err = avc_maudio_set_special_clk(bebob, id, | 388 | err = avc_maudio_set_special_clk(bebob, id, |
389 | params->dig_in_fmt, | 389 | params->dig_in_fmt, |
@@ -391,7 +391,10 @@ static int special_clk_ctl_put(struct snd_kcontrol *kctl, | |||
391 | params->clk_lock); | 391 | params->clk_lock); |
392 | mutex_unlock(&bebob->mutex); | 392 | mutex_unlock(&bebob->mutex); |
393 | 393 | ||
394 | return err >= 0; | 394 | if (err >= 0) |
395 | err = 1; | ||
396 | |||
397 | return err; | ||
395 | } | 398 | } |
396 | static struct snd_kcontrol_new special_clk_ctl = { | 399 | static struct snd_kcontrol_new special_clk_ctl = { |
397 | .name = "Clock Source", | 400 | .name = "Clock Source", |
@@ -434,8 +437,8 @@ static struct snd_kcontrol_new special_sync_ctl = { | |||
434 | .get = special_sync_ctl_get, | 437 | .get = special_sync_ctl_get, |
435 | }; | 438 | }; |
436 | 439 | ||
437 | /* Digital interface control for special firmware */ | 440 | /* Digital input interface control for special firmware */ |
438 | static char *const special_dig_iface_labels[] = { | 441 | static char *const special_dig_in_iface_labels[] = { |
439 | "S/PDIF Optical", "S/PDIF Coaxial", "ADAT Optical" | 442 | "S/PDIF Optical", "S/PDIF Coaxial", "ADAT Optical" |
440 | }; | 443 | }; |
441 | static int special_dig_in_iface_ctl_info(struct snd_kcontrol *kctl, | 444 | static int special_dig_in_iface_ctl_info(struct snd_kcontrol *kctl, |
@@ -443,13 +446,13 @@ static int special_dig_in_iface_ctl_info(struct snd_kcontrol *kctl, | |||
443 | { | 446 | { |
444 | einf->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 447 | einf->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
445 | einf->count = 1; | 448 | einf->count = 1; |
446 | einf->value.enumerated.items = ARRAY_SIZE(special_dig_iface_labels); | 449 | einf->value.enumerated.items = ARRAY_SIZE(special_dig_in_iface_labels); |
447 | 450 | ||
448 | if (einf->value.enumerated.item >= einf->value.enumerated.items) | 451 | if (einf->value.enumerated.item >= einf->value.enumerated.items) |
449 | einf->value.enumerated.item = einf->value.enumerated.items - 1; | 452 | einf->value.enumerated.item = einf->value.enumerated.items - 1; |
450 | 453 | ||
451 | strcpy(einf->value.enumerated.name, | 454 | strcpy(einf->value.enumerated.name, |
452 | special_dig_iface_labels[einf->value.enumerated.item]); | 455 | special_dig_in_iface_labels[einf->value.enumerated.item]); |
453 | 456 | ||
454 | return 0; | 457 | return 0; |
455 | } | 458 | } |
@@ -491,26 +494,36 @@ static int special_dig_in_iface_ctl_set(struct snd_kcontrol *kctl, | |||
491 | unsigned int id, dig_in_fmt, dig_in_iface; | 494 | unsigned int id, dig_in_fmt, dig_in_iface; |
492 | int err; | 495 | int err; |
493 | 496 | ||
494 | mutex_lock(&bebob->mutex); | ||
495 | |||
496 | id = uval->value.enumerated.item[0]; | 497 | id = uval->value.enumerated.item[0]; |
498 | if (id >= ARRAY_SIZE(special_dig_in_iface_labels)) | ||
499 | return -EINVAL; | ||
497 | 500 | ||
498 | /* decode user value */ | 501 | /* decode user value */ |
499 | dig_in_fmt = (id >> 1) & 0x01; | 502 | dig_in_fmt = (id >> 1) & 0x01; |
500 | dig_in_iface = id & 0x01; | 503 | dig_in_iface = id & 0x01; |
501 | 504 | ||
505 | mutex_lock(&bebob->mutex); | ||
506 | |||
502 | err = avc_maudio_set_special_clk(bebob, | 507 | err = avc_maudio_set_special_clk(bebob, |
503 | params->clk_src, | 508 | params->clk_src, |
504 | dig_in_fmt, | 509 | dig_in_fmt, |
505 | params->dig_out_fmt, | 510 | params->dig_out_fmt, |
506 | params->clk_lock); | 511 | params->clk_lock); |
507 | if ((err < 0) || (params->dig_in_fmt > 0)) /* ADAT */ | 512 | if (err < 0) |
513 | goto end; | ||
514 | |||
515 | /* For ADAT, optical interface is only available. */ | ||
516 | if (params->dig_in_fmt > 0) { | ||
517 | err = 1; | ||
508 | goto end; | 518 | goto end; |
519 | } | ||
509 | 520 | ||
521 | /* For S/PDIF, optical/coaxial interfaces are selectable. */ | ||
510 | err = avc_audio_set_selector(bebob->unit, 0x00, 0x04, dig_in_iface); | 522 | err = avc_audio_set_selector(bebob->unit, 0x00, 0x04, dig_in_iface); |
511 | if (err < 0) | 523 | if (err < 0) |
512 | dev_err(&bebob->unit->device, | 524 | dev_err(&bebob->unit->device, |
513 | "fail to set digital input interface: %d\n", err); | 525 | "fail to set digital input interface: %d\n", err); |
526 | err = 1; | ||
514 | end: | 527 | end: |
515 | special_stream_formation_set(bebob); | 528 | special_stream_formation_set(bebob); |
516 | mutex_unlock(&bebob->mutex); | 529 | mutex_unlock(&bebob->mutex); |
@@ -525,18 +538,22 @@ static struct snd_kcontrol_new special_dig_in_iface_ctl = { | |||
525 | .put = special_dig_in_iface_ctl_set | 538 | .put = special_dig_in_iface_ctl_set |
526 | }; | 539 | }; |
527 | 540 | ||
541 | /* Digital output interface control for special firmware */ | ||
542 | static char *const special_dig_out_iface_labels[] = { | ||
543 | "S/PDIF Optical and Coaxial", "ADAT Optical" | ||
544 | }; | ||
528 | static int special_dig_out_iface_ctl_info(struct snd_kcontrol *kctl, | 545 | static int special_dig_out_iface_ctl_info(struct snd_kcontrol *kctl, |
529 | struct snd_ctl_elem_info *einf) | 546 | struct snd_ctl_elem_info *einf) |
530 | { | 547 | { |
531 | einf->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 548 | einf->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
532 | einf->count = 1; | 549 | einf->count = 1; |
533 | einf->value.enumerated.items = ARRAY_SIZE(special_dig_iface_labels) - 1; | 550 | einf->value.enumerated.items = ARRAY_SIZE(special_dig_out_iface_labels); |
534 | 551 | ||
535 | if (einf->value.enumerated.item >= einf->value.enumerated.items) | 552 | if (einf->value.enumerated.item >= einf->value.enumerated.items) |
536 | einf->value.enumerated.item = einf->value.enumerated.items - 1; | 553 | einf->value.enumerated.item = einf->value.enumerated.items - 1; |
537 | 554 | ||
538 | strcpy(einf->value.enumerated.name, | 555 | strcpy(einf->value.enumerated.name, |
539 | special_dig_iface_labels[einf->value.enumerated.item + 1]); | 556 | special_dig_out_iface_labels[einf->value.enumerated.item]); |
540 | 557 | ||
541 | return 0; | 558 | return 0; |
542 | } | 559 | } |
@@ -558,16 +575,20 @@ static int special_dig_out_iface_ctl_set(struct snd_kcontrol *kctl, | |||
558 | unsigned int id; | 575 | unsigned int id; |
559 | int err; | 576 | int err; |
560 | 577 | ||
561 | mutex_lock(&bebob->mutex); | ||
562 | |||
563 | id = uval->value.enumerated.item[0]; | 578 | id = uval->value.enumerated.item[0]; |
579 | if (id >= ARRAY_SIZE(special_dig_out_iface_labels)) | ||
580 | return -EINVAL; | ||
581 | |||
582 | mutex_lock(&bebob->mutex); | ||
564 | 583 | ||
565 | err = avc_maudio_set_special_clk(bebob, | 584 | err = avc_maudio_set_special_clk(bebob, |
566 | params->clk_src, | 585 | params->clk_src, |
567 | params->dig_in_fmt, | 586 | params->dig_in_fmt, |
568 | id, params->clk_lock); | 587 | id, params->clk_lock); |
569 | if (err >= 0) | 588 | if (err >= 0) { |
570 | special_stream_formation_set(bebob); | 589 | special_stream_formation_set(bebob); |
590 | err = 1; | ||
591 | } | ||
571 | 592 | ||
572 | mutex_unlock(&bebob->mutex); | 593 | mutex_unlock(&bebob->mutex); |
573 | return err; | 594 | return err; |