mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-24 11:16:51 +00:00
projects/Cuboxi/patches/linux: add kernel upstream patches
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
7b81850c50
commit
c158f374bd
800
projects/Cuboxi/patches/linux/linux-000-patch-3.10.30-31.patch
Normal file
800
projects/Cuboxi/patches/linux/linux-000-patch-3.10.30-31.patch
Normal file
@ -0,0 +1,800 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 18016a55dbd3..56b93edbbe4e 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 30
|
||||
+SUBLEVEL = 31
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h
|
||||
index 3300cbd18a89..0c13554965b8 100644
|
||||
--- a/arch/arm64/include/asm/cacheflush.h
|
||||
+++ b/arch/arm64/include/asm/cacheflush.h
|
||||
@@ -116,6 +116,7 @@ extern void flush_dcache_page(struct page *);
|
||||
static inline void __flush_icache_all(void)
|
||||
{
|
||||
asm("ic ialluis");
|
||||
+ dsb();
|
||||
}
|
||||
|
||||
#define flush_dcache_mmap_lock(mapping) \
|
||||
diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
|
||||
index 6a389dc1bd49..0ea7a22bcdf2 100644
|
||||
--- a/arch/arm64/kernel/vdso.c
|
||||
+++ b/arch/arm64/kernel/vdso.c
|
||||
@@ -235,6 +235,8 @@ void update_vsyscall(struct timekeeper *tk)
|
||||
vdso_data->use_syscall = use_syscall;
|
||||
vdso_data->xtime_coarse_sec = xtime_coarse.tv_sec;
|
||||
vdso_data->xtime_coarse_nsec = xtime_coarse.tv_nsec;
|
||||
+ vdso_data->wtm_clock_sec = tk->wall_to_monotonic.tv_sec;
|
||||
+ vdso_data->wtm_clock_nsec = tk->wall_to_monotonic.tv_nsec;
|
||||
|
||||
if (!use_syscall) {
|
||||
vdso_data->cs_cycle_last = tk->clock->cycle_last;
|
||||
@@ -242,8 +244,6 @@ void update_vsyscall(struct timekeeper *tk)
|
||||
vdso_data->xtime_clock_nsec = tk->xtime_nsec;
|
||||
vdso_data->cs_mult = tk->mult;
|
||||
vdso_data->cs_shift = tk->shift;
|
||||
- vdso_data->wtm_clock_sec = tk->wall_to_monotonic.tv_sec;
|
||||
- vdso_data->wtm_clock_nsec = tk->wall_to_monotonic.tv_nsec;
|
||||
}
|
||||
|
||||
smp_wmb();
|
||||
diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile
|
||||
index d8064af42e62..6d20b7d162d8 100644
|
||||
--- a/arch/arm64/kernel/vdso/Makefile
|
||||
+++ b/arch/arm64/kernel/vdso/Makefile
|
||||
@@ -48,7 +48,7 @@ $(obj-vdso): %.o: %.S
|
||||
|
||||
# Actual build commands
|
||||
quiet_cmd_vdsold = VDSOL $@
|
||||
- cmd_vdsold = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
||||
+ cmd_vdsold = $(CC) $(c_flags) -Wl,-n -Wl,-T $^ -o $@
|
||||
quiet_cmd_vdsoas = VDSOA $@
|
||||
cmd_vdsoas = $(CC) $(a_flags) -c -o $@ $<
|
||||
|
||||
diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S
|
||||
index f0a6d10b5211..fe652ffd34c2 100644
|
||||
--- a/arch/arm64/kernel/vdso/gettimeofday.S
|
||||
+++ b/arch/arm64/kernel/vdso/gettimeofday.S
|
||||
@@ -103,6 +103,8 @@ ENTRY(__kernel_clock_gettime)
|
||||
bl __do_get_tspec
|
||||
seqcnt_check w9, 1b
|
||||
|
||||
+ mov x30, x2
|
||||
+
|
||||
cmp w0, #CLOCK_MONOTONIC
|
||||
b.ne 6f
|
||||
|
||||
@@ -118,6 +120,9 @@ ENTRY(__kernel_clock_gettime)
|
||||
ccmp w0, #CLOCK_MONOTONIC_COARSE, #0x4, ne
|
||||
b.ne 8f
|
||||
|
||||
+ /* xtime_coarse_nsec is already right-shifted */
|
||||
+ mov x12, #0
|
||||
+
|
||||
/* Get coarse timespec. */
|
||||
adr vdso_data, _vdso_data
|
||||
3: seqcnt_acquire
|
||||
@@ -156,7 +161,7 @@ ENTRY(__kernel_clock_gettime)
|
||||
lsr x11, x11, x12
|
||||
stp x10, x11, [x1, #TSPEC_TV_SEC]
|
||||
mov x0, xzr
|
||||
- ret x2
|
||||
+ ret
|
||||
7:
|
||||
mov x30, x2
|
||||
8: /* Syscall fallback. */
|
||||
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
|
||||
index 80a369eab637..ba7477efad5c 100644
|
||||
--- a/arch/arm64/mm/mmu.c
|
||||
+++ b/arch/arm64/mm/mmu.c
|
||||
@@ -203,10 +203,18 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
|
||||
do {
|
||||
next = pmd_addr_end(addr, end);
|
||||
/* try section mapping first */
|
||||
- if (((addr | next | phys) & ~SECTION_MASK) == 0)
|
||||
+ if (((addr | next | phys) & ~SECTION_MASK) == 0) {
|
||||
+ pmd_t old_pmd =*pmd;
|
||||
set_pmd(pmd, __pmd(phys | prot_sect_kernel));
|
||||
- else
|
||||
+ /*
|
||||
+ * Check for previous table entries created during
|
||||
+ * boot (__create_page_tables) and flush them.
|
||||
+ */
|
||||
+ if (!pmd_none(old_pmd))
|
||||
+ flush_tlb_all();
|
||||
+ } else {
|
||||
alloc_init_pte(pmd, addr, next, __phys_to_pfn(phys));
|
||||
+ }
|
||||
phys += next - addr;
|
||||
} while (pmd++, addr = next, addr != end);
|
||||
}
|
||||
diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c
|
||||
index 94e20dd2729f..2a245b55bb71 100644
|
||||
--- a/arch/s390/crypto/aes_s390.c
|
||||
+++ b/arch/s390/crypto/aes_s390.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
+#include <linux/spinlock.h>
|
||||
#include "crypt_s390.h"
|
||||
|
||||
#define AES_KEYLEN_128 1
|
||||
@@ -32,6 +33,7 @@
|
||||
#define AES_KEYLEN_256 4
|
||||
|
||||
static u8 *ctrblk;
|
||||
+static DEFINE_SPINLOCK(ctrblk_lock);
|
||||
static char keylen_flag;
|
||||
|
||||
struct s390_aes_ctx {
|
||||
@@ -756,43 +758,67 @@ static int ctr_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
||||
return aes_set_key(tfm, in_key, key_len);
|
||||
}
|
||||
|
||||
+static unsigned int __ctrblk_init(u8 *ctrptr, unsigned int nbytes)
|
||||
+{
|
||||
+ unsigned int i, n;
|
||||
+
|
||||
+ /* only use complete blocks, max. PAGE_SIZE */
|
||||
+ n = (nbytes > PAGE_SIZE) ? PAGE_SIZE : nbytes & ~(AES_BLOCK_SIZE - 1);
|
||||
+ for (i = AES_BLOCK_SIZE; i < n; i += AES_BLOCK_SIZE) {
|
||||
+ memcpy(ctrptr + i, ctrptr + i - AES_BLOCK_SIZE,
|
||||
+ AES_BLOCK_SIZE);
|
||||
+ crypto_inc(ctrptr + i, AES_BLOCK_SIZE);
|
||||
+ }
|
||||
+ return n;
|
||||
+}
|
||||
+
|
||||
static int ctr_aes_crypt(struct blkcipher_desc *desc, long func,
|
||||
struct s390_aes_ctx *sctx, struct blkcipher_walk *walk)
|
||||
{
|
||||
int ret = blkcipher_walk_virt_block(desc, walk, AES_BLOCK_SIZE);
|
||||
- unsigned int i, n, nbytes;
|
||||
- u8 buf[AES_BLOCK_SIZE];
|
||||
- u8 *out, *in;
|
||||
+ unsigned int n, nbytes;
|
||||
+ u8 buf[AES_BLOCK_SIZE], ctrbuf[AES_BLOCK_SIZE];
|
||||
+ u8 *out, *in, *ctrptr = ctrbuf;
|
||||
|
||||
if (!walk->nbytes)
|
||||
return ret;
|
||||
|
||||
- memcpy(ctrblk, walk->iv, AES_BLOCK_SIZE);
|
||||
+ if (spin_trylock(&ctrblk_lock))
|
||||
+ ctrptr = ctrblk;
|
||||
+
|
||||
+ memcpy(ctrptr, walk->iv, AES_BLOCK_SIZE);
|
||||
while ((nbytes = walk->nbytes) >= AES_BLOCK_SIZE) {
|
||||
out = walk->dst.virt.addr;
|
||||
in = walk->src.virt.addr;
|
||||
while (nbytes >= AES_BLOCK_SIZE) {
|
||||
- /* only use complete blocks, max. PAGE_SIZE */
|
||||
- n = (nbytes > PAGE_SIZE) ? PAGE_SIZE :
|
||||
- nbytes & ~(AES_BLOCK_SIZE - 1);
|
||||
- for (i = AES_BLOCK_SIZE; i < n; i += AES_BLOCK_SIZE) {
|
||||
- memcpy(ctrblk + i, ctrblk + i - AES_BLOCK_SIZE,
|
||||
- AES_BLOCK_SIZE);
|
||||
- crypto_inc(ctrblk + i, AES_BLOCK_SIZE);
|
||||
- }
|
||||
- ret = crypt_s390_kmctr(func, sctx->key, out, in, n, ctrblk);
|
||||
- if (ret < 0 || ret != n)
|
||||
+ if (ctrptr == ctrblk)
|
||||
+ n = __ctrblk_init(ctrptr, nbytes);
|
||||
+ else
|
||||
+ n = AES_BLOCK_SIZE;
|
||||
+ ret = crypt_s390_kmctr(func, sctx->key, out, in,
|
||||
+ n, ctrptr);
|
||||
+ if (ret < 0 || ret != n) {
|
||||
+ if (ctrptr == ctrblk)
|
||||
+ spin_unlock(&ctrblk_lock);
|
||||
return -EIO;
|
||||
+ }
|
||||
if (n > AES_BLOCK_SIZE)
|
||||
- memcpy(ctrblk, ctrblk + n - AES_BLOCK_SIZE,
|
||||
+ memcpy(ctrptr, ctrptr + n - AES_BLOCK_SIZE,
|
||||
AES_BLOCK_SIZE);
|
||||
- crypto_inc(ctrblk, AES_BLOCK_SIZE);
|
||||
+ crypto_inc(ctrptr, AES_BLOCK_SIZE);
|
||||
out += n;
|
||||
in += n;
|
||||
nbytes -= n;
|
||||
}
|
||||
ret = blkcipher_walk_done(desc, walk, nbytes);
|
||||
}
|
||||
+ if (ctrptr == ctrblk) {
|
||||
+ if (nbytes)
|
||||
+ memcpy(ctrbuf, ctrptr, AES_BLOCK_SIZE);
|
||||
+ else
|
||||
+ memcpy(walk->iv, ctrptr, AES_BLOCK_SIZE);
|
||||
+ spin_unlock(&ctrblk_lock);
|
||||
+ }
|
||||
/*
|
||||
* final block may be < AES_BLOCK_SIZE, copy only nbytes
|
||||
*/
|
||||
@@ -800,14 +826,15 @@ static int ctr_aes_crypt(struct blkcipher_desc *desc, long func,
|
||||
out = walk->dst.virt.addr;
|
||||
in = walk->src.virt.addr;
|
||||
ret = crypt_s390_kmctr(func, sctx->key, buf, in,
|
||||
- AES_BLOCK_SIZE, ctrblk);
|
||||
+ AES_BLOCK_SIZE, ctrbuf);
|
||||
if (ret < 0 || ret != AES_BLOCK_SIZE)
|
||||
return -EIO;
|
||||
memcpy(out, buf, nbytes);
|
||||
- crypto_inc(ctrblk, AES_BLOCK_SIZE);
|
||||
+ crypto_inc(ctrbuf, AES_BLOCK_SIZE);
|
||||
ret = blkcipher_walk_done(desc, walk, 0);
|
||||
+ memcpy(walk->iv, ctrbuf, AES_BLOCK_SIZE);
|
||||
}
|
||||
- memcpy(walk->iv, ctrblk, AES_BLOCK_SIZE);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
diff --git a/arch/s390/crypto/des_s390.c b/arch/s390/crypto/des_s390.c
|
||||
index bcca01c9989d..2d96e68febb2 100644
|
||||
--- a/arch/s390/crypto/des_s390.c
|
||||
+++ b/arch/s390/crypto/des_s390.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#define DES3_KEY_SIZE (3 * DES_KEY_SIZE)
|
||||
|
||||
static u8 *ctrblk;
|
||||
+static DEFINE_SPINLOCK(ctrblk_lock);
|
||||
|
||||
struct s390_des_ctx {
|
||||
u8 iv[DES_BLOCK_SIZE];
|
||||
@@ -105,29 +106,35 @@ static int ecb_desall_crypt(struct blkcipher_desc *desc, long func,
|
||||
}
|
||||
|
||||
static int cbc_desall_crypt(struct blkcipher_desc *desc, long func,
|
||||
- u8 *iv, struct blkcipher_walk *walk)
|
||||
+ struct blkcipher_walk *walk)
|
||||
{
|
||||
+ struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
|
||||
int ret = blkcipher_walk_virt(desc, walk);
|
||||
unsigned int nbytes = walk->nbytes;
|
||||
+ struct {
|
||||
+ u8 iv[DES_BLOCK_SIZE];
|
||||
+ u8 key[DES3_KEY_SIZE];
|
||||
+ } param;
|
||||
|
||||
if (!nbytes)
|
||||
goto out;
|
||||
|
||||
- memcpy(iv, walk->iv, DES_BLOCK_SIZE);
|
||||
+ memcpy(param.iv, walk->iv, DES_BLOCK_SIZE);
|
||||
+ memcpy(param.key, ctx->key, DES3_KEY_SIZE);
|
||||
do {
|
||||
/* only use complete blocks */
|
||||
unsigned int n = nbytes & ~(DES_BLOCK_SIZE - 1);
|
||||
u8 *out = walk->dst.virt.addr;
|
||||
u8 *in = walk->src.virt.addr;
|
||||
|
||||
- ret = crypt_s390_kmc(func, iv, out, in, n);
|
||||
+ ret = crypt_s390_kmc(func, ¶m, out, in, n);
|
||||
if (ret < 0 || ret != n)
|
||||
return -EIO;
|
||||
|
||||
nbytes &= DES_BLOCK_SIZE - 1;
|
||||
ret = blkcipher_walk_done(desc, walk, nbytes);
|
||||
} while ((nbytes = walk->nbytes));
|
||||
- memcpy(walk->iv, iv, DES_BLOCK_SIZE);
|
||||
+ memcpy(walk->iv, param.iv, DES_BLOCK_SIZE);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
@@ -179,22 +186,20 @@ static int cbc_des_encrypt(struct blkcipher_desc *desc,
|
||||
struct scatterlist *dst, struct scatterlist *src,
|
||||
unsigned int nbytes)
|
||||
{
|
||||
- struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
|
||||
struct blkcipher_walk walk;
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
- return cbc_desall_crypt(desc, KMC_DEA_ENCRYPT, ctx->iv, &walk);
|
||||
+ return cbc_desall_crypt(desc, KMC_DEA_ENCRYPT, &walk);
|
||||
}
|
||||
|
||||
static int cbc_des_decrypt(struct blkcipher_desc *desc,
|
||||
struct scatterlist *dst, struct scatterlist *src,
|
||||
unsigned int nbytes)
|
||||
{
|
||||
- struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
|
||||
struct blkcipher_walk walk;
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
- return cbc_desall_crypt(desc, KMC_DEA_DECRYPT, ctx->iv, &walk);
|
||||
+ return cbc_desall_crypt(desc, KMC_DEA_DECRYPT, &walk);
|
||||
}
|
||||
|
||||
static struct crypto_alg cbc_des_alg = {
|
||||
@@ -327,22 +332,20 @@ static int cbc_des3_encrypt(struct blkcipher_desc *desc,
|
||||
struct scatterlist *dst, struct scatterlist *src,
|
||||
unsigned int nbytes)
|
||||
{
|
||||
- struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
|
||||
struct blkcipher_walk walk;
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
- return cbc_desall_crypt(desc, KMC_TDEA_192_ENCRYPT, ctx->iv, &walk);
|
||||
+ return cbc_desall_crypt(desc, KMC_TDEA_192_ENCRYPT, &walk);
|
||||
}
|
||||
|
||||
static int cbc_des3_decrypt(struct blkcipher_desc *desc,
|
||||
struct scatterlist *dst, struct scatterlist *src,
|
||||
unsigned int nbytes)
|
||||
{
|
||||
- struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
|
||||
struct blkcipher_walk walk;
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
- return cbc_desall_crypt(desc, KMC_TDEA_192_DECRYPT, ctx->iv, &walk);
|
||||
+ return cbc_desall_crypt(desc, KMC_TDEA_192_DECRYPT, &walk);
|
||||
}
|
||||
|
||||
static struct crypto_alg cbc_des3_alg = {
|
||||
@@ -366,54 +369,80 @@ static struct crypto_alg cbc_des3_alg = {
|
||||
}
|
||||
};
|
||||
|
||||
+static unsigned int __ctrblk_init(u8 *ctrptr, unsigned int nbytes)
|
||||
+{
|
||||
+ unsigned int i, n;
|
||||
+
|
||||
+ /* align to block size, max. PAGE_SIZE */
|
||||
+ n = (nbytes > PAGE_SIZE) ? PAGE_SIZE : nbytes & ~(DES_BLOCK_SIZE - 1);
|
||||
+ for (i = DES_BLOCK_SIZE; i < n; i += DES_BLOCK_SIZE) {
|
||||
+ memcpy(ctrptr + i, ctrptr + i - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
|
||||
+ crypto_inc(ctrptr + i, DES_BLOCK_SIZE);
|
||||
+ }
|
||||
+ return n;
|
||||
+}
|
||||
+
|
||||
static int ctr_desall_crypt(struct blkcipher_desc *desc, long func,
|
||||
- struct s390_des_ctx *ctx, struct blkcipher_walk *walk)
|
||||
+ struct s390_des_ctx *ctx,
|
||||
+ struct blkcipher_walk *walk)
|
||||
{
|
||||
int ret = blkcipher_walk_virt_block(desc, walk, DES_BLOCK_SIZE);
|
||||
- unsigned int i, n, nbytes;
|
||||
- u8 buf[DES_BLOCK_SIZE];
|
||||
- u8 *out, *in;
|
||||
+ unsigned int n, nbytes;
|
||||
+ u8 buf[DES_BLOCK_SIZE], ctrbuf[DES_BLOCK_SIZE];
|
||||
+ u8 *out, *in, *ctrptr = ctrbuf;
|
||||
+
|
||||
+ if (!walk->nbytes)
|
||||
+ return ret;
|
||||
|
||||
- memcpy(ctrblk, walk->iv, DES_BLOCK_SIZE);
|
||||
+ if (spin_trylock(&ctrblk_lock))
|
||||
+ ctrptr = ctrblk;
|
||||
+
|
||||
+ memcpy(ctrptr, walk->iv, DES_BLOCK_SIZE);
|
||||
while ((nbytes = walk->nbytes) >= DES_BLOCK_SIZE) {
|
||||
out = walk->dst.virt.addr;
|
||||
in = walk->src.virt.addr;
|
||||
while (nbytes >= DES_BLOCK_SIZE) {
|
||||
- /* align to block size, max. PAGE_SIZE */
|
||||
- n = (nbytes > PAGE_SIZE) ? PAGE_SIZE :
|
||||
- nbytes & ~(DES_BLOCK_SIZE - 1);
|
||||
- for (i = DES_BLOCK_SIZE; i < n; i += DES_BLOCK_SIZE) {
|
||||
- memcpy(ctrblk + i, ctrblk + i - DES_BLOCK_SIZE,
|
||||
- DES_BLOCK_SIZE);
|
||||
- crypto_inc(ctrblk + i, DES_BLOCK_SIZE);
|
||||
- }
|
||||
- ret = crypt_s390_kmctr(func, ctx->key, out, in, n, ctrblk);
|
||||
- if (ret < 0 || ret != n)
|
||||
+ if (ctrptr == ctrblk)
|
||||
+ n = __ctrblk_init(ctrptr, nbytes);
|
||||
+ else
|
||||
+ n = DES_BLOCK_SIZE;
|
||||
+ ret = crypt_s390_kmctr(func, ctx->key, out, in,
|
||||
+ n, ctrptr);
|
||||
+ if (ret < 0 || ret != n) {
|
||||
+ if (ctrptr == ctrblk)
|
||||
+ spin_unlock(&ctrblk_lock);
|
||||
return -EIO;
|
||||
+ }
|
||||
if (n > DES_BLOCK_SIZE)
|
||||
- memcpy(ctrblk, ctrblk + n - DES_BLOCK_SIZE,
|
||||
+ memcpy(ctrptr, ctrptr + n - DES_BLOCK_SIZE,
|
||||
DES_BLOCK_SIZE);
|
||||
- crypto_inc(ctrblk, DES_BLOCK_SIZE);
|
||||
+ crypto_inc(ctrptr, DES_BLOCK_SIZE);
|
||||
out += n;
|
||||
in += n;
|
||||
nbytes -= n;
|
||||
}
|
||||
ret = blkcipher_walk_done(desc, walk, nbytes);
|
||||
}
|
||||
-
|
||||
+ if (ctrptr == ctrblk) {
|
||||
+ if (nbytes)
|
||||
+ memcpy(ctrbuf, ctrptr, DES_BLOCK_SIZE);
|
||||
+ else
|
||||
+ memcpy(walk->iv, ctrptr, DES_BLOCK_SIZE);
|
||||
+ spin_unlock(&ctrblk_lock);
|
||||
+ }
|
||||
/* final block may be < DES_BLOCK_SIZE, copy only nbytes */
|
||||
if (nbytes) {
|
||||
out = walk->dst.virt.addr;
|
||||
in = walk->src.virt.addr;
|
||||
ret = crypt_s390_kmctr(func, ctx->key, buf, in,
|
||||
- DES_BLOCK_SIZE, ctrblk);
|
||||
+ DES_BLOCK_SIZE, ctrbuf);
|
||||
if (ret < 0 || ret != DES_BLOCK_SIZE)
|
||||
return -EIO;
|
||||
memcpy(out, buf, nbytes);
|
||||
- crypto_inc(ctrblk, DES_BLOCK_SIZE);
|
||||
+ crypto_inc(ctrbuf, DES_BLOCK_SIZE);
|
||||
ret = blkcipher_walk_done(desc, walk, 0);
|
||||
+ memcpy(walk->iv, ctrbuf, DES_BLOCK_SIZE);
|
||||
}
|
||||
- memcpy(walk->iv, ctrblk, DES_BLOCK_SIZE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
|
||||
index 32d37d9a7787..f187806dfc18 100644
|
||||
--- a/arch/x86/kernel/cpu/intel.c
|
||||
+++ b/arch/x86/kernel/cpu/intel.c
|
||||
@@ -628,7 +628,7 @@ static void __cpuinit intel_tlb_flushall_shift_set(struct cpuinfo_x86 *c)
|
||||
tlb_flushall_shift = 5;
|
||||
break;
|
||||
case 0x63a: /* Ivybridge */
|
||||
- tlb_flushall_shift = 1;
|
||||
+ tlb_flushall_shift = 2;
|
||||
break;
|
||||
default:
|
||||
tlb_flushall_shift = 6;
|
||||
diff --git a/drivers/infiniband/hw/qib/qib_user_sdma.c b/drivers/infiniband/hw/qib/qib_user_sdma.c
|
||||
index 82442085cbe6..573b4601d5b9 100644
|
||||
--- a/drivers/infiniband/hw/qib/qib_user_sdma.c
|
||||
+++ b/drivers/infiniband/hw/qib/qib_user_sdma.c
|
||||
@@ -284,8 +284,7 @@ static int qib_user_sdma_pin_pages(const struct qib_devdata *dd,
|
||||
int j;
|
||||
int ret;
|
||||
|
||||
- ret = get_user_pages(current, current->mm, addr,
|
||||
- npages, 0, 1, pages, NULL);
|
||||
+ ret = get_user_pages_fast(addr, npages, 0, pages);
|
||||
|
||||
if (ret != npages) {
|
||||
int i;
|
||||
@@ -830,10 +829,7 @@ int qib_user_sdma_writev(struct qib_ctxtdata *rcd,
|
||||
while (dim) {
|
||||
const int mxp = 8;
|
||||
|
||||
- down_write(¤t->mm->mmap_sem);
|
||||
ret = qib_user_sdma_queue_pkts(dd, pq, &list, iov, dim, mxp);
|
||||
- up_write(¤t->mm->mmap_sem);
|
||||
-
|
||||
if (ret <= 0)
|
||||
goto done_unlock;
|
||||
else {
|
||||
diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
|
||||
index bb328a366122..a51ee009ed83 100644
|
||||
--- a/drivers/irqchip/irq-armada-370-xp.c
|
||||
+++ b/drivers/irqchip/irq-armada-370-xp.c
|
||||
@@ -229,7 +229,7 @@ armada_370_xp_handle_irq(struct pt_regs *regs)
|
||||
ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS)
|
||||
& IPI_DOORBELL_MASK;
|
||||
|
||||
- writel(~IPI_DOORBELL_MASK, per_cpu_int_base +
|
||||
+ writel(~ipimask, per_cpu_int_base +
|
||||
ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS);
|
||||
|
||||
/* Handle all pending doorbells */
|
||||
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c
|
||||
index 46f05ad529f9..2e93ba5598c4 100644
|
||||
--- a/drivers/media/usb/dvb-usb-v2/af9035.c
|
||||
+++ b/drivers/media/usb/dvb-usb-v2/af9035.c
|
||||
@@ -1517,6 +1517,8 @@ static const struct usb_device_id af9035_id_table[] = {
|
||||
&af9035_props, "TerraTec Cinergy T Stick Dual RC (rev. 2)", NULL) },
|
||||
{ DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a05,
|
||||
&af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) },
|
||||
+ { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xf900,
|
||||
+ &af9035_props, "Hauppauge WinTV-MiniStick 2", NULL) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, af9035_id_table);
|
||||
diff --git a/drivers/media/usb/dvb-usb-v2/mxl111sf-tuner.h b/drivers/media/usb/dvb-usb-v2/mxl111sf-tuner.h
|
||||
index 90f583e5d6a6..a8f65d88c9e7 100644
|
||||
--- a/drivers/media/usb/dvb-usb-v2/mxl111sf-tuner.h
|
||||
+++ b/drivers/media/usb/dvb-usb-v2/mxl111sf-tuner.h
|
||||
@@ -68,7 +68,7 @@ struct dvb_frontend *mxl111sf_tuner_attach(struct dvb_frontend *fe,
|
||||
#else
|
||||
static inline
|
||||
struct dvb_frontend *mxl111sf_tuner_attach(struct dvb_frontend *fe,
|
||||
- struct mxl111sf_state *mxl_state
|
||||
+ struct mxl111sf_state *mxl_state,
|
||||
struct mxl111sf_tuner_config *cfg)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
|
||||
index 5327f35d9b5c..bb7ee9cb00b1 100644
|
||||
--- a/drivers/pinctrl/core.c
|
||||
+++ b/drivers/pinctrl/core.c
|
||||
@@ -807,7 +807,9 @@ static struct pinctrl *create_pinctrl(struct device *dev)
|
||||
kref_init(&p->users);
|
||||
|
||||
/* Add the pinctrl handle to the global list */
|
||||
+ mutex_lock(&pinctrl_list_mutex);
|
||||
list_add_tail(&p->node, &pinctrl_list);
|
||||
+ mutex_unlock(&pinctrl_list_mutex);
|
||||
|
||||
return p;
|
||||
}
|
||||
diff --git a/drivers/pinctrl/vt8500/pinctrl-wmt.c b/drivers/pinctrl/vt8500/pinctrl-wmt.c
|
||||
index 70d986e04afb..8b54b5da00c0 100644
|
||||
--- a/drivers/pinctrl/vt8500/pinctrl-wmt.c
|
||||
+++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c
|
||||
@@ -276,7 +276,20 @@ static int wmt_pctl_dt_node_to_map_pull(struct wmt_pinctrl_data *data,
|
||||
if (!configs)
|
||||
return -ENOMEM;
|
||||
|
||||
- configs[0] = pull;
|
||||
+ switch (pull) {
|
||||
+ case 0:
|
||||
+ configs[0] = PIN_CONFIG_BIAS_DISABLE;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ configs[0] = PIN_CONFIG_BIAS_PULL_DOWN;
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ configs[0] = PIN_CONFIG_BIAS_PULL_UP;
|
||||
+ break;
|
||||
+ default:
|
||||
+ configs[0] = PIN_CONFIG_BIAS_DISABLE;
|
||||
+ dev_err(data->dev, "invalid pull state %d - disabling\n", pull);
|
||||
+ }
|
||||
|
||||
map->type = PIN_MAP_TYPE_CONFIGS_PIN;
|
||||
map->data.configs.group_or_pin = data->groups[group];
|
||||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
|
||||
index 0bcee78cde16..25e6a8e1014e 100644
|
||||
--- a/fs/btrfs/inode.c
|
||||
+++ b/fs/btrfs/inode.c
|
||||
@@ -2655,7 +2655,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
|
||||
EXTENT_DEFRAG, 1, cached_state);
|
||||
if (ret) {
|
||||
u64 last_snapshot = btrfs_root_last_snapshot(&root->root_item);
|
||||
- if (last_snapshot >= BTRFS_I(inode)->generation)
|
||||
+ if (0 && last_snapshot >= BTRFS_I(inode)->generation)
|
||||
/* the inode is shared */
|
||||
new = record_old_file_extents(inode, ordered_extent);
|
||||
|
||||
diff --git a/fs/buffer.c b/fs/buffer.c
|
||||
index d2a4d1bb2d57..75964d734444 100644
|
||||
--- a/fs/buffer.c
|
||||
+++ b/fs/buffer.c
|
||||
@@ -620,14 +620,16 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode);
|
||||
static void __set_page_dirty(struct page *page,
|
||||
struct address_space *mapping, int warn)
|
||||
{
|
||||
- spin_lock_irq(&mapping->tree_lock);
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ spin_lock_irqsave(&mapping->tree_lock, flags);
|
||||
if (page->mapping) { /* Race with truncate? */
|
||||
WARN_ON_ONCE(warn && !PageUptodate(page));
|
||||
account_page_dirtied(page, mapping);
|
||||
radix_tree_tag_set(&mapping->page_tree,
|
||||
page_index(page), PAGECACHE_TAG_DIRTY);
|
||||
}
|
||||
- spin_unlock_irq(&mapping->tree_lock);
|
||||
+ spin_unlock_irqrestore(&mapping->tree_lock, flags);
|
||||
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
||||
}
|
||||
|
||||
diff --git a/lib/Makefile b/lib/Makefile
|
||||
index c55a037a354e..9efe480b975e 100644
|
||||
--- a/lib/Makefile
|
||||
+++ b/lib/Makefile
|
||||
@@ -45,6 +45,7 @@ lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
|
||||
lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
|
||||
lib-$(CONFIG_PERCPU_RWSEM) += percpu-rwsem.o
|
||||
|
||||
+GCOV_PROFILE_hweight.o := n
|
||||
CFLAGS_hweight.o = $(subst $(quote),,$(CONFIG_ARCH_HWEIGHT_CFLAGS))
|
||||
obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o
|
||||
|
||||
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
|
||||
index 40ad2c6e0ca9..aa3b9a63394b 100644
|
||||
--- a/mm/hugetlb.c
|
||||
+++ b/mm/hugetlb.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/rmap.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/swapops.h>
|
||||
+#include <linux/page-isolation.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
@@ -517,9 +518,15 @@ static struct page *dequeue_huge_page_node(struct hstate *h, int nid)
|
||||
{
|
||||
struct page *page;
|
||||
|
||||
- if (list_empty(&h->hugepage_freelists[nid]))
|
||||
+ list_for_each_entry(page, &h->hugepage_freelists[nid], lru)
|
||||
+ if (!is_migrate_isolate_page(page))
|
||||
+ break;
|
||||
+ /*
|
||||
+ * if 'non-isolated free hugepage' not found on the list,
|
||||
+ * the allocation fails.
|
||||
+ */
|
||||
+ if (&h->hugepage_freelists[nid] == &page->lru)
|
||||
return NULL;
|
||||
- page = list_entry(h->hugepage_freelists[nid].next, struct page, lru);
|
||||
list_move(&page->lru, &h->hugepage_activelist);
|
||||
set_page_refcounted(page);
|
||||
h->free_huge_pages--;
|
||||
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
|
||||
index 3b4120e38d48..f2a591d87d00 100644
|
||||
--- a/mm/memory-failure.c
|
||||
+++ b/mm/memory-failure.c
|
||||
@@ -1421,7 +1421,8 @@ static int __get_any_page(struct page *p, unsigned long pfn, int flags)
|
||||
|
||||
/*
|
||||
* Isolate the page, so that it doesn't get reallocated if it
|
||||
- * was free.
|
||||
+ * was free. This flag should be kept set until the source page
|
||||
+ * is freed and PG_hwpoison on it is set.
|
||||
*/
|
||||
set_migratetype_isolate(p, true);
|
||||
/*
|
||||
@@ -1444,7 +1445,6 @@ static int __get_any_page(struct page *p, unsigned long pfn, int flags)
|
||||
/* Not a free page */
|
||||
ret = 1;
|
||||
}
|
||||
- unset_migratetype_isolate(p, MIGRATE_MOVABLE);
|
||||
unlock_memory_hotplug();
|
||||
return ret;
|
||||
}
|
||||
@@ -1511,7 +1511,6 @@ static int soft_offline_huge_page(struct page *page, int flags)
|
||||
atomic_long_inc(&num_poisoned_pages);
|
||||
}
|
||||
}
|
||||
- /* keep elevated page count for bad page */
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1576,7 +1575,7 @@ int soft_offline_page(struct page *page, int flags)
|
||||
atomic_long_inc(&num_poisoned_pages);
|
||||
}
|
||||
}
|
||||
- /* keep elevated page count for bad page */
|
||||
+ unset_migratetype_isolate(page, MIGRATE_MOVABLE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1642,7 +1641,22 @@ static int __soft_offline_page(struct page *page, int flags)
|
||||
if (ret > 0)
|
||||
ret = -EIO;
|
||||
} else {
|
||||
+ /*
|
||||
+ * After page migration succeeds, the source page can
|
||||
+ * be trapped in pagevec and actual freeing is delayed.
|
||||
+ * Freeing code works differently based on PG_hwpoison,
|
||||
+ * so there's a race. We need to make sure that the
|
||||
+ * source page should be freed back to buddy before
|
||||
+ * setting PG_hwpoison.
|
||||
+ */
|
||||
+ if (!is_free_buddy_page(page))
|
||||
+ lru_add_drain_all();
|
||||
+ if (!is_free_buddy_page(page))
|
||||
+ drain_all_pages();
|
||||
SetPageHWPoison(page);
|
||||
+ if (!is_free_buddy_page(page))
|
||||
+ pr_info("soft offline: %#lx: page leaked\n",
|
||||
+ pfn);
|
||||
atomic_long_inc(&num_poisoned_pages);
|
||||
}
|
||||
} else {
|
||||
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
|
||||
index 5a06d4cb9a3d..73cbc5dc150b 100644
|
||||
--- a/mm/page-writeback.c
|
||||
+++ b/mm/page-writeback.c
|
||||
@@ -2026,11 +2026,12 @@ int __set_page_dirty_nobuffers(struct page *page)
|
||||
if (!TestSetPageDirty(page)) {
|
||||
struct address_space *mapping = page_mapping(page);
|
||||
struct address_space *mapping2;
|
||||
+ unsigned long flags;
|
||||
|
||||
if (!mapping)
|
||||
return 1;
|
||||
|
||||
- spin_lock_irq(&mapping->tree_lock);
|
||||
+ spin_lock_irqsave(&mapping->tree_lock, flags);
|
||||
mapping2 = page_mapping(page);
|
||||
if (mapping2) { /* Race with truncate? */
|
||||
BUG_ON(mapping2 != mapping);
|
||||
@@ -2039,7 +2040,7 @@ int __set_page_dirty_nobuffers(struct page *page)
|
||||
radix_tree_tag_set(&mapping->page_tree,
|
||||
page_index(page), PAGECACHE_TAG_DIRTY);
|
||||
}
|
||||
- spin_unlock_irq(&mapping->tree_lock);
|
||||
+ spin_unlock_irqrestore(&mapping->tree_lock, flags);
|
||||
if (mapping->host) {
|
||||
/* !PageAnon && !swapper_space */
|
||||
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
||||
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
|
||||
index b4feecc3fe01..18caa16de27b 100644
|
||||
--- a/security/selinux/ss/services.c
|
||||
+++ b/security/selinux/ss/services.c
|
||||
@@ -1231,6 +1231,10 @@ static int security_context_to_sid_core(const char *scontext, u32 scontext_len,
|
||||
struct context context;
|
||||
int rc = 0;
|
||||
|
||||
+ /* An empty security context is never valid. */
|
||||
+ if (!scontext_len)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (!ss_initialized) {
|
||||
int i;
|
||||
|
||||
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
|
||||
index a7b07f72c9dd..5a6527668c07 100644
|
||||
--- a/sound/pci/hda/patch_analog.c
|
||||
+++ b/sound/pci/hda/patch_analog.c
|
||||
@@ -1680,6 +1680,7 @@ static int ad1983_parse_auto_config(struct hda_codec *codec)
|
||||
return err;
|
||||
spec = codec->spec;
|
||||
|
||||
+ spec->gen.mixer_nid = 0x0e;
|
||||
spec->gen.beep_nid = 0x10;
|
||||
set_beep_amp(spec, 0x10, 0, HDA_OUTPUT);
|
||||
err = ad198x_parse_auto_config(codec);
|
||||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
||||
index 4b06e0a64392..87a03aca1b2e 100644
|
||||
--- a/sound/pci/hda/patch_realtek.c
|
||||
+++ b/sound/pci/hda/patch_realtek.c
|
||||
@@ -1765,6 +1765,7 @@ enum {
|
||||
ALC889_FIXUP_IMAC91_VREF,
|
||||
ALC889_FIXUP_MBA11_VREF,
|
||||
ALC889_FIXUP_MBA21_VREF,
|
||||
+ ALC889_FIXUP_MP11_VREF,
|
||||
ALC882_FIXUP_INV_DMIC,
|
||||
ALC882_FIXUP_NO_PRIMARY_HP,
|
||||
ALC887_FIXUP_ASUS_BASS,
|
||||
@@ -2119,6 +2120,12 @@ static const struct hda_fixup alc882_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC889_FIXUP_MBP_VREF,
|
||||
},
|
||||
+ [ALC889_FIXUP_MP11_VREF] = {
|
||||
+ .type = HDA_FIXUP_FUNC,
|
||||
+ .v.func = alc889_fixup_mba11_vref,
|
||||
+ .chained = true,
|
||||
+ .chain_id = ALC885_FIXUP_MACPRO_GPIO,
|
||||
+ },
|
||||
[ALC882_FIXUP_INV_DMIC] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_inv_dmic_0x12,
|
||||
@@ -2176,7 +2183,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
|
||||
- SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_FIXUP_MACPRO_GPIO),
|
||||
+ SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
|
||||
SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
|
||||
SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
|
||||
diff --git a/sound/usb/Kconfig b/sound/usb/Kconfig
|
||||
index 225dfd737265..ba2664200d14 100644
|
||||
--- a/sound/usb/Kconfig
|
||||
+++ b/sound/usb/Kconfig
|
||||
@@ -14,6 +14,7 @@ config SND_USB_AUDIO
|
||||
select SND_HWDEP
|
||||
select SND_RAWMIDI
|
||||
select SND_PCM
|
||||
+ select BITREVERSE
|
||||
help
|
||||
Say Y here to include support for USB audio and USB MIDI
|
||||
devices.
|
2000
projects/Cuboxi/patches/linux/linux-000-patch-3.10.31-32.patch
Normal file
2000
projects/Cuboxi/patches/linux/linux-000-patch-3.10.31-32.patch
Normal file
File diff suppressed because it is too large
Load Diff
3945
projects/Cuboxi/patches/linux/linux-000-patch-3.10.32-33.patch
Normal file
3945
projects/Cuboxi/patches/linux/linux-000-patch-3.10.32-33.patch
Normal file
File diff suppressed because it is too large
Load Diff
2789
projects/Cuboxi/patches/linux/linux-000-patch-3.10.33-34.patch
Normal file
2789
projects/Cuboxi/patches/linux/linux-000-patch-3.10.33-34.patch
Normal file
File diff suppressed because it is too large
Load Diff
996
projects/Cuboxi/patches/linux/linux-000-patch-3.10.34-35.patch
Normal file
996
projects/Cuboxi/patches/linux/linux-000-patch-3.10.34-35.patch
Normal file
@ -0,0 +1,996 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 571a1bf14868..06b31fce1ff5 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 34
|
||||
+SUBLEVEL = 35
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h
|
||||
index 12f71a190422..f94784f0e3a6 100644
|
||||
--- a/arch/arm/include/asm/outercache.h
|
||||
+++ b/arch/arm/include/asm/outercache.h
|
||||
@@ -37,10 +37,10 @@ struct outer_cache_fns {
|
||||
void (*resume)(void);
|
||||
};
|
||||
|
||||
-#ifdef CONFIG_OUTER_CACHE
|
||||
-
|
||||
extern struct outer_cache_fns outer_cache;
|
||||
|
||||
+#ifdef CONFIG_OUTER_CACHE
|
||||
+
|
||||
static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
|
||||
{
|
||||
if (outer_cache.inv_range)
|
||||
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
|
||||
index 5ed19e88874b..35d1029d7c9d 100644
|
||||
--- a/arch/arm/mach-highbank/highbank.c
|
||||
+++ b/arch/arm/mach-highbank/highbank.c
|
||||
@@ -65,14 +65,12 @@ void highbank_set_cpu_jump(int cpu, void *jump_addr)
|
||||
HB_JUMP_TABLE_PHYS(cpu) + 15);
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_CACHE_L2X0
|
||||
static void highbank_l2x0_disable(void)
|
||||
{
|
||||
outer_flush_all();
|
||||
/* Disable PL310 L2 Cache controller */
|
||||
highbank_smc1(0x102, 0x0);
|
||||
}
|
||||
-#endif
|
||||
|
||||
static void __init highbank_init_irq(void)
|
||||
{
|
||||
@@ -81,12 +79,13 @@ static void __init highbank_init_irq(void)
|
||||
if (of_find_compatible_node(NULL, NULL, "arm,cortex-a9"))
|
||||
highbank_scu_map_io();
|
||||
|
||||
-#ifdef CONFIG_CACHE_L2X0
|
||||
/* Enable PL310 L2 Cache controller */
|
||||
- highbank_smc1(0x102, 0x1);
|
||||
- l2x0_of_init(0, ~0UL);
|
||||
- outer_cache.disable = highbank_l2x0_disable;
|
||||
-#endif
|
||||
+ if (IS_ENABLED(CONFIG_CACHE_L2X0) &&
|
||||
+ of_find_compatible_node(NULL, NULL, "arm,pl310-cache")) {
|
||||
+ highbank_smc1(0x102, 0x1);
|
||||
+ l2x0_of_init(0, ~0UL);
|
||||
+ outer_cache.disable = highbank_l2x0_disable;
|
||||
+ }
|
||||
}
|
||||
|
||||
static void __init highbank_timer_init(void)
|
||||
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
|
||||
index 004cc87b781c..711c649f80b7 100644
|
||||
--- a/arch/x86/kvm/mmu.c
|
||||
+++ b/arch/x86/kvm/mmu.c
|
||||
@@ -2585,6 +2585,9 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
|
||||
int emulate = 0;
|
||||
gfn_t pseudo_gfn;
|
||||
|
||||
+ if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
|
||||
+ return 0;
|
||||
+
|
||||
for_each_shadow_entry(vcpu, (u64)gfn << PAGE_SHIFT, iterator) {
|
||||
if (iterator.level == level) {
|
||||
mmu_set_spte(vcpu, iterator.sptep, ACC_ALL,
|
||||
@@ -2748,6 +2751,9 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level,
|
||||
bool ret = false;
|
||||
u64 spte = 0ull;
|
||||
|
||||
+ if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
|
||||
+ return false;
|
||||
+
|
||||
if (!page_fault_can_be_fast(vcpu, error_code))
|
||||
return false;
|
||||
|
||||
@@ -3139,6 +3145,9 @@ static u64 walk_shadow_page_get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr)
|
||||
struct kvm_shadow_walk_iterator iterator;
|
||||
u64 spte = 0ull;
|
||||
|
||||
+ if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
|
||||
+ return spte;
|
||||
+
|
||||
walk_shadow_page_lockless_begin(vcpu);
|
||||
for_each_shadow_entry_lockless(vcpu, addr, iterator, spte)
|
||||
if (!is_shadow_present_pte(spte))
|
||||
@@ -4329,6 +4338,9 @@ int kvm_mmu_get_spte_hierarchy(struct kvm_vcpu *vcpu, u64 addr, u64 sptes[4])
|
||||
u64 spte;
|
||||
int nr_sptes = 0;
|
||||
|
||||
+ if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
|
||||
+ return nr_sptes;
|
||||
+
|
||||
walk_shadow_page_lockless_begin(vcpu);
|
||||
for_each_shadow_entry_lockless(vcpu, addr, iterator, spte) {
|
||||
sptes[iterator.level-1] = spte;
|
||||
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
|
||||
index da20860b457a..7e6090e13237 100644
|
||||
--- a/arch/x86/kvm/paging_tmpl.h
|
||||
+++ b/arch/x86/kvm/paging_tmpl.h
|
||||
@@ -423,6 +423,9 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||
if (FNAME(gpte_changed)(vcpu, gw, top_level))
|
||||
goto out_gpte_changed;
|
||||
|
||||
+ if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
|
||||
+ goto out_gpte_changed;
|
||||
+
|
||||
for (shadow_walk_init(&it, vcpu, addr);
|
||||
shadow_walk_okay(&it) && it.level > gw->level;
|
||||
shadow_walk_next(&it)) {
|
||||
@@ -671,6 +674,11 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva)
|
||||
*/
|
||||
mmu_topup_memory_caches(vcpu);
|
||||
|
||||
+ if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) {
|
||||
+ WARN_ON(1);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
spin_lock(&vcpu->kvm->mmu_lock);
|
||||
for_each_shadow_entry(vcpu, gva, iterator) {
|
||||
level = iterator.level;
|
||||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
|
||||
index 5402c94ab768..7cdafb6dc705 100644
|
||||
--- a/arch/x86/kvm/vmx.c
|
||||
+++ b/arch/x86/kvm/vmx.c
|
||||
@@ -7133,8 +7133,8 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu)
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
|
||||
free_vpid(vmx);
|
||||
- free_nested(vmx);
|
||||
free_loaded_vmcs(vmx->loaded_vmcs);
|
||||
+ free_nested(vmx);
|
||||
kfree(vmx->guest_msrs);
|
||||
kvm_vcpu_uninit(vcpu);
|
||||
kmem_cache_free(kvm_vcpu_cache, vmx);
|
||||
diff --git a/arch/x86/net/bpf_jit.S b/arch/x86/net/bpf_jit.S
|
||||
index 877b9a1b2152..01495755701b 100644
|
||||
--- a/arch/x86/net/bpf_jit.S
|
||||
+++ b/arch/x86/net/bpf_jit.S
|
||||
@@ -140,7 +140,7 @@ bpf_slow_path_byte_msh:
|
||||
push %r9; \
|
||||
push SKBDATA; \
|
||||
/* rsi already has offset */ \
|
||||
- mov $SIZE,%ecx; /* size */ \
|
||||
+ mov $SIZE,%edx; /* size */ \
|
||||
call bpf_internal_load_pointer_neg_helper; \
|
||||
test %rax,%rax; \
|
||||
pop SKBDATA; \
|
||||
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
|
||||
index 1e8e42fb03a4..1fb1a7b5a754 100644
|
||||
--- a/drivers/input/mouse/elantech.c
|
||||
+++ b/drivers/input/mouse/elantech.c
|
||||
@@ -486,6 +486,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse)
|
||||
unsigned char *packet = psmouse->packet;
|
||||
|
||||
input_report_key(dev, BTN_LEFT, packet[0] & 0x01);
|
||||
+ input_report_key(dev, BTN_RIGHT, packet[0] & 0x02);
|
||||
input_mt_report_pointer_emulation(dev, true);
|
||||
input_sync(dev);
|
||||
}
|
||||
@@ -954,6 +955,44 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse,
|
||||
}
|
||||
|
||||
/*
|
||||
+ * Advertise INPUT_PROP_BUTTONPAD for clickpads. The testing of bit 12 in
|
||||
+ * fw_version for this is based on the following fw_version & caps table:
|
||||
+ *
|
||||
+ * Laptop-model: fw_version: caps: buttons:
|
||||
+ * Acer S3 0x461f00 10, 13, 0e clickpad
|
||||
+ * Acer S7-392 0x581f01 50, 17, 0d clickpad
|
||||
+ * Acer V5-131 0x461f02 01, 16, 0c clickpad
|
||||
+ * Acer V5-551 0x461f00 ? clickpad
|
||||
+ * Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons
|
||||
+ * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons
|
||||
+ * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons
|
||||
+ * Asus UX31 0x361f00 20, 15, 0e clickpad
|
||||
+ * Asus UX32VD 0x361f02 00, 15, 0e clickpad
|
||||
+ * Avatar AVIU-145A2 0x361f00 ? clickpad
|
||||
+ * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons
|
||||
+ * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*)
|
||||
+ * Samsung NF210 0x150b00 78, 14, 0a 2 hw buttons
|
||||
+ * Samsung NP770Z5E 0x575f01 10, 15, 0f clickpad
|
||||
+ * Samsung NP700Z5B 0x361f06 21, 15, 0f clickpad
|
||||
+ * Samsung NP900X3E-A02 0x575f03 ? clickpad
|
||||
+ * Samsung NP-QX410 0x851b00 19, 14, 0c clickpad
|
||||
+ * Samsung RC512 0x450f00 08, 15, 0c 2 hw buttons
|
||||
+ * Samsung RF710 0x450f00 ? 2 hw buttons
|
||||
+ * System76 Pangolin 0x250f01 ? 2 hw buttons
|
||||
+ * (*) + 3 trackpoint buttons
|
||||
+ */
|
||||
+static void elantech_set_buttonpad_prop(struct psmouse *psmouse)
|
||||
+{
|
||||
+ struct input_dev *dev = psmouse->dev;
|
||||
+ struct elantech_data *etd = psmouse->private;
|
||||
+
|
||||
+ if (etd->fw_version & 0x001000) {
|
||||
+ __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
|
||||
+ __clear_bit(BTN_RIGHT, dev->keybit);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* Set the appropriate event bits for the input subsystem
|
||||
*/
|
||||
static int elantech_set_input_params(struct psmouse *psmouse)
|
||||
@@ -996,6 +1035,8 @@ static int elantech_set_input_params(struct psmouse *psmouse)
|
||||
__set_bit(INPUT_PROP_SEMI_MT, dev->propbit);
|
||||
/* fall through */
|
||||
case 3:
|
||||
+ if (etd->hw_version == 3)
|
||||
+ elantech_set_buttonpad_prop(psmouse);
|
||||
input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0);
|
||||
input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0);
|
||||
if (etd->reports_pressure) {
|
||||
@@ -1017,9 +1058,7 @@ static int elantech_set_input_params(struct psmouse *psmouse)
|
||||
*/
|
||||
psmouse_warn(psmouse, "couldn't query resolution data.\n");
|
||||
}
|
||||
- /* v4 is clickpad, with only one button. */
|
||||
- __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
|
||||
- __clear_bit(BTN_RIGHT, dev->keybit);
|
||||
+ elantech_set_buttonpad_prop(psmouse);
|
||||
__set_bit(BTN_TOOL_QUADTAP, dev->keybit);
|
||||
/* For X to recognize me as touchpad. */
|
||||
input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0);
|
||||
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
|
||||
index aaf23aeae2ea..3d838c0b495d 100644
|
||||
--- a/drivers/input/tablet/wacom_sys.c
|
||||
+++ b/drivers/input/tablet/wacom_sys.c
|
||||
@@ -339,7 +339,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
char limit = 0;
|
||||
/* result has to be defined as int for some devices */
|
||||
- int result = 0;
|
||||
+ int result = 0, touch_max = 0;
|
||||
int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0;
|
||||
unsigned char *report;
|
||||
|
||||
@@ -386,7 +386,8 @@ static int wacom_parse_hid(struct usb_interface *intf,
|
||||
if (usage == WCM_DESKTOP) {
|
||||
if (finger) {
|
||||
features->device_type = BTN_TOOL_FINGER;
|
||||
-
|
||||
+ /* touch device at least supports one touch point */
|
||||
+ touch_max = 1;
|
||||
switch (features->type) {
|
||||
case TABLETPC2FG:
|
||||
features->pktlen = WACOM_PKGLEN_TPC2FG;
|
||||
@@ -539,6 +540,8 @@ static int wacom_parse_hid(struct usb_interface *intf,
|
||||
}
|
||||
|
||||
out:
|
||||
+ if (!features->touch_max && touch_max)
|
||||
+ features->touch_max = touch_max;
|
||||
result = 0;
|
||||
kfree(report);
|
||||
return result;
|
||||
diff --git a/drivers/media/pci/cx18/cx18-driver.c b/drivers/media/pci/cx18/cx18-driver.c
|
||||
index 13c9718a5ace..16e89f026bca 100644
|
||||
--- a/drivers/media/pci/cx18/cx18-driver.c
|
||||
+++ b/drivers/media/pci/cx18/cx18-driver.c
|
||||
@@ -327,13 +327,16 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
|
||||
struct i2c_client *c;
|
||||
u8 eedata[256];
|
||||
|
||||
+ memset(tv, 0, sizeof(*tv));
|
||||
+
|
||||
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
+ if (!c)
|
||||
+ return;
|
||||
|
||||
strlcpy(c->name, "cx18 tveeprom tmp", sizeof(c->name));
|
||||
c->adapter = &cx->i2c_adap[0];
|
||||
c->addr = 0xa0 >> 1;
|
||||
|
||||
- memset(tv, 0, sizeof(*tv));
|
||||
if (tveeprom_read(c, eedata, sizeof(eedata)))
|
||||
goto ret;
|
||||
|
||||
diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c
|
||||
index 20e345d9fe8f..a1c641e18362 100644
|
||||
--- a/drivers/media/usb/dvb-usb/cxusb.c
|
||||
+++ b/drivers/media/usb/dvb-usb/cxusb.c
|
||||
@@ -149,6 +149,7 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
int num)
|
||||
{
|
||||
struct dvb_usb_device *d = i2c_get_adapdata(adap);
|
||||
+ int ret;
|
||||
int i;
|
||||
|
||||
if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
|
||||
@@ -173,7 +174,8 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (1 + msg[i].len > sizeof(ibuf)) {
|
||||
warn("i2c rd: len=%d is too big!\n",
|
||||
msg[i].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
obuf[0] = 0;
|
||||
obuf[1] = msg[i].len;
|
||||
@@ -193,12 +195,14 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (3 + msg[i].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[i].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
if (1 + msg[i + 1].len > sizeof(ibuf)) {
|
||||
warn("i2c rd: len=%d is too big!\n",
|
||||
msg[i + 1].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
obuf[0] = msg[i].len;
|
||||
obuf[1] = msg[i+1].len;
|
||||
@@ -223,7 +227,8 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (2 + msg[i].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[i].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
obuf[0] = msg[i].addr;
|
||||
obuf[1] = msg[i].len;
|
||||
@@ -237,8 +242,14 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
}
|
||||
}
|
||||
|
||||
+ if (i == num)
|
||||
+ ret = num;
|
||||
+ else
|
||||
+ ret = -EREMOTEIO;
|
||||
+
|
||||
+unlock:
|
||||
mutex_unlock(&d->i2c_mutex);
|
||||
- return i == num ? num : -EREMOTEIO;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static u32 cxusb_i2c_func(struct i2c_adapter *adapter)
|
||||
diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
|
||||
index 71b22f5a05ce..4170a45d17e0 100644
|
||||
--- a/drivers/media/usb/dvb-usb/dw2102.c
|
||||
+++ b/drivers/media/usb/dvb-usb/dw2102.c
|
||||
@@ -301,6 +301,7 @@ static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap,
|
||||
static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
|
||||
{
|
||||
struct dvb_usb_device *d = i2c_get_adapdata(adap);
|
||||
+ int ret;
|
||||
|
||||
if (!d)
|
||||
return -ENODEV;
|
||||
@@ -316,7 +317,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms
|
||||
if (2 + msg[1].len > sizeof(ibuf)) {
|
||||
warn("i2c rd: len=%d is too big!\n",
|
||||
msg[1].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
obuf[0] = msg[0].addr << 1;
|
||||
@@ -340,7 +342,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms
|
||||
if (2 + msg[0].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[1].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
obuf[0] = msg[0].addr << 1;
|
||||
@@ -357,7 +360,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms
|
||||
if (2 + msg[0].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[1].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
obuf[0] = msg[0].addr << 1;
|
||||
@@ -386,15 +390,17 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms
|
||||
|
||||
break;
|
||||
}
|
||||
+ ret = num;
|
||||
|
||||
+unlock:
|
||||
mutex_unlock(&d->i2c_mutex);
|
||||
- return num;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
|
||||
{
|
||||
struct dvb_usb_device *d = i2c_get_adapdata(adap);
|
||||
- int len, i, j;
|
||||
+ int len, i, j, ret;
|
||||
|
||||
if (!d)
|
||||
return -ENODEV;
|
||||
@@ -430,7 +436,8 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i
|
||||
if (2 + msg[j].len > sizeof(ibuf)) {
|
||||
warn("i2c rd: len=%d is too big!\n",
|
||||
msg[j].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
dw210x_op_rw(d->udev, 0xc3,
|
||||
@@ -466,7 +473,8 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i
|
||||
if (2 + msg[j].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[j].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
obuf[0] = msg[j].addr << 1;
|
||||
@@ -481,15 +489,18 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i
|
||||
}
|
||||
|
||||
}
|
||||
+ ret = num;
|
||||
|
||||
+unlock:
|
||||
mutex_unlock(&d->i2c_mutex);
|
||||
- return num;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
int num)
|
||||
{
|
||||
struct dvb_usb_device *d = i2c_get_adapdata(adap);
|
||||
+ int ret;
|
||||
int i;
|
||||
|
||||
if (!d)
|
||||
@@ -506,7 +517,8 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (2 + msg[1].len > sizeof(ibuf)) {
|
||||
warn("i2c rd: len=%d is too big!\n",
|
||||
msg[1].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
obuf[0] = msg[0].addr << 1;
|
||||
obuf[1] = msg[0].len;
|
||||
@@ -530,7 +542,8 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (2 + msg[0].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[0].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
obuf[0] = msg[0].addr << 1;
|
||||
obuf[1] = msg[0].len;
|
||||
@@ -556,9 +569,11 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
msg[i].flags == 0 ? ">>>" : "<<<");
|
||||
debug_dump(msg[i].buf, msg[i].len, deb_xfer);
|
||||
}
|
||||
+ ret = num;
|
||||
|
||||
+unlock:
|
||||
mutex_unlock(&d->i2c_mutex);
|
||||
- return num;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
@@ -566,7 +581,7 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
{
|
||||
struct dvb_usb_device *d = i2c_get_adapdata(adap);
|
||||
struct usb_device *udev;
|
||||
- int len, i, j;
|
||||
+ int len, i, j, ret;
|
||||
|
||||
if (!d)
|
||||
return -ENODEV;
|
||||
@@ -618,7 +633,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (msg[j].len > sizeof(ibuf)) {
|
||||
warn("i2c rd: len=%d is too big!\n",
|
||||
msg[j].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
dw210x_op_rw(d->udev, 0x91, 0, 0,
|
||||
@@ -652,7 +668,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (2 + msg[j].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[j].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
obuf[0] = msg[j + 1].len;
|
||||
@@ -671,7 +688,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
if (2 + msg[j].len > sizeof(obuf)) {
|
||||
warn("i2c wr: len=%d is too big!\n",
|
||||
msg[j].len);
|
||||
- return -EOPNOTSUPP;
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto unlock;
|
||||
}
|
||||
obuf[0] = msg[j].len + 1;
|
||||
obuf[1] = (msg[j].addr << 1);
|
||||
@@ -685,9 +703,11 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
}
|
||||
}
|
||||
}
|
||||
+ ret = num;
|
||||
|
||||
+unlock:
|
||||
mutex_unlock(&d->i2c_mutex);
|
||||
- return num;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int su3000_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
|
||||
diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
|
||||
index d2bea3f07c73..69d3f59f8728 100644
|
||||
--- a/drivers/net/ethernet/intel/e100.c
|
||||
+++ b/drivers/net/ethernet/intel/e100.c
|
||||
@@ -3039,7 +3039,7 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
||||
*enable_wake = false;
|
||||
}
|
||||
|
||||
- pci_disable_device(pdev);
|
||||
+ pci_clear_master(pdev);
|
||||
}
|
||||
|
||||
static int __e100_power_off(struct pci_dev *pdev, bool wake)
|
||||
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c
|
||||
index f95de0d16216..1de59b0f8fa8 100644
|
||||
--- a/drivers/net/wireless/p54/txrx.c
|
||||
+++ b/drivers/net/wireless/p54/txrx.c
|
||||
@@ -587,7 +587,7 @@ static void p54_rx_stats(struct p54_common *priv, struct sk_buff *skb)
|
||||
chan = priv->curchan;
|
||||
if (chan) {
|
||||
struct survey_info *survey = &priv->survey[chan->hw_value];
|
||||
- survey->noise = clamp_t(s8, priv->noise, -128, 127);
|
||||
+ survey->noise = clamp(priv->noise, -128, 127);
|
||||
survey->channel_time = priv->survey_raw.active;
|
||||
survey->channel_time_tx = priv->survey_raw.tx;
|
||||
survey->channel_time_busy = priv->survey_raw.tx +
|
||||
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
|
||||
index c59cc6ed7adb..a86d12326137 100644
|
||||
--- a/drivers/regulator/core.c
|
||||
+++ b/drivers/regulator/core.c
|
||||
@@ -1712,8 +1712,6 @@ static int _regulator_do_disable(struct regulator_dev *rdev)
|
||||
|
||||
trace_regulator_disable_complete(rdev_get_name(rdev));
|
||||
|
||||
- _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
|
||||
- NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1737,6 +1735,8 @@ static int _regulator_disable(struct regulator_dev *rdev)
|
||||
rdev_err(rdev, "failed to disable\n");
|
||||
return ret;
|
||||
}
|
||||
+ _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
|
||||
+ NULL);
|
||||
}
|
||||
|
||||
rdev->use_count = 0;
|
||||
@@ -1789,20 +1789,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
- /* force disable */
|
||||
- if (rdev->desc->ops->disable) {
|
||||
- /* ah well, who wants to live forever... */
|
||||
- ret = rdev->desc->ops->disable(rdev);
|
||||
- if (ret < 0) {
|
||||
- rdev_err(rdev, "failed to force disable\n");
|
||||
- return ret;
|
||||
- }
|
||||
- /* notify other consumers that power has been forced off */
|
||||
- _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE |
|
||||
- REGULATOR_EVENT_DISABLE, NULL);
|
||||
+ ret = _regulator_do_disable(rdev);
|
||||
+ if (ret < 0) {
|
||||
+ rdev_err(rdev, "failed to force disable\n");
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
- return ret;
|
||||
+ _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE |
|
||||
+ REGULATOR_EVENT_DISABLE, NULL);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3788,8 +3784,6 @@ int regulator_suspend_finish(void)
|
||||
|
||||
mutex_lock(®ulator_list_mutex);
|
||||
list_for_each_entry(rdev, ®ulator_list, list) {
|
||||
- struct regulator_ops *ops = rdev->desc->ops;
|
||||
-
|
||||
mutex_lock(&rdev->mutex);
|
||||
if (rdev->use_count > 0 || rdev->constraints->always_on) {
|
||||
error = _regulator_do_enable(rdev);
|
||||
@@ -3798,12 +3792,10 @@ int regulator_suspend_finish(void)
|
||||
} else {
|
||||
if (!has_full_constraints)
|
||||
goto unlock;
|
||||
- if (!ops->disable)
|
||||
- goto unlock;
|
||||
if (!_regulator_is_enabled(rdev))
|
||||
goto unlock;
|
||||
|
||||
- error = ops->disable(rdev);
|
||||
+ error = _regulator_do_disable(rdev);
|
||||
if (error)
|
||||
ret = error;
|
||||
}
|
||||
@@ -3993,7 +3985,7 @@ static int __init regulator_init_complete(void)
|
||||
ops = rdev->desc->ops;
|
||||
c = rdev->constraints;
|
||||
|
||||
- if (!ops->disable || (c && c->always_on))
|
||||
+ if (c && c->always_on)
|
||||
continue;
|
||||
|
||||
mutex_lock(&rdev->mutex);
|
||||
@@ -4014,7 +4006,7 @@ static int __init regulator_init_complete(void)
|
||||
/* We log since this may kill the system if it
|
||||
* goes wrong. */
|
||||
rdev_info(rdev, "disabling\n");
|
||||
- ret = ops->disable(rdev);
|
||||
+ ret = _regulator_do_disable(rdev);
|
||||
if (ret != 0) {
|
||||
rdev_err(rdev, "couldn't disable: %d\n", ret);
|
||||
}
|
||||
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
|
||||
index 159e3c6d92b9..3581416a24d8 100644
|
||||
--- a/drivers/usb/host/xhci-pci.c
|
||||
+++ b/drivers/usb/host/xhci-pci.c
|
||||
@@ -113,6 +113,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
xhci_dbg(xhci, "QUIRK: Resetting on resume\n");
|
||||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||
}
|
||||
+ if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
|
||||
+ pdev->device == 0x0015 &&
|
||||
+ pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG &&
|
||||
+ pdev->subsystem_device == 0xc0cd)
|
||||
+ xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
if (pdev->vendor == PCI_VENDOR_ID_VIA)
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
}
|
||||
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
|
||||
index 8f47625a0661..4fb6a8938957 100644
|
||||
--- a/include/linux/ceph/osd_client.h
|
||||
+++ b/include/linux/ceph/osd_client.h
|
||||
@@ -138,6 +138,7 @@ struct ceph_osd_request {
|
||||
__le64 *r_request_pool;
|
||||
void *r_request_pgid;
|
||||
__le32 *r_request_attempts;
|
||||
+ bool r_paused;
|
||||
struct ceph_eversion *r_request_reassert_version;
|
||||
|
||||
int r_result;
|
||||
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
|
||||
index 120d57a1c3a5..b5e36017acd7 100644
|
||||
--- a/include/linux/ftrace_event.h
|
||||
+++ b/include/linux/ftrace_event.h
|
||||
@@ -325,10 +325,6 @@ enum {
|
||||
FILTER_TRACE_FN,
|
||||
};
|
||||
|
||||
-#define EVENT_STORAGE_SIZE 128
|
||||
-extern struct mutex event_storage_mutex;
|
||||
-extern char event_storage[EVENT_STORAGE_SIZE];
|
||||
-
|
||||
extern int trace_event_raw_init(struct ftrace_event_call *call);
|
||||
extern int trace_define_field(struct ftrace_event_call *call, const char *type,
|
||||
const char *name, int offset, int size,
|
||||
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h
|
||||
index 66dba42128d7..dbb47418df81 100644
|
||||
--- a/include/trace/ftrace.h
|
||||
+++ b/include/trace/ftrace.h
|
||||
@@ -299,15 +299,12 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \
|
||||
#undef __array
|
||||
#define __array(type, item, len) \
|
||||
do { \
|
||||
- mutex_lock(&event_storage_mutex); \
|
||||
+ char *type_str = #type"["__stringify(len)"]"; \
|
||||
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
||||
- snprintf(event_storage, sizeof(event_storage), \
|
||||
- "%s[%d]", #type, len); \
|
||||
- ret = trace_define_field(event_call, event_storage, #item, \
|
||||
+ ret = trace_define_field(event_call, type_str, #item, \
|
||||
offsetof(typeof(field), item), \
|
||||
sizeof(field.item), \
|
||||
is_signed_type(type), FILTER_OTHER); \
|
||||
- mutex_unlock(&event_storage_mutex); \
|
||||
if (ret) \
|
||||
return ret; \
|
||||
} while (0);
|
||||
diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c
|
||||
index 64de5f8b0c9e..4a073539c58e 100644
|
||||
--- a/kernel/sched/auto_group.c
|
||||
+++ b/kernel/sched/auto_group.c
|
||||
@@ -77,8 +77,6 @@ static inline struct autogroup *autogroup_create(void)
|
||||
if (IS_ERR(tg))
|
||||
goto out_free;
|
||||
|
||||
- sched_online_group(tg, &root_task_group);
|
||||
-
|
||||
kref_init(&ag->kref);
|
||||
init_rwsem(&ag->lock);
|
||||
ag->id = atomic_inc_return(&autogroup_seq_nr);
|
||||
@@ -98,6 +96,7 @@ static inline struct autogroup *autogroup_create(void)
|
||||
#endif
|
||||
tg->autogroup = ag;
|
||||
|
||||
+ sched_online_group(tg, &root_task_group);
|
||||
return ag;
|
||||
|
||||
out_free:
|
||||
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
|
||||
index 2f4b185bfc23..001b349af939 100644
|
||||
--- a/kernel/trace/trace_events.c
|
||||
+++ b/kernel/trace/trace_events.c
|
||||
@@ -27,12 +27,6 @@
|
||||
|
||||
DEFINE_MUTEX(event_mutex);
|
||||
|
||||
-DEFINE_MUTEX(event_storage_mutex);
|
||||
-EXPORT_SYMBOL_GPL(event_storage_mutex);
|
||||
-
|
||||
-char event_storage[EVENT_STORAGE_SIZE];
|
||||
-EXPORT_SYMBOL_GPL(event_storage);
|
||||
-
|
||||
LIST_HEAD(ftrace_events);
|
||||
static LIST_HEAD(ftrace_common_fields);
|
||||
|
||||
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c
|
||||
index d21a74670088..d7d0b50b1b70 100644
|
||||
--- a/kernel/trace/trace_export.c
|
||||
+++ b/kernel/trace/trace_export.c
|
||||
@@ -95,15 +95,12 @@ static void __always_unused ____ftrace_check_##name(void) \
|
||||
#undef __array
|
||||
#define __array(type, item, len) \
|
||||
do { \
|
||||
+ char *type_str = #type"["__stringify(len)"]"; \
|
||||
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
|
||||
- mutex_lock(&event_storage_mutex); \
|
||||
- snprintf(event_storage, sizeof(event_storage), \
|
||||
- "%s[%d]", #type, len); \
|
||||
- ret = trace_define_field(event_call, event_storage, #item, \
|
||||
+ ret = trace_define_field(event_call, type_str, #item, \
|
||||
offsetof(typeof(field), item), \
|
||||
sizeof(field.item), \
|
||||
is_signed_type(type), filter_type); \
|
||||
- mutex_unlock(&event_storage_mutex); \
|
||||
if (ret) \
|
||||
return ret; \
|
||||
} while (0);
|
||||
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
|
||||
index bc0016e3e5ac..3663a305daf7 100644
|
||||
--- a/net/ceph/osd_client.c
|
||||
+++ b/net/ceph/osd_client.c
|
||||
@@ -1225,6 +1225,22 @@ void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc,
|
||||
EXPORT_SYMBOL(ceph_osdc_set_request_linger);
|
||||
|
||||
/*
|
||||
+ * Returns whether a request should be blocked from being sent
|
||||
+ * based on the current osdmap and osd_client settings.
|
||||
+ *
|
||||
+ * Caller should hold map_sem for read.
|
||||
+ */
|
||||
+static bool __req_should_be_paused(struct ceph_osd_client *osdc,
|
||||
+ struct ceph_osd_request *req)
|
||||
+{
|
||||
+ bool pauserd = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSERD);
|
||||
+ bool pausewr = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSEWR) ||
|
||||
+ ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL);
|
||||
+ return (req->r_flags & CEPH_OSD_FLAG_READ && pauserd) ||
|
||||
+ (req->r_flags & CEPH_OSD_FLAG_WRITE && pausewr);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
* Pick an osd (the first 'up' osd in the pg), allocate the osd struct
|
||||
* (as needed), and set the request r_osd appropriately. If there is
|
||||
* no up osd, set r_osd to NULL. Move the request to the appropriate list
|
||||
@@ -1241,6 +1257,7 @@ static int __map_request(struct ceph_osd_client *osdc,
|
||||
int acting[CEPH_PG_MAX_SIZE];
|
||||
int o = -1, num = 0;
|
||||
int err;
|
||||
+ bool was_paused;
|
||||
|
||||
dout("map_request %p tid %lld\n", req, req->r_tid);
|
||||
err = ceph_calc_ceph_pg(&pgid, req->r_oid, osdc->osdmap,
|
||||
@@ -1257,12 +1274,18 @@ static int __map_request(struct ceph_osd_client *osdc,
|
||||
num = err;
|
||||
}
|
||||
|
||||
+ was_paused = req->r_paused;
|
||||
+ req->r_paused = __req_should_be_paused(osdc, req);
|
||||
+ if (was_paused && !req->r_paused)
|
||||
+ force_resend = 1;
|
||||
+
|
||||
if ((!force_resend &&
|
||||
req->r_osd && req->r_osd->o_osd == o &&
|
||||
req->r_sent >= req->r_osd->o_incarnation &&
|
||||
req->r_num_pg_osds == num &&
|
||||
memcmp(req->r_pg_osds, acting, sizeof(acting[0])*num) == 0) ||
|
||||
- (req->r_osd == NULL && o == -1))
|
||||
+ (req->r_osd == NULL && o == -1) ||
|
||||
+ req->r_paused)
|
||||
return 0; /* no change */
|
||||
|
||||
dout("map_request tid %llu pgid %lld.%x osd%d (was osd%d)\n",
|
||||
@@ -1606,14 +1629,17 @@ static void reset_changed_osds(struct ceph_osd_client *osdc)
|
||||
*
|
||||
* Caller should hold map_sem for read.
|
||||
*/
|
||||
-static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
||||
+static void kick_requests(struct ceph_osd_client *osdc, bool force_resend,
|
||||
+ bool force_resend_writes)
|
||||
{
|
||||
struct ceph_osd_request *req, *nreq;
|
||||
struct rb_node *p;
|
||||
int needmap = 0;
|
||||
int err;
|
||||
+ bool force_resend_req;
|
||||
|
||||
- dout("kick_requests %s\n", force_resend ? " (force resend)" : "");
|
||||
+ dout("kick_requests %s %s\n", force_resend ? " (force resend)" : "",
|
||||
+ force_resend_writes ? " (force resend writes)" : "");
|
||||
mutex_lock(&osdc->request_mutex);
|
||||
for (p = rb_first(&osdc->requests); p; ) {
|
||||
req = rb_entry(p, struct ceph_osd_request, r_node);
|
||||
@@ -1638,7 +1664,10 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
||||
continue;
|
||||
}
|
||||
|
||||
- err = __map_request(osdc, req, force_resend);
|
||||
+ force_resend_req = force_resend ||
|
||||
+ (force_resend_writes &&
|
||||
+ req->r_flags & CEPH_OSD_FLAG_WRITE);
|
||||
+ err = __map_request(osdc, req, force_resend_req);
|
||||
if (err < 0)
|
||||
continue; /* error */
|
||||
if (req->r_osd == NULL) {
|
||||
@@ -1658,7 +1687,8 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
|
||||
r_linger_item) {
|
||||
dout("linger req=%p req->r_osd=%p\n", req, req->r_osd);
|
||||
|
||||
- err = __map_request(osdc, req, force_resend);
|
||||
+ err = __map_request(osdc, req,
|
||||
+ force_resend || force_resend_writes);
|
||||
dout("__map_request returned %d\n", err);
|
||||
if (err == 0)
|
||||
continue; /* no change and no osd was specified */
|
||||
@@ -1700,6 +1730,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
struct ceph_osdmap *newmap = NULL, *oldmap;
|
||||
int err;
|
||||
struct ceph_fsid fsid;
|
||||
+ bool was_full;
|
||||
|
||||
dout("handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0);
|
||||
p = msg->front.iov_base;
|
||||
@@ -1713,6 +1744,8 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
|
||||
down_write(&osdc->map_sem);
|
||||
|
||||
+ was_full = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL);
|
||||
+
|
||||
/* incremental maps */
|
||||
ceph_decode_32_safe(&p, end, nr_maps, bad);
|
||||
dout(" %d inc maps\n", nr_maps);
|
||||
@@ -1737,7 +1770,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
ceph_osdmap_destroy(osdc->osdmap);
|
||||
osdc->osdmap = newmap;
|
||||
}
|
||||
- kick_requests(osdc, 0);
|
||||
+ was_full = was_full ||
|
||||
+ ceph_osdmap_flag(osdc->osdmap,
|
||||
+ CEPH_OSDMAP_FULL);
|
||||
+ kick_requests(osdc, 0, was_full);
|
||||
} else {
|
||||
dout("ignoring incremental map %u len %d\n",
|
||||
epoch, maplen);
|
||||
@@ -1780,7 +1816,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
skipped_map = 1;
|
||||
ceph_osdmap_destroy(oldmap);
|
||||
}
|
||||
- kick_requests(osdc, skipped_map);
|
||||
+ was_full = was_full ||
|
||||
+ ceph_osdmap_flag(osdc->osdmap,
|
||||
+ CEPH_OSDMAP_FULL);
|
||||
+ kick_requests(osdc, skipped_map, was_full);
|
||||
}
|
||||
p += maplen;
|
||||
nr_maps--;
|
||||
@@ -1797,7 +1836,9 @@ done:
|
||||
* we find out when we are no longer full and stop returning
|
||||
* ENOSPC.
|
||||
*/
|
||||
- if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL))
|
||||
+ if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL) ||
|
||||
+ ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSERD) ||
|
||||
+ ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSEWR))
|
||||
ceph_monc_request_next_osdmap(&osdc->client->monc);
|
||||
|
||||
mutex_lock(&osdc->request_mutex);
|
||||
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
|
||||
index acb86507828a..3001ec5ae07d 100644
|
||||
--- a/scripts/package/builddeb
|
||||
+++ b/scripts/package/builddeb
|
||||
@@ -62,7 +62,7 @@ create_package() {
|
||||
fi
|
||||
|
||||
# Create the package
|
||||
- dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir"
|
||||
+ dpkg-gencontrol -isp $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir"
|
||||
dpkg --build "$pdir" ..
|
||||
}
|
||||
|
||||
@@ -252,15 +252,14 @@ mkdir -p "$destdir"
|
||||
(cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -)
|
||||
ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
|
||||
rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
|
||||
-arch=$(dpkg --print-architecture)
|
||||
|
||||
cat <<EOF >> debian/control
|
||||
|
||||
Package: $kernel_headers_packagename
|
||||
Provides: linux-headers, linux-headers-2.6
|
||||
-Architecture: $arch
|
||||
-Description: Linux kernel headers for $KERNELRELEASE on $arch
|
||||
- This package provides kernel header files for $KERNELRELEASE on $arch
|
||||
+Architecture: any
|
||||
+Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
|
||||
+ This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
|
||||
.
|
||||
This is useful for people who need to build external modules
|
||||
EOF
|
||||
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
|
||||
index 19799931c51d..3fdf998ad057 100644
|
||||
--- a/sound/core/compress_offload.c
|
||||
+++ b/sound/core/compress_offload.c
|
||||
@@ -133,7 +133,7 @@ static int snd_compr_open(struct inode *inode, struct file *f)
|
||||
kfree(data);
|
||||
}
|
||||
snd_card_unref(compr->card);
|
||||
- return 0;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int snd_compr_free(struct inode *inode, struct file *f)
|
||||
diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c
|
||||
index 819c90fe021f..4fdcc1cefc25 100644
|
||||
--- a/sound/soc/codecs/max98090.c
|
||||
+++ b/sound/soc/codecs/max98090.c
|
||||
@@ -336,6 +336,7 @@ static bool max98090_readable_register(struct device *dev, unsigned int reg)
|
||||
case M98090_REG_RECORD_TDM_SLOT:
|
||||
case M98090_REG_SAMPLE_RATE:
|
||||
case M98090_REG_DMIC34_BIQUAD_BASE ... M98090_REG_DMIC34_BIQUAD_BASE + 0x0E:
|
||||
+ case M98090_REG_REVISION_ID:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
604
projects/Cuboxi/patches/linux/linux-000-patch-3.10.35-36.patch
Normal file
604
projects/Cuboxi/patches/linux/linux-000-patch-3.10.35-36.patch
Normal file
@ -0,0 +1,604 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 06b31fce1ff5..b5f4ef30f6e6 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 35
|
||||
+SUBLEVEL = 36
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h
|
||||
index 095b21507b6a..60bd2748a7c9 100644
|
||||
--- a/arch/x86/include/asm/topology.h
|
||||
+++ b/arch/x86/include/asm/topology.h
|
||||
@@ -119,9 +119,10 @@ static inline void setup_node_to_cpumask_map(void) { }
|
||||
|
||||
extern const struct cpumask *cpu_coregroup_mask(int cpu);
|
||||
|
||||
-#ifdef ENABLE_TOPO_DEFINES
|
||||
#define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id)
|
||||
#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id)
|
||||
+
|
||||
+#ifdef ENABLE_TOPO_DEFINES
|
||||
#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
|
||||
#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
|
||||
|
||||
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
|
||||
index fc803ecbbce4..31262732db23 100644
|
||||
--- a/drivers/block/aoe/aoecmd.c
|
||||
+++ b/drivers/block/aoe/aoecmd.c
|
||||
@@ -899,7 +899,7 @@ bio_pageinc(struct bio *bio)
|
||||
* but this has never been seen here.
|
||||
*/
|
||||
if (unlikely(PageCompound(page)))
|
||||
- if (compound_trans_head(page) != page) {
|
||||
+ if (compound_head(page) != page) {
|
||||
pr_crit("page tail used for block I/O\n");
|
||||
BUG();
|
||||
}
|
||||
diff --git a/drivers/input/mouse/cypress_ps2.c b/drivers/input/mouse/cypress_ps2.c
|
||||
index 888a81a7ea3d..0aaea7ad6cee 100644
|
||||
--- a/drivers/input/mouse/cypress_ps2.c
|
||||
+++ b/drivers/input/mouse/cypress_ps2.c
|
||||
@@ -410,7 +410,6 @@ static int cypress_set_input_params(struct input_dev *input,
|
||||
__clear_bit(REL_X, input->relbit);
|
||||
__clear_bit(REL_Y, input->relbit);
|
||||
|
||||
- __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
|
||||
__set_bit(EV_KEY, input->evbit);
|
||||
__set_bit(BTN_LEFT, input->keybit);
|
||||
__set_bit(BTN_RIGHT, input->keybit);
|
||||
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
||||
index b2420ae19e14..c69c81608f43 100644
|
||||
--- a/drivers/input/mouse/synaptics.c
|
||||
+++ b/drivers/input/mouse/synaptics.c
|
||||
@@ -265,11 +265,22 @@ static int synaptics_identify(struct psmouse *psmouse)
|
||||
* Read touchpad resolution and maximum reported coordinates
|
||||
* Resolution is left zero if touchpad does not support the query
|
||||
*/
|
||||
+
|
||||
+static const int *quirk_min_max;
|
||||
+
|
||||
static int synaptics_resolution(struct psmouse *psmouse)
|
||||
{
|
||||
struct synaptics_data *priv = psmouse->private;
|
||||
unsigned char resp[3];
|
||||
|
||||
+ if (quirk_min_max) {
|
||||
+ priv->x_min = quirk_min_max[0];
|
||||
+ priv->x_max = quirk_min_max[1];
|
||||
+ priv->y_min = quirk_min_max[2];
|
||||
+ priv->y_max = quirk_min_max[3];
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
if (SYN_ID_MAJOR(priv->identity) < 4)
|
||||
return 0;
|
||||
|
||||
@@ -1485,10 +1496,54 @@ static const struct dmi_system_id __initconst olpc_dmi_table[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
+static const struct dmi_system_id min_max_dmi_table[] __initconst = {
|
||||
+#if defined(CONFIG_DMI)
|
||||
+ {
|
||||
+ /* Lenovo ThinkPad Helix */
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Helix"),
|
||||
+ },
|
||||
+ .driver_data = (int []){1024, 5052, 2258, 4832},
|
||||
+ },
|
||||
+ {
|
||||
+ /* Lenovo ThinkPad X240 */
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X240"),
|
||||
+ },
|
||||
+ .driver_data = (int []){1232, 5710, 1156, 4696},
|
||||
+ },
|
||||
+ {
|
||||
+ /* Lenovo ThinkPad T440s */
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T440"),
|
||||
+ },
|
||||
+ .driver_data = (int []){1024, 5112, 2024, 4832},
|
||||
+ },
|
||||
+ {
|
||||
+ /* Lenovo ThinkPad T540p */
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T540"),
|
||||
+ },
|
||||
+ .driver_data = (int []){1024, 5056, 2058, 4832},
|
||||
+ },
|
||||
+#endif
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
void __init synaptics_module_init(void)
|
||||
{
|
||||
+ const struct dmi_system_id *min_max_dmi;
|
||||
+
|
||||
impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
|
||||
broken_olpc_ec = dmi_check_system(olpc_dmi_table);
|
||||
+
|
||||
+ min_max_dmi = dmi_first_match(min_max_dmi_table);
|
||||
+ if (min_max_dmi)
|
||||
+ quirk_min_max = min_max_dmi->driver_data;
|
||||
}
|
||||
|
||||
static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
|
||||
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c
|
||||
index 4c842c320c2e..b604564dec5c 100644
|
||||
--- a/drivers/input/mousedev.c
|
||||
+++ b/drivers/input/mousedev.c
|
||||
@@ -67,7 +67,6 @@ struct mousedev {
|
||||
struct device dev;
|
||||
struct cdev cdev;
|
||||
bool exist;
|
||||
- bool is_mixdev;
|
||||
|
||||
struct list_head mixdev_node;
|
||||
bool opened_by_mixdev;
|
||||
@@ -77,6 +76,9 @@ struct mousedev {
|
||||
int old_x[4], old_y[4];
|
||||
int frac_dx, frac_dy;
|
||||
unsigned long touch;
|
||||
+
|
||||
+ int (*open_device)(struct mousedev *mousedev);
|
||||
+ void (*close_device)(struct mousedev *mousedev);
|
||||
};
|
||||
|
||||
enum mousedev_emul {
|
||||
@@ -116,9 +118,6 @@ static unsigned char mousedev_imex_seq[] = { 0xf3, 200, 0xf3, 200, 0xf3, 80 };
|
||||
static struct mousedev *mousedev_mix;
|
||||
static LIST_HEAD(mousedev_mix_list);
|
||||
|
||||
-static void mixdev_open_devices(void);
|
||||
-static void mixdev_close_devices(void);
|
||||
-
|
||||
#define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03])
|
||||
#define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03])
|
||||
|
||||
@@ -428,9 +427,7 @@ static int mousedev_open_device(struct mousedev *mousedev)
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
- if (mousedev->is_mixdev)
|
||||
- mixdev_open_devices();
|
||||
- else if (!mousedev->exist)
|
||||
+ if (!mousedev->exist)
|
||||
retval = -ENODEV;
|
||||
else if (!mousedev->open++) {
|
||||
retval = input_open_device(&mousedev->handle);
|
||||
@@ -446,9 +443,7 @@ static void mousedev_close_device(struct mousedev *mousedev)
|
||||
{
|
||||
mutex_lock(&mousedev->mutex);
|
||||
|
||||
- if (mousedev->is_mixdev)
|
||||
- mixdev_close_devices();
|
||||
- else if (mousedev->exist && !--mousedev->open)
|
||||
+ if (mousedev->exist && !--mousedev->open)
|
||||
input_close_device(&mousedev->handle);
|
||||
|
||||
mutex_unlock(&mousedev->mutex);
|
||||
@@ -459,21 +454,29 @@ static void mousedev_close_device(struct mousedev *mousedev)
|
||||
* stream. Note that this function is called with mousedev_mix->mutex
|
||||
* held.
|
||||
*/
|
||||
-static void mixdev_open_devices(void)
|
||||
+static int mixdev_open_devices(struct mousedev *mixdev)
|
||||
{
|
||||
- struct mousedev *mousedev;
|
||||
+ int error;
|
||||
+
|
||||
+ error = mutex_lock_interruptible(&mixdev->mutex);
|
||||
+ if (error)
|
||||
+ return error;
|
||||
|
||||
- if (mousedev_mix->open++)
|
||||
- return;
|
||||
+ if (!mixdev->open++) {
|
||||
+ struct mousedev *mousedev;
|
||||
|
||||
- list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
|
||||
- if (!mousedev->opened_by_mixdev) {
|
||||
- if (mousedev_open_device(mousedev))
|
||||
- continue;
|
||||
+ list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
|
||||
+ if (!mousedev->opened_by_mixdev) {
|
||||
+ if (mousedev_open_device(mousedev))
|
||||
+ continue;
|
||||
|
||||
- mousedev->opened_by_mixdev = true;
|
||||
+ mousedev->opened_by_mixdev = true;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ mutex_unlock(&mixdev->mutex);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -481,19 +484,22 @@ static void mixdev_open_devices(void)
|
||||
* device. Note that this function is called with mousedev_mix->mutex
|
||||
* held.
|
||||
*/
|
||||
-static void mixdev_close_devices(void)
|
||||
+static void mixdev_close_devices(struct mousedev *mixdev)
|
||||
{
|
||||
- struct mousedev *mousedev;
|
||||
+ mutex_lock(&mixdev->mutex);
|
||||
|
||||
- if (--mousedev_mix->open)
|
||||
- return;
|
||||
+ if (!--mixdev->open) {
|
||||
+ struct mousedev *mousedev;
|
||||
|
||||
- list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
|
||||
- if (mousedev->opened_by_mixdev) {
|
||||
- mousedev->opened_by_mixdev = false;
|
||||
- mousedev_close_device(mousedev);
|
||||
+ list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
|
||||
+ if (mousedev->opened_by_mixdev) {
|
||||
+ mousedev->opened_by_mixdev = false;
|
||||
+ mousedev_close_device(mousedev);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ mutex_unlock(&mixdev->mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -522,7 +528,7 @@ static int mousedev_release(struct inode *inode, struct file *file)
|
||||
mousedev_detach_client(mousedev, client);
|
||||
kfree(client);
|
||||
|
||||
- mousedev_close_device(mousedev);
|
||||
+ mousedev->close_device(mousedev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -550,7 +556,7 @@ static int mousedev_open(struct inode *inode, struct file *file)
|
||||
client->mousedev = mousedev;
|
||||
mousedev_attach_client(mousedev, client);
|
||||
|
||||
- error = mousedev_open_device(mousedev);
|
||||
+ error = mousedev->open_device(mousedev);
|
||||
if (error)
|
||||
goto err_free_client;
|
||||
|
||||
@@ -861,16 +867,21 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
|
||||
|
||||
if (mixdev) {
|
||||
dev_set_name(&mousedev->dev, "mice");
|
||||
+
|
||||
+ mousedev->open_device = mixdev_open_devices;
|
||||
+ mousedev->close_device = mixdev_close_devices;
|
||||
} else {
|
||||
int dev_no = minor;
|
||||
/* Normalize device number if it falls into legacy range */
|
||||
if (dev_no < MOUSEDEV_MINOR_BASE + MOUSEDEV_MINORS)
|
||||
dev_no -= MOUSEDEV_MINOR_BASE;
|
||||
dev_set_name(&mousedev->dev, "mouse%d", dev_no);
|
||||
+
|
||||
+ mousedev->open_device = mousedev_open_device;
|
||||
+ mousedev->close_device = mousedev_close_device;
|
||||
}
|
||||
|
||||
mousedev->exist = true;
|
||||
- mousedev->is_mixdev = mixdev;
|
||||
mousedev->handle.dev = input_get_device(dev);
|
||||
mousedev->handle.name = dev_name(&mousedev->dev);
|
||||
mousedev->handle.handler = handler;
|
||||
@@ -919,7 +930,7 @@ static void mousedev_destroy(struct mousedev *mousedev)
|
||||
device_del(&mousedev->dev);
|
||||
mousedev_cleanup(mousedev);
|
||||
input_free_minor(MINOR(mousedev->dev.devt));
|
||||
- if (!mousedev->is_mixdev)
|
||||
+ if (mousedev != mousedev_mix)
|
||||
input_unregister_handle(&mousedev->handle);
|
||||
put_device(&mousedev->dev);
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
|
||||
index 254f255204f9..a602aeeb3acb 100644
|
||||
--- a/drivers/net/ethernet/marvell/mvneta.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvneta.c
|
||||
@@ -119,7 +119,7 @@
|
||||
#define MVNETA_GMAC_MAX_RX_SIZE_MASK 0x7ffc
|
||||
#define MVNETA_GMAC0_PORT_ENABLE BIT(0)
|
||||
#define MVNETA_GMAC_CTRL_2 0x2c08
|
||||
-#define MVNETA_GMAC2_PSC_ENABLE BIT(3)
|
||||
+#define MVNETA_GMAC2_PCS_ENABLE BIT(3)
|
||||
#define MVNETA_GMAC2_PORT_RGMII BIT(4)
|
||||
#define MVNETA_GMAC2_PORT_RESET BIT(6)
|
||||
#define MVNETA_GMAC_STATUS 0x2c10
|
||||
@@ -655,7 +655,7 @@ static void mvneta_port_sgmii_config(struct mvneta_port *pp)
|
||||
u32 val;
|
||||
|
||||
val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
||||
- val |= MVNETA_GMAC2_PSC_ENABLE;
|
||||
+ val |= MVNETA_GMAC2_PCS_ENABLE;
|
||||
mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
|
||||
}
|
||||
|
||||
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
|
||||
index 6f3fbc48a6c7..22080eb6aff6 100644
|
||||
--- a/drivers/vfio/vfio_iommu_type1.c
|
||||
+++ b/drivers/vfio/vfio_iommu_type1.c
|
||||
@@ -138,12 +138,12 @@ static bool is_invalid_reserved_pfn(unsigned long pfn)
|
||||
if (pfn_valid(pfn)) {
|
||||
bool reserved;
|
||||
struct page *tail = pfn_to_page(pfn);
|
||||
- struct page *head = compound_trans_head(tail);
|
||||
+ struct page *head = compound_head(tail);
|
||||
reserved = !!(PageReserved(head));
|
||||
if (head != tail) {
|
||||
/*
|
||||
* "head" is not a dangling pointer
|
||||
- * (compound_trans_head takes care of that)
|
||||
+ * (compound_head takes care of that)
|
||||
* but the hugepage may have been split
|
||||
* from under us (and we may not hold a
|
||||
* reference count on the head page so it can
|
||||
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
|
||||
index 21dff8f236f6..f9e11df768d5 100644
|
||||
--- a/fs/ext4/inode.c
|
||||
+++ b/fs/ext4/inode.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/aio.h>
|
||||
+#include <linux/bitops.h>
|
||||
|
||||
#include "ext4_jbd2.h"
|
||||
#include "xattr.h"
|
||||
@@ -4044,18 +4045,20 @@ int ext4_get_inode_loc(struct inode *inode, struct ext4_iloc *iloc)
|
||||
void ext4_set_inode_flags(struct inode *inode)
|
||||
{
|
||||
unsigned int flags = EXT4_I(inode)->i_flags;
|
||||
+ unsigned int new_fl = 0;
|
||||
|
||||
- inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
|
||||
if (flags & EXT4_SYNC_FL)
|
||||
- inode->i_flags |= S_SYNC;
|
||||
+ new_fl |= S_SYNC;
|
||||
if (flags & EXT4_APPEND_FL)
|
||||
- inode->i_flags |= S_APPEND;
|
||||
+ new_fl |= S_APPEND;
|
||||
if (flags & EXT4_IMMUTABLE_FL)
|
||||
- inode->i_flags |= S_IMMUTABLE;
|
||||
+ new_fl |= S_IMMUTABLE;
|
||||
if (flags & EXT4_NOATIME_FL)
|
||||
- inode->i_flags |= S_NOATIME;
|
||||
+ new_fl |= S_NOATIME;
|
||||
if (flags & EXT4_DIRSYNC_FL)
|
||||
- inode->i_flags |= S_DIRSYNC;
|
||||
+ new_fl |= S_DIRSYNC;
|
||||
+ set_mask_bits(&inode->i_flags,
|
||||
+ S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC, new_fl);
|
||||
}
|
||||
|
||||
/* Propagate flags from i_flags to EXT4_I(inode)->i_flags */
|
||||
diff --git a/fs/proc/page.c b/fs/proc/page.c
|
||||
index b8730d9ebaee..2a8cc94bb641 100644
|
||||
--- a/fs/proc/page.c
|
||||
+++ b/fs/proc/page.c
|
||||
@@ -121,7 +121,7 @@ u64 stable_page_flags(struct page *page)
|
||||
* just checks PG_head/PG_tail, so we need to check PageLRU to make
|
||||
* sure a given page is a thp, not a non-huge compound page.
|
||||
*/
|
||||
- else if (PageTransCompound(page) && PageLRU(compound_trans_head(page)))
|
||||
+ else if (PageTransCompound(page) && PageLRU(compound_head(page)))
|
||||
u |= 1 << KPF_THP;
|
||||
|
||||
/*
|
||||
diff --git a/include/linux/bitops.h b/include/linux/bitops.h
|
||||
index a3b6b82108b9..c1dde8e00d25 100644
|
||||
--- a/include/linux/bitops.h
|
||||
+++ b/include/linux/bitops.h
|
||||
@@ -185,6 +185,21 @@ static inline unsigned long __ffs64(u64 word)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
+#ifndef set_mask_bits
|
||||
+#define set_mask_bits(ptr, _mask, _bits) \
|
||||
+({ \
|
||||
+ const typeof(*ptr) mask = (_mask), bits = (_bits); \
|
||||
+ typeof(*ptr) old, new; \
|
||||
+ \
|
||||
+ do { \
|
||||
+ old = ACCESS_ONCE(*ptr); \
|
||||
+ new = (old & ~mask) | bits; \
|
||||
+ } while (cmpxchg(ptr, old, new) != old); \
|
||||
+ \
|
||||
+ new; \
|
||||
+})
|
||||
+#endif
|
||||
+
|
||||
#ifndef find_last_bit
|
||||
/**
|
||||
* find_last_bit - find the last set bit in a memory region
|
||||
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
|
||||
index 528454c2caa9..a193bb3e4138 100644
|
||||
--- a/include/linux/huge_mm.h
|
||||
+++ b/include/linux/huge_mm.h
|
||||
@@ -159,23 +159,6 @@ static inline int hpage_nr_pages(struct page *page)
|
||||
return HPAGE_PMD_NR;
|
||||
return 1;
|
||||
}
|
||||
-static inline struct page *compound_trans_head(struct page *page)
|
||||
-{
|
||||
- if (PageTail(page)) {
|
||||
- struct page *head;
|
||||
- head = page->first_page;
|
||||
- smp_rmb();
|
||||
- /*
|
||||
- * head may be a dangling pointer.
|
||||
- * __split_huge_page_refcount clears PageTail before
|
||||
- * overwriting first_page, so if PageTail is still
|
||||
- * there it means the head pointer isn't dangling.
|
||||
- */
|
||||
- if (PageTail(page))
|
||||
- return head;
|
||||
- }
|
||||
- return page;
|
||||
-}
|
||||
|
||||
extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
unsigned long addr, pmd_t pmd, pmd_t *pmdp);
|
||||
@@ -205,7 +188,6 @@ static inline int split_huge_page(struct page *page)
|
||||
do { } while (0)
|
||||
#define split_huge_page_pmd_mm(__mm, __address, __pmd) \
|
||||
do { } while (0)
|
||||
-#define compound_trans_head(page) compound_head(page)
|
||||
static inline int hugepage_madvise(struct vm_area_struct *vma,
|
||||
unsigned long *vm_flags, int advice)
|
||||
{
|
||||
diff --git a/include/linux/mm.h b/include/linux/mm.h
|
||||
index 3bf21c3502d0..a9a48309f045 100644
|
||||
--- a/include/linux/mm.h
|
||||
+++ b/include/linux/mm.h
|
||||
@@ -361,8 +361,18 @@ static inline void compound_unlock_irqrestore(struct page *page,
|
||||
|
||||
static inline struct page *compound_head(struct page *page)
|
||||
{
|
||||
- if (unlikely(PageTail(page)))
|
||||
- return page->first_page;
|
||||
+ if (unlikely(PageTail(page))) {
|
||||
+ struct page *head = page->first_page;
|
||||
+
|
||||
+ /*
|
||||
+ * page->first_page may be a dangling pointer to an old
|
||||
+ * compound page, so recheck that it is still a tail
|
||||
+ * page before returning.
|
||||
+ */
|
||||
+ smp_rmb();
|
||||
+ if (likely(PageTail(page)))
|
||||
+ return head;
|
||||
+ }
|
||||
return page;
|
||||
}
|
||||
|
||||
diff --git a/mm/ksm.c b/mm/ksm.c
|
||||
index b6afe0c440d8..784d1e4bc385 100644
|
||||
--- a/mm/ksm.c
|
||||
+++ b/mm/ksm.c
|
||||
@@ -444,7 +444,7 @@ static void break_cow(struct rmap_item *rmap_item)
|
||||
static struct page *page_trans_compound_anon(struct page *page)
|
||||
{
|
||||
if (PageTransCompound(page)) {
|
||||
- struct page *head = compound_trans_head(page);
|
||||
+ struct page *head = compound_head(page);
|
||||
/*
|
||||
* head may actually be splitted and freed from under
|
||||
* us but it's ok here.
|
||||
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
|
||||
index e386beefc994..59c62fa75c5a 100644
|
||||
--- a/mm/memory-failure.c
|
||||
+++ b/mm/memory-failure.c
|
||||
@@ -1544,7 +1544,7 @@ int soft_offline_page(struct page *page, int flags)
|
||||
{
|
||||
int ret;
|
||||
unsigned long pfn = page_to_pfn(page);
|
||||
- struct page *hpage = compound_trans_head(page);
|
||||
+ struct page *hpage = compound_head(page);
|
||||
|
||||
if (PageHWPoison(page)) {
|
||||
pr_info("soft offline: %#lx page already poisoned\n", pfn);
|
||||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
||||
index 2ee0fd313f03..0ab02fb8e9b1 100644
|
||||
--- a/mm/page_alloc.c
|
||||
+++ b/mm/page_alloc.c
|
||||
@@ -360,9 +360,11 @@ void prep_compound_page(struct page *page, unsigned long order)
|
||||
__SetPageHead(page);
|
||||
for (i = 1; i < nr_pages; i++) {
|
||||
struct page *p = page + i;
|
||||
- __SetPageTail(p);
|
||||
set_page_count(p, 0);
|
||||
p->first_page = page;
|
||||
+ /* Make sure p->first_page is always valid for PageTail() */
|
||||
+ smp_wmb();
|
||||
+ __SetPageTail(p);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/mm/swap.c b/mm/swap.c
|
||||
index ea58dbde788e..4e35f3ff0427 100644
|
||||
--- a/mm/swap.c
|
||||
+++ b/mm/swap.c
|
||||
@@ -81,7 +81,7 @@ static void put_compound_page(struct page *page)
|
||||
{
|
||||
if (unlikely(PageTail(page))) {
|
||||
/* __split_huge_page_refcount can run under us */
|
||||
- struct page *page_head = compound_trans_head(page);
|
||||
+ struct page *page_head = compound_head(page);
|
||||
|
||||
if (likely(page != page_head &&
|
||||
get_page_unless_zero(page_head))) {
|
||||
@@ -219,7 +219,7 @@ bool __get_page_tail(struct page *page)
|
||||
*/
|
||||
unsigned long flags;
|
||||
bool got = false;
|
||||
- struct page *page_head = compound_trans_head(page);
|
||||
+ struct page *page_head = compound_head(page);
|
||||
|
||||
if (likely(page != page_head && get_page_unless_zero(page_head))) {
|
||||
/* Ref to put_compound_page() comment. */
|
||||
diff --git a/net/netfilter/nf_conntrack_proto_dccp.c b/net/netfilter/nf_conntrack_proto_dccp.c
|
||||
index a99b6c3427b0..59359bec328a 100644
|
||||
--- a/net/netfilter/nf_conntrack_proto_dccp.c
|
||||
+++ b/net/netfilter/nf_conntrack_proto_dccp.c
|
||||
@@ -428,7 +428,7 @@ static bool dccp_new(struct nf_conn *ct, const struct sk_buff *skb,
|
||||
const char *msg;
|
||||
u_int8_t state;
|
||||
|
||||
- dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &dh);
|
||||
+ dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh);
|
||||
BUG_ON(dh == NULL);
|
||||
|
||||
state = dccp_state_table[CT_DCCP_ROLE_CLIENT][dh->dccph_type][CT_DCCP_NONE];
|
||||
@@ -486,7 +486,7 @@ static int dccp_packet(struct nf_conn *ct, const struct sk_buff *skb,
|
||||
u_int8_t type, old_state, new_state;
|
||||
enum ct_dccp_roles role;
|
||||
|
||||
- dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &dh);
|
||||
+ dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh);
|
||||
BUG_ON(dh == NULL);
|
||||
type = dh->dccph_type;
|
||||
|
||||
@@ -577,7 +577,7 @@ static int dccp_error(struct net *net, struct nf_conn *tmpl,
|
||||
unsigned int cscov;
|
||||
const char *msg;
|
||||
|
||||
- dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &dh);
|
||||
+ dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh);
|
||||
if (dh == NULL) {
|
||||
msg = "nf_ct_dccp: short packet ";
|
||||
goto out_invalid;
|
||||
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
|
||||
index eb99458f5b68..8cf1cd2fadaa 100644
|
||||
--- a/virt/kvm/kvm_main.c
|
||||
+++ b/virt/kvm/kvm_main.c
|
||||
@@ -105,12 +105,12 @@ bool kvm_is_mmio_pfn(pfn_t pfn)
|
||||
if (pfn_valid(pfn)) {
|
||||
int reserved;
|
||||
struct page *tail = pfn_to_page(pfn);
|
||||
- struct page *head = compound_trans_head(tail);
|
||||
+ struct page *head = compound_head(tail);
|
||||
reserved = PageReserved(head);
|
||||
if (head != tail) {
|
||||
/*
|
||||
* "head" is not a dangling pointer
|
||||
- * (compound_trans_head takes care of that)
|
||||
+ * (compound_head takes care of that)
|
||||
* but the hugepage may have been splitted
|
||||
* from under us (and we may not hold a
|
||||
* reference count on the head page so it can
|
1555
projects/Cuboxi/patches/linux/linux-000-patch-3.10.36-37.patch
Normal file
1555
projects/Cuboxi/patches/linux/linux-000-patch-3.10.36-37.patch
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user