summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2013-06-20 20:40:47 -0400
committerAnthony G. Basile <blueness@gentoo.org>2013-06-20 20:40:47 -0400
commit845d88931e05031ae2fad88e07f2614be2f698b8 (patch)
tree7721033842a868a29fcd3c4d6fd0272a8213ab73 /3.2.46/1044_linux-3.2.45.patch
parentAdd 4427_force_XATTR_PAX_tmpfs patch (diff)
downloadhardened-patchset-845d88931e05031ae2fad88e07f2614be2f698b8.tar.gz
hardened-patchset-845d88931e05031ae2fad88e07f2614be2f698b8.tar.bz2
hardened-patchset-845d88931e05031ae2fad88e07f2614be2f698b8.zip
Grsec/PaX: 2.9.1-{2.6.32.61,3.2.47,3.9.6}-20130618203320130618
Diffstat (limited to '3.2.46/1044_linux-3.2.45.patch')
-rw-r--r--3.2.46/1044_linux-3.2.45.patch3809
1 files changed, 0 insertions, 3809 deletions
diff --git a/3.2.46/1044_linux-3.2.45.patch b/3.2.46/1044_linux-3.2.45.patch
deleted file mode 100644
index 44e1767..0000000
--- a/3.2.46/1044_linux-3.2.45.patch
+++ /dev/null
@@ -1,3809 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 566750c..9072fee 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 3
- PATCHLEVEL = 2
--SUBLEVEL = 44
-+SUBLEVEL = 45
- EXTRAVERSION =
- NAME = Saber-toothed Squirrel
-
-diff --git a/arch/arm/mach-u300/include/mach/u300-regs.h b/arch/arm/mach-u300/include/mach/u300-regs.h
-index 035fdc9..a8b71f2 100644
---- a/arch/arm/mach-u300/include/mach/u300-regs.h
-+++ b/arch/arm/mach-u300/include/mach/u300-regs.h
-@@ -102,7 +102,7 @@
-
- #ifdef CONFIG_MACH_U300_BS335
- /* Fast UART1 on U335 only */
--#define U300_UART1_BASE (U300_SLOW_PER_PHYS_BASE+0x7000)
-+#define U300_UART1_BASE (U300_FAST_PER_PHYS_BASE+0x7000)
- #endif
-
- /*
-diff --git a/arch/ia64/include/asm/futex.h b/arch/ia64/include/asm/futex.h
-index 21ab376..1bd14d5 100644
---- a/arch/ia64/include/asm/futex.h
-+++ b/arch/ia64/include/asm/futex.h
-@@ -107,16 +107,15 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
- return -EFAULT;
-
- {
-- register unsigned long r8 __asm ("r8");
-+ register unsigned long r8 __asm ("r8") = 0;
- unsigned long prev;
- __asm__ __volatile__(
- " mf;; \n"
-- " mov %0=r0 \n"
- " mov ar.ccv=%4;; \n"
- "[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n"
- " .xdata4 \"__ex_table\", 1b-., 2f-. \n"
- "[2:]"
-- : "=r" (r8), "=r" (prev)
-+ : "+r" (r8), "=&r" (prev)
- : "r" (uaddr), "r" (newval),
- "rO" ((long) (unsigned) oldval)
- : "memory");
-diff --git a/arch/ia64/include/asm/mca.h b/arch/ia64/include/asm/mca.h
-index 43f96ab..8c70961 100644
---- a/arch/ia64/include/asm/mca.h
-+++ b/arch/ia64/include/asm/mca.h
-@@ -143,6 +143,7 @@ extern unsigned long __per_cpu_mca[NR_CPUS];
- extern int cpe_vector;
- extern int ia64_cpe_irq;
- extern void ia64_mca_init(void);
-+extern void ia64_mca_irq_init(void);
- extern void ia64_mca_cpu_init(void *);
- extern void ia64_os_mca_dispatch(void);
- extern void ia64_os_mca_dispatch_end(void);
-diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c
-index ad69606..f2c41828 100644
---- a/arch/ia64/kernel/irq.c
-+++ b/arch/ia64/kernel/irq.c
-@@ -23,6 +23,8 @@
- #include <linux/interrupt.h>
- #include <linux/kernel_stat.h>
-
-+#include <asm/mca.h>
-+
- /*
- * 'what should we do if we get a hw irq event on an illegal vector'.
- * each architecture has to answer this themselves.
-@@ -83,6 +85,12 @@ bool is_affinity_mask_valid(const struct cpumask *cpumask)
-
- #endif /* CONFIG_SMP */
-
-+int __init arch_early_irq_init(void)
-+{
-+ ia64_mca_irq_init();
-+ return 0;
-+}
-+
- #ifdef CONFIG_HOTPLUG_CPU
- unsigned int vectors_in_migration[NR_IRQS];
-
-diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
-index 84fb405..9b97303 100644
---- a/arch/ia64/kernel/mca.c
-+++ b/arch/ia64/kernel/mca.c
-@@ -2071,22 +2071,16 @@ ia64_mca_init(void)
- printk(KERN_INFO "MCA related initialization done\n");
- }
-
-+
- /*
-- * ia64_mca_late_init
-- *
-- * Opportunity to setup things that require initialization later
-- * than ia64_mca_init. Setup a timer to poll for CPEs if the
-- * platform doesn't support an interrupt driven mechanism.
-- *
-- * Inputs : None
-- * Outputs : Status
-+ * These pieces cannot be done in ia64_mca_init() because it is called before
-+ * early_irq_init() which would wipe out our percpu irq registrations. But we
-+ * cannot leave them until ia64_mca_late_init() because by then all the other
-+ * processors have been brought online and have set their own CMC vectors to
-+ * point at a non-existant action. Called from arch_early_irq_init().
- */
--static int __init
--ia64_mca_late_init(void)
-+void __init ia64_mca_irq_init(void)
- {
-- if (!mca_init)
-- return 0;
--
- /*
- * Configure the CMCI/P vector and handler. Interrupts for CMC are
- * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c).
-@@ -2105,6 +2099,23 @@ ia64_mca_late_init(void)
- /* Setup the CPEI/P handler */
- register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction);
- #endif
-+}
-+
-+/*
-+ * ia64_mca_late_init
-+ *
-+ * Opportunity to setup things that require initialization later
-+ * than ia64_mca_init. Setup a timer to poll for CPEs if the
-+ * platform doesn't support an interrupt driven mechanism.
-+ *
-+ * Inputs : None
-+ * Outputs : Status
-+ */
-+static int __init
-+ia64_mca_late_init(void)
-+{
-+ if (!mca_init)
-+ return 0;
-
- register_hotcpu_notifier(&mca_cpu_notifier);
-
-diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c
-index 4332f7e..a7869f8 100644
---- a/arch/ia64/kvm/vtlb.c
-+++ b/arch/ia64/kvm/vtlb.c
-@@ -256,7 +256,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)
- "srlz.d;;"
- "ssm psr.i;;"
- "srlz.d;;"
-- : "=r"(ret) : "r"(iha), "r"(pte):"memory");
-+ : "=&r"(ret) : "r"(iha), "r"(pte) : "memory");
-
- return ret;
- }
-diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
-index cdf6b3f..2c49227 100644
---- a/arch/powerpc/kernel/head_64.S
-+++ b/arch/powerpc/kernel/head_64.S
-@@ -502,6 +502,7 @@ _GLOBAL(copy_and_flush)
- sync
- addi r5,r5,8
- addi r6,r6,8
-+ isync
- blr
-
- .align 8
-diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
-index b22a83a..24523dc 100644
---- a/arch/powerpc/mm/numa.c
-+++ b/arch/powerpc/mm/numa.c
-@@ -221,7 +221,7 @@ int __node_distance(int a, int b)
- int distance = LOCAL_DISTANCE;
-
- if (!form1_affinity)
-- return distance;
-+ return ((a == b) ? LOCAL_DISTANCE : REMOTE_DISTANCE);
-
- for (i = 0; i < distance_ref_points_depth; i++) {
- if (distance_lookup_table[a][i] == distance_lookup_table[b][i])
-diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
-index e481f6b..70ec4e9 100644
---- a/arch/powerpc/platforms/cell/spufs/inode.c
-+++ b/arch/powerpc/platforms/cell/spufs/inode.c
-@@ -100,6 +100,7 @@ spufs_new_inode(struct super_block *sb, int mode)
- if (!inode)
- goto out;
-
-+ inode->i_ino = get_next_ino();
- inode->i_mode = mode;
- inode->i_uid = current_fsuid();
- inode->i_gid = current_fsgid();
-diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
-index 4f289ff..5aaf0bf 100644
---- a/arch/s390/include/asm/pgtable.h
-+++ b/arch/s390/include/asm/pgtable.h
-@@ -67,6 +67,10 @@ static inline int is_zero_pfn(unsigned long pfn)
-
- #define my_zero_pfn(addr) page_to_pfn(ZERO_PAGE(addr))
-
-+/* TODO: s390 cannot support io_remap_pfn_range... */
-+#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
-+ remap_pfn_range(vma, vaddr, pfn, size, prot)
-+
- #endif /* !__ASSEMBLY__ */
-
- /*
-diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h
-index 38ebb2c..ddbbea3 100644
---- a/arch/sparc/include/asm/pgtable_64.h
-+++ b/arch/sparc/include/asm/pgtable_64.h
-@@ -781,6 +781,7 @@ static inline int io_remap_pfn_range(struct vm_area_struct *vma,
- return remap_pfn_range(vma, from, phys_base >> PAGE_SHIFT, size, prot);
- }
-
-+#include <asm/tlbflush.h>
- #include <asm-generic/pgtable.h>
-
- /* We provide our own get_unmapped_area to cope with VA holes and
-diff --git a/arch/sparc/include/asm/system_64.h b/arch/sparc/include/asm/system_64.h
-index 10bcabc..f856c7f 100644
---- a/arch/sparc/include/asm/system_64.h
-+++ b/arch/sparc/include/asm/system_64.h
-@@ -140,8 +140,7 @@ do { \
- * and 2 stores in this critical code path. -DaveM
- */
- #define switch_to(prev, next, last) \
--do { flush_tlb_pending(); \
-- save_and_clear_fpu(); \
-+do { save_and_clear_fpu(); \
- /* If you are tempted to conditionalize the following */ \
- /* so that ASI is only written if it changes, think again. */ \
- __asm__ __volatile__("wr %%g0, %0, %%asi" \
-diff --git a/arch/sparc/include/asm/tlbflush_64.h b/arch/sparc/include/asm/tlbflush_64.h
-index 2ef4634..f0d6a97 100644
---- a/arch/sparc/include/asm/tlbflush_64.h
-+++ b/arch/sparc/include/asm/tlbflush_64.h
-@@ -11,24 +11,40 @@
- struct tlb_batch {
- struct mm_struct *mm;
- unsigned long tlb_nr;
-+ unsigned long active;
- unsigned long vaddrs[TLB_BATCH_NR];
- };
-
- extern void flush_tsb_kernel_range(unsigned long start, unsigned long end);
- extern void flush_tsb_user(struct tlb_batch *tb);
-+extern void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr);
-
- /* TLB flush operations. */
-
--extern void flush_tlb_pending(void);
-+static inline void flush_tlb_mm(struct mm_struct *mm)
-+{
-+}
-+
-+static inline void flush_tlb_page(struct vm_area_struct *vma,
-+ unsigned long vmaddr)
-+{
-+}
-+
-+static inline void flush_tlb_range(struct vm_area_struct *vma,
-+ unsigned long start, unsigned long end)
-+{
-+}
-+
-+#define __HAVE_ARCH_ENTER_LAZY_MMU_MODE
-
--#define flush_tlb_range(vma,start,end) \
-- do { (void)(start); flush_tlb_pending(); } while (0)
--#define flush_tlb_page(vma,addr) flush_tlb_pending()
--#define flush_tlb_mm(mm) flush_tlb_pending()
-+extern void flush_tlb_pending(void);
-+extern void arch_enter_lazy_mmu_mode(void);
-+extern void arch_leave_lazy_mmu_mode(void);
-+#define arch_flush_lazy_mmu_mode() do {} while (0)
-
- /* Local cpu only. */
- extern void __flush_tlb_all(void);
--
-+extern void __flush_tlb_page(unsigned long context, unsigned long vaddr);
- extern void __flush_tlb_kernel_range(unsigned long start, unsigned long end);
-
- #ifndef CONFIG_SMP
-@@ -38,15 +54,24 @@ do { flush_tsb_kernel_range(start,end); \
- __flush_tlb_kernel_range(start,end); \
- } while (0)
-
-+static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr)
-+{
-+ __flush_tlb_page(CTX_HWBITS(mm->context), vaddr);
-+}
-+
- #else /* CONFIG_SMP */
-
- extern void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end);
-+extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr);
-
- #define flush_tlb_kernel_range(start, end) \
- do { flush_tsb_kernel_range(start,end); \
- smp_flush_tlb_kernel_range(start, end); \
- } while (0)
-
-+#define global_flush_tlb_page(mm, vaddr) \
-+ smp_flush_tlb_page(mm, vaddr)
-+
- #endif /* ! CONFIG_SMP */
-
- #endif /* _SPARC64_TLBFLUSH_H */
-diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
-index 7560772..e21d3c0d 100644
---- a/arch/sparc/kernel/smp_64.c
-+++ b/arch/sparc/kernel/smp_64.c
-@@ -856,7 +856,7 @@ void smp_tsb_sync(struct mm_struct *mm)
- }
-
- extern unsigned long xcall_flush_tlb_mm;
--extern unsigned long xcall_flush_tlb_pending;
-+extern unsigned long xcall_flush_tlb_page;
- extern unsigned long xcall_flush_tlb_kernel_range;
- extern unsigned long xcall_fetch_glob_regs;
- extern unsigned long xcall_receive_signal;
-@@ -1070,23 +1070,56 @@ local_flush_and_out:
- put_cpu();
- }
-
-+struct tlb_pending_info {
-+ unsigned long ctx;
-+ unsigned long nr;
-+ unsigned long *vaddrs;
-+};
-+
-+static void tlb_pending_func(void *info)
-+{
-+ struct tlb_pending_info *t = info;
-+
-+ __flush_tlb_pending(t->ctx, t->nr, t->vaddrs);
-+}
-+
- void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long *vaddrs)
- {
- u32 ctx = CTX_HWBITS(mm->context);
-+ struct tlb_pending_info info;
- int cpu = get_cpu();
-
-+ info.ctx = ctx;
-+ info.nr = nr;
-+ info.vaddrs = vaddrs;
-+
- if (mm == current->mm && atomic_read(&mm->mm_users) == 1)
- cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
- else
-- smp_cross_call_masked(&xcall_flush_tlb_pending,
-- ctx, nr, (unsigned long) vaddrs,
-- mm_cpumask(mm));
-+ smp_call_function_many(mm_cpumask(mm), tlb_pending_func,
-+ &info, 1);
-
- __flush_tlb_pending(ctx, nr, vaddrs);
-
- put_cpu();
- }
-
-+void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr)
-+{
-+ unsigned long context = CTX_HWBITS(mm->context);
-+ int cpu = get_cpu();
-+
-+ if (mm == current->mm && atomic_read(&mm->mm_users) == 1)
-+ cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
-+ else
-+ smp_cross_call_masked(&xcall_flush_tlb_page,
-+ context, vaddr, 0,
-+ mm_cpumask(mm));
-+ __flush_tlb_page(context, vaddr);
-+
-+ put_cpu();
-+}
-+
- void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end)
- {
- start &= PAGE_MASK;
-diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c
-index b1f279c..afd021e 100644
---- a/arch/sparc/mm/tlb.c
-+++ b/arch/sparc/mm/tlb.c
-@@ -24,11 +24,17 @@ static DEFINE_PER_CPU(struct tlb_batch, tlb_batch);
- void flush_tlb_pending(void)
- {
- struct tlb_batch *tb = &get_cpu_var(tlb_batch);
-+ struct mm_struct *mm = tb->mm;
-
-- if (tb->tlb_nr) {
-- flush_tsb_user(tb);
-+ if (!tb->tlb_nr)
-+ goto out;
-
-- if (CTX_VALID(tb->mm->context)) {
-+ flush_tsb_user(tb);
-+
-+ if (CTX_VALID(mm->context)) {
-+ if (tb->tlb_nr == 1) {
-+ global_flush_tlb_page(mm, tb->vaddrs[0]);
-+ } else {
- #ifdef CONFIG_SMP
- smp_flush_tlb_pending(tb->mm, tb->tlb_nr,
- &tb->vaddrs[0]);
-@@ -37,12 +43,30 @@ void flush_tlb_pending(void)
- tb->tlb_nr, &tb->vaddrs[0]);
- #endif
- }
-- tb->tlb_nr = 0;
- }
-
-+ tb->tlb_nr = 0;
-+
-+out:
- put_cpu_var(tlb_batch);
- }
-
-+void arch_enter_lazy_mmu_mode(void)
-+{
-+ struct tlb_batch *tb = &__get_cpu_var(tlb_batch);
-+
-+ tb->active = 1;
-+}
-+
-+void arch_leave_lazy_mmu_mode(void)
-+{
-+ struct tlb_batch *tb = &__get_cpu_var(tlb_batch);
-+
-+ if (tb->tlb_nr)
-+ flush_tlb_pending();
-+ tb->active = 0;
-+}
-+
- void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr,
- pte_t *ptep, pte_t orig, int fullmm)
- {
-@@ -90,6 +114,12 @@ no_cache_flush:
- nr = 0;
- }
-
-+ if (!tb->active) {
-+ global_flush_tlb_page(mm, vaddr);
-+ flush_tsb_user_page(mm, vaddr);
-+ goto out;
-+ }
-+
- if (nr == 0)
- tb->mm = mm;
-
-@@ -98,5 +128,6 @@ no_cache_flush:
- if (nr >= TLB_BATCH_NR)
- flush_tlb_pending();
-
-+out:
- put_cpu_var(tlb_batch);
- }
-diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c
-index 536412d..3ebcac7 100644
---- a/arch/sparc/mm/tsb.c
-+++ b/arch/sparc/mm/tsb.c
-@@ -8,11 +8,10 @@
- #include <linux/slab.h>
- #include <asm/system.h>
- #include <asm/page.h>
--#include <asm/tlbflush.h>
--#include <asm/tlb.h>
--#include <asm/mmu_context.h>
- #include <asm/pgtable.h>
-+#include <asm/mmu_context.h>
- #include <asm/tsb.h>
-+#include <asm/tlb.h>
- #include <asm/oplib.h>
-
- extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES];
-@@ -47,23 +46,27 @@ void flush_tsb_kernel_range(unsigned long start, unsigned long end)
- }
- }
-
--static void __flush_tsb_one(struct tlb_batch *tb, unsigned long hash_shift,
-- unsigned long tsb, unsigned long nentries)
-+static void __flush_tsb_one_entry(unsigned long tsb, unsigned long v,
-+ unsigned long hash_shift,
-+ unsigned long nentries)
- {
-- unsigned long i;
-+ unsigned long tag, ent, hash;
-
-- for (i = 0; i < tb->tlb_nr; i++) {
-- unsigned long v = tb->vaddrs[i];
-- unsigned long tag, ent, hash;
-+ v &= ~0x1UL;
-+ hash = tsb_hash(v, hash_shift, nentries);
-+ ent = tsb + (hash * sizeof(struct tsb));
-+ tag = (v >> 22UL);
-
-- v &= ~0x1UL;
-+ tsb_flush(ent, tag);
-+}
-
-- hash = tsb_hash(v, hash_shift, nentries);
-- ent = tsb + (hash * sizeof(struct tsb));
-- tag = (v >> 22UL);
-+static void __flush_tsb_one(struct tlb_batch *tb, unsigned long hash_shift,
-+ unsigned long tsb, unsigned long nentries)
-+{
-+ unsigned long i;
-
-- tsb_flush(ent, tag);
-- }
-+ for (i = 0; i < tb->tlb_nr; i++)
-+ __flush_tsb_one_entry(tsb, tb->vaddrs[i], hash_shift, nentries);
- }
-
- void flush_tsb_user(struct tlb_batch *tb)
-@@ -91,6 +94,30 @@ void flush_tsb_user(struct tlb_batch *tb)
- spin_unlock_irqrestore(&mm->context.lock, flags);
- }
-
-+void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr)
-+{
-+ unsigned long nentries, base, flags;
-+
-+ spin_lock_irqsave(&mm->context.lock, flags);
-+
-+ base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb;
-+ nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries;
-+ if (tlb_type == cheetah_plus || tlb_type == hypervisor)
-+ base = __pa(base);
-+ __flush_tsb_one_entry(base, vaddr, PAGE_SHIFT, nentries);
-+
-+#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
-+ if (mm->context.tsb_block[MM_TSB_HUGE].tsb) {
-+ base = (unsigned long) mm->context.tsb_block[MM_TSB_HUGE].tsb;
-+ nentries = mm->context.tsb_block[MM_TSB_HUGE].tsb_nentries;
-+ if (tlb_type == cheetah_plus || tlb_type == hypervisor)
-+ base = __pa(base);
-+ __flush_tsb_one_entry(base, vaddr, HPAGE_SHIFT, nentries);
-+ }
-+#endif
-+ spin_unlock_irqrestore(&mm->context.lock, flags);
-+}
-+
- #if defined(CONFIG_SPARC64_PAGE_SIZE_8KB)
- #define HV_PGSZ_IDX_BASE HV_PGSZ_IDX_8K
- #define HV_PGSZ_MASK_BASE HV_PGSZ_MASK_8K
-diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S
-index 874162a..dd10caa 100644
---- a/arch/sparc/mm/ultra.S
-+++ b/arch/sparc/mm/ultra.S
-@@ -53,6 +53,33 @@ __flush_tlb_mm: /* 18 insns */
- nop
-
- .align 32
-+ .globl __flush_tlb_page
-+__flush_tlb_page: /* 22 insns */
-+ /* %o0 = context, %o1 = vaddr */
-+ rdpr %pstate, %g7
-+ andn %g7, PSTATE_IE, %g2
-+ wrpr %g2, %pstate
-+ mov SECONDARY_CONTEXT, %o4
-+ ldxa [%o4] ASI_DMMU, %g2
-+ stxa %o0, [%o4] ASI_DMMU
-+ andcc %o1, 1, %g0
-+ andn %o1, 1, %o3
-+ be,pn %icc, 1f
-+ or %o3, 0x10, %o3
-+ stxa %g0, [%o3] ASI_IMMU_DEMAP
-+1: stxa %g0, [%o3] ASI_DMMU_DEMAP
-+ membar #Sync
-+ stxa %g2, [%o4] ASI_DMMU
-+ sethi %hi(KERNBASE), %o4
-+ flush %o4
-+ retl
-+ wrpr %g7, 0x0, %pstate
-+ nop
-+ nop
-+ nop
-+ nop
-+
-+ .align 32
- .globl __flush_tlb_pending
- __flush_tlb_pending: /* 26 insns */
- /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
-@@ -203,6 +230,31 @@ __cheetah_flush_tlb_mm: /* 19 insns */
- retl
- wrpr %g7, 0x0, %pstate
-
-+__cheetah_flush_tlb_page: /* 22 insns */
-+ /* %o0 = context, %o1 = vaddr */
-+ rdpr %pstate, %g7
-+ andn %g7, PSTATE_IE, %g2
-+ wrpr %g2, 0x0, %pstate
-+ wrpr %g0, 1, %tl
-+ mov PRIMARY_CONTEXT, %o4
-+ ldxa [%o4] ASI_DMMU, %g2
-+ srlx %g2, CTX_PGSZ1_NUC_SHIFT, %o3
-+ sllx %o3, CTX_PGSZ1_NUC_SHIFT, %o3
-+ or %o0, %o3, %o0 /* Preserve nucleus page size fields */
-+ stxa %o0, [%o4] ASI_DMMU
-+ andcc %o1, 1, %g0
-+ be,pn %icc, 1f
-+ andn %o1, 1, %o3
-+ stxa %g0, [%o3] ASI_IMMU_DEMAP
-+1: stxa %g0, [%o3] ASI_DMMU_DEMAP
-+ membar #Sync
-+ stxa %g2, [%o4] ASI_DMMU
-+ sethi %hi(KERNBASE), %o4
-+ flush %o4
-+ wrpr %g0, 0, %tl
-+ retl
-+ wrpr %g7, 0x0, %pstate
-+
- __cheetah_flush_tlb_pending: /* 27 insns */
- /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
- rdpr %pstate, %g7
-@@ -269,6 +321,20 @@ __hypervisor_flush_tlb_mm: /* 10 insns */
- retl
- nop
-
-+__hypervisor_flush_tlb_page: /* 11 insns */
-+ /* %o0 = context, %o1 = vaddr */
-+ mov %o0, %g2
-+ mov %o1, %o0 /* ARG0: vaddr + IMMU-bit */
-+ mov %g2, %o1 /* ARG1: mmu context */
-+ mov HV_MMU_ALL, %o2 /* ARG2: flags */
-+ srlx %o0, PAGE_SHIFT, %o0
-+ sllx %o0, PAGE_SHIFT, %o0
-+ ta HV_MMU_UNMAP_ADDR_TRAP
-+ brnz,pn %o0, __hypervisor_tlb_tl0_error
-+ mov HV_MMU_UNMAP_ADDR_TRAP, %o1
-+ retl
-+ nop
-+
- __hypervisor_flush_tlb_pending: /* 16 insns */
- /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
- sllx %o1, 3, %g1
-@@ -339,6 +405,13 @@ cheetah_patch_cachetlbops:
- call tlb_patch_one
- mov 19, %o2
-
-+ sethi %hi(__flush_tlb_page), %o0
-+ or %o0, %lo(__flush_tlb_page), %o0
-+ sethi %hi(__cheetah_flush_tlb_page), %o1
-+ or %o1, %lo(__cheetah_flush_tlb_page), %o1
-+ call tlb_patch_one
-+ mov 22, %o2
-+
- sethi %hi(__flush_tlb_pending), %o0
- or %o0, %lo(__flush_tlb_pending), %o0
- sethi %hi(__cheetah_flush_tlb_pending), %o1
-@@ -397,10 +470,9 @@ xcall_flush_tlb_mm: /* 21 insns */
- nop
- nop
-
-- .globl xcall_flush_tlb_pending
--xcall_flush_tlb_pending: /* 21 insns */
-- /* %g5=context, %g1=nr, %g7=vaddrs[] */
-- sllx %g1, 3, %g1
-+ .globl xcall_flush_tlb_page
-+xcall_flush_tlb_page: /* 17 insns */
-+ /* %g5=context, %g1=vaddr */
- mov PRIMARY_CONTEXT, %g4
- ldxa [%g4] ASI_DMMU, %g2
- srlx %g2, CTX_PGSZ1_NUC_SHIFT, %g4
-@@ -408,20 +480,16 @@ xcall_flush_tlb_pending: /* 21 insns */
- or %g5, %g4, %g5
- mov PRIMARY_CONTEXT, %g4
- stxa %g5, [%g4] ASI_DMMU
--1: sub %g1, (1 << 3), %g1
-- ldx [%g7 + %g1], %g5
-- andcc %g5, 0x1, %g0
-+ andcc %g1, 0x1, %g0
- be,pn %icc, 2f
--
-- andn %g5, 0x1, %g5
-+ andn %g1, 0x1, %g5
- stxa %g0, [%g5] ASI_IMMU_DEMAP
- 2: stxa %g0, [%g5] ASI_DMMU_DEMAP
- membar #Sync
-- brnz,pt %g1, 1b
-- nop
- stxa %g2, [%g4] ASI_DMMU
- retry
- nop
-+ nop
-
- .globl xcall_flush_tlb_kernel_range
- xcall_flush_tlb_kernel_range: /* 25 insns */
-@@ -596,15 +664,13 @@ __hypervisor_xcall_flush_tlb_mm: /* 21 insns */
- membar #Sync
- retry
-
-- .globl __hypervisor_xcall_flush_tlb_pending
--__hypervisor_xcall_flush_tlb_pending: /* 21 insns */
-- /* %g5=ctx, %g1=nr, %g7=vaddrs[], %g2,%g3,%g4,g6=scratch */
-- sllx %g1, 3, %g1
-+ .globl __hypervisor_xcall_flush_tlb_page
-+__hypervisor_xcall_flush_tlb_page: /* 17 insns */
-+ /* %g5=ctx, %g1=vaddr */
- mov %o0, %g2
- mov %o1, %g3
- mov %o2, %g4
--1: sub %g1, (1 << 3), %g1
-- ldx [%g7 + %g1], %o0 /* ARG0: virtual address */
-+ mov %g1, %o0 /* ARG0: virtual address */
- mov %g5, %o1 /* ARG1: mmu context */
- mov HV_MMU_ALL, %o2 /* ARG2: flags */
- srlx %o0, PAGE_SHIFT, %o0
-@@ -613,8 +679,6 @@ __hypervisor_xcall_flush_tlb_pending: /* 21 insns */
- mov HV_MMU_UNMAP_ADDR_TRAP, %g6
- brnz,a,pn %o0, __hypervisor_tlb_xcall_error
- mov %o0, %g5
-- brnz,pt %g1, 1b
-- nop
- mov %g2, %o0
- mov %g3, %o1
- mov %g4, %o2
-@@ -697,6 +761,13 @@ hypervisor_patch_cachetlbops:
- call tlb_patch_one
- mov 10, %o2
-
-+ sethi %hi(__flush_tlb_page), %o0
-+ or %o0, %lo(__flush_tlb_page), %o0
-+ sethi %hi(__hypervisor_flush_tlb_page), %o1
-+ or %o1, %lo(__hypervisor_flush_tlb_page), %o1
-+ call tlb_patch_one
-+ mov 11, %o2
-+
- sethi %hi(__flush_tlb_pending), %o0
- or %o0, %lo(__flush_tlb_pending), %o0
- sethi %hi(__hypervisor_flush_tlb_pending), %o1
-@@ -728,12 +799,12 @@ hypervisor_patch_cachetlbops:
- call tlb_patch_one
- mov 21, %o2
-
-- sethi %hi(xcall_flush_tlb_pending), %o0
-- or %o0, %lo(xcall_flush_tlb_pending), %o0
-- sethi %hi(__hypervisor_xcall_flush_tlb_pending), %o1
-- or %o1, %lo(__hypervisor_xcall_flush_tlb_pending), %o1
-+ sethi %hi(xcall_flush_tlb_page), %o0
-+ or %o0, %lo(xcall_flush_tlb_page), %o0
-+ sethi %hi(__hypervisor_xcall_flush_tlb_page), %o1
-+ or %o1, %lo(__hypervisor_xcall_flush_tlb_page), %o1
- call tlb_patch_one
-- mov 21, %o2
-+ mov 17, %o2
-
- sethi %hi(xcall_flush_tlb_kernel_range), %o0
- or %o0, %lo(xcall_flush_tlb_kernel_range), %o0
-diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
-index 957c216..4bb12f7 100644
---- a/arch/x86/kernel/cpu/perf_event_intel.c
-+++ b/arch/x86/kernel/cpu/perf_event_intel.c
-@@ -130,8 +130,14 @@ static struct event_constraint intel_gen_event_constraints[] __read_mostly =
- };
-
- static struct extra_reg intel_snb_extra_regs[] __read_mostly = {
-- INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffffffffull, RSP_0),
-- INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffffffffull, RSP_1),
-+ INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0),
-+ INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3f807f8fffull, RSP_1),
-+ EVENT_EXTRA_END
-+};
-+
-+static struct extra_reg intel_snbep_extra_regs[] __read_mostly = {
-+ INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0),
-+ INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1),
- EVENT_EXTRA_END
- };
-
-@@ -1711,7 +1717,10 @@ __init int intel_pmu_init(void)
-
- x86_pmu.event_constraints = intel_snb_event_constraints;
- x86_pmu.pebs_constraints = intel_snb_pebs_event_constraints;
-- x86_pmu.extra_regs = intel_snb_extra_regs;
-+ if (boot_cpu_data.x86_model == 45)
-+ x86_pmu.extra_regs = intel_snbep_extra_regs;
-+ else
-+ x86_pmu.extra_regs = intel_snb_extra_regs;
- /* all extra regs are per-cpu when HT is on */
- x86_pmu.er_flags |= ERF_HAS_RSP_1;
- x86_pmu.er_flags |= ERF_NO_HT_SHARING;
-diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
-index 34a7f40..a4cca06 100644
---- a/arch/x86/mm/init.c
-+++ b/arch/x86/mm/init.c
-@@ -44,11 +44,15 @@ static void __init find_early_table_space(struct map_range *mr, int nr_range)
- int i;
- unsigned long puds = 0, pmds = 0, ptes = 0, tables;
- unsigned long start = 0, good_end;
-+ unsigned long pgd_extra = 0;
- phys_addr_t base;
-
- for (i = 0; i < nr_range; i++) {
- unsigned long range, extra;
-
-+ if ((mr[i].end >> PGDIR_SHIFT) - (mr[i].start >> PGDIR_SHIFT))
-+ pgd_extra++;
-+
- range = mr[i].end - mr[i].start;
- puds += (range + PUD_SIZE - 1) >> PUD_SHIFT;
-
-@@ -73,6 +77,7 @@ static void __init find_early_table_space(struct map_range *mr, int nr_range)
- tables = roundup(puds * sizeof(pud_t), PAGE_SIZE);
- tables += roundup(pmds * sizeof(pmd_t), PAGE_SIZE);
- tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE);
-+ tables += (pgd_extra * PAGE_SIZE);
-
- #ifdef CONFIG_X86_32
- /* for fixmap */
-diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
-index 69b9ef6..044f5d9 100644
---- a/arch/x86/xen/enlighten.c
-+++ b/arch/x86/xen/enlighten.c
-@@ -1391,8 +1391,11 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self,
- switch (action) {
- case CPU_UP_PREPARE:
- xen_vcpu_setup(cpu);
-- if (xen_have_vector_callback)
-+ if (xen_have_vector_callback) {
- xen_init_lock_cpu(cpu);
-+ if (xen_feature(XENFEAT_hvm_safe_pvclock))
-+ xen_setup_timer(cpu);
-+ }
- break;
- default:
- break;
-diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
-index 9a23fff..6e4d5dc 100644
---- a/arch/x86/xen/smp.c
-+++ b/arch/x86/xen/smp.c
-@@ -563,6 +563,8 @@ static void xen_hvm_cpu_die(unsigned int cpu)
- unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL);
- unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL);
- unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL);
-+ xen_uninit_lock_cpu(cpu);
-+ xen_teardown_timer(cpu);
- native_cpu_die(cpu);
- }
-
-diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
-index 0296a95..054cc01 100644
---- a/arch/x86/xen/time.c
-+++ b/arch/x86/xen/time.c
-@@ -497,7 +497,11 @@ static void xen_hvm_setup_cpu_clockevents(void)
- {
- int cpu = smp_processor_id();
- xen_setup_runstate_info(cpu);
-- xen_setup_timer(cpu);
-+ /*
-+ * xen_setup_timer(cpu) - snprintf is bad in atomic context. Hence
-+ * doing it xen_hvm_cpu_notify (which gets called by smp_init during
-+ * early bootup and also during CPU hotplug events).
-+ */
- xen_setup_cpu_clockevents();
- }
-
-diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
-index ef5356c..0262210 100644
---- a/crypto/algif_hash.c
-+++ b/crypto/algif_hash.c
-@@ -161,6 +161,8 @@ static int hash_recvmsg(struct kiocb *unused, struct socket *sock,
- else if (len < ds)
- msg->msg_flags |= MSG_TRUNC;
-
-+ msg->msg_namelen = 0;
-+
- lock_sock(sk);
- if (ctx->more) {
- ctx->more = 0;
-diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
-index 6a6dfc0..a1c4f0a 100644
---- a/crypto/algif_skcipher.c
-+++ b/crypto/algif_skcipher.c
-@@ -432,6 +432,7 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock,
- long copied = 0;
-
- lock_sock(sk);
-+ msg->msg_namelen = 0;
- for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0;
- iovlen--, iov++) {
- unsigned long seglen = iov->iov_len;
-diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
-index 7aff631..5b0f075 100644
---- a/drivers/acpi/pci_root.c
-+++ b/drivers/acpi/pci_root.c
-@@ -247,8 +247,8 @@ static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root,
- *control &= OSC_PCI_CONTROL_MASKS;
- capbuf[OSC_CONTROL_TYPE] = *control | root->osc_control_set;
- } else {
-- /* Run _OSC query for all possible controls. */
-- capbuf[OSC_CONTROL_TYPE] = OSC_PCI_CONTROL_MASKS;
-+ /* Run _OSC query only with existing controls. */
-+ capbuf[OSC_CONTROL_TYPE] = root->osc_control_set;
- }
-
- status = acpi_pci_run_osc(root->device->handle, capbuf, &result);
-diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
-index 0833896..14d49e4 100644
---- a/drivers/char/hpet.c
-+++ b/drivers/char/hpet.c
-@@ -374,26 +374,14 @@ static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
- struct hpet_dev *devp;
- unsigned long addr;
-
-- if (((vma->vm_end - vma->vm_start) != PAGE_SIZE) || vma->vm_pgoff)
-- return -EINVAL;
--
- devp = file->private_data;
- addr = devp->hd_hpets->hp_hpet_phys;
-
- if (addr & (PAGE_SIZE - 1))
- return -ENOSYS;
-
-- vma->vm_flags |= VM_IO;
- vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
--
-- if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT,
-- PAGE_SIZE, vma->vm_page_prot)) {
-- printk(KERN_ERR "%s: io_remap_pfn_range failed\n",
-- __func__);
-- return -EAGAIN;
-- }
--
-- return 0;
-+ return vm_iomap_memory(vma, addr, PAGE_SIZE);
- #else
- return -ENOSYS;
- #endif
-diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
-index ca67338..c77fc67 100644
---- a/drivers/gpu/drm/i915/i915_dma.c
-+++ b/drivers/gpu/drm/i915/i915_dma.c
-@@ -1007,56 +1007,50 @@ intel_teardown_mchbar(struct drm_device *dev)
- release_resource(&dev_priv->mch_res);
- }
-
--#define PTE_ADDRESS_MASK 0xfffff000
--#define PTE_ADDRESS_MASK_HIGH 0x000000f0 /* i915+ */
--#define PTE_MAPPING_TYPE_UNCACHED (0 << 1)
--#define PTE_MAPPING_TYPE_DCACHE (1 << 1) /* i830 only */
--#define PTE_MAPPING_TYPE_CACHED (3 << 1)
--#define PTE_MAPPING_TYPE_MASK (3 << 1)
--#define PTE_VALID (1 << 0)
--
--/**
-- * i915_stolen_to_phys - take an offset into stolen memory and turn it into
-- * a physical one
-- * @dev: drm device
-- * @offset: address to translate
-- *
-- * Some chip functions require allocations from stolen space and need the
-- * physical address of the memory in question.
-- */
--static unsigned long i915_stolen_to_phys(struct drm_device *dev, u32 offset)
-+static unsigned long i915_stolen_to_physical(struct drm_device *dev)
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
- struct pci_dev *pdev = dev_priv->bridge_dev;
- u32 base;
-
--#if 0
- /* On the machines I have tested the Graphics Base of Stolen Memory
-- * is unreliable, so compute the base by subtracting the stolen memory
-- * from the Top of Low Usable DRAM which is where the BIOS places
-- * the graphics stolen memory.
-+ * is unreliable, so on those compute the base by subtracting the
-+ * stolen memory from the Top of Low Usable DRAM which is where the
-+ * BIOS places the graphics stolen memory.
-+ *
-+ * On gen2, the layout is slightly different with the Graphics Segment
-+ * immediately following Top of Memory (or Top of Usable DRAM). Note
-+ * it appears that TOUD is only reported by 865g, so we just use the
-+ * top of memory as determined by the e820 probe.
-+ *
-+ * XXX gen2 requires an unavailable symbol and 945gm fails with
-+ * its value of TOLUD.
- */
-- if (INTEL_INFO(dev)->gen > 3 || IS_G33(dev)) {
-- /* top 32bits are reserved = 0 */
-+ base = 0;
-+ if (INTEL_INFO(dev)->gen >= 6) {
-+ /* Read Base Data of Stolen Memory Register (BDSM) directly.
-+ * Note that there is also a MCHBAR miror at 0x1080c0 or
-+ * we could use device 2:0x5c instead.
-+ */
-+ pci_read_config_dword(pdev, 0xB0, &base);
-+ base &= ~4095; /* lower bits used for locking register */
-+ } else if (INTEL_INFO(dev)->gen > 3 || IS_G33(dev)) {
-+ /* Read Graphics Base of Stolen Memory directly */
- pci_read_config_dword(pdev, 0xA4, &base);
-- } else {
-- /* XXX presume 8xx is the same as i915 */
-- pci_bus_read_config_dword(pdev->bus, 2, 0x5C, &base);
-- }
--#else
-- if (INTEL_INFO(dev)->gen > 3 || IS_G33(dev)) {
-- u16 val;
-- pci_read_config_word(pdev, 0xb0, &val);
-- base = val >> 4 << 20;
-- } else {
-+#if 0
-+ } else if (IS_GEN3(dev)) {
- u8 val;
-+ /* Stolen is immediately below Top of Low Usable DRAM */
- pci_read_config_byte(pdev, 0x9c, &val);
- base = val >> 3 << 27;
-- }
-- base -= dev_priv->mm.gtt->stolen_size;
-+ base -= dev_priv->mm.gtt->stolen_size;
-+ } else {
-+ /* Stolen is immediately above Top of Memory */
-+ base = max_low_pfn_mapped << PAGE_SHIFT;
- #endif
-+ }
-
-- return base + offset;
-+ return base;
- }
-
- static void i915_warn_stolen(struct drm_device *dev)
-@@ -1081,7 +1075,7 @@ static void i915_setup_compression(struct drm_device *dev, int size)
- if (!compressed_fb)
- goto err;
-
-- cfb_base = i915_stolen_to_phys(dev, compressed_fb->start);
-+ cfb_base = dev_priv->mm.stolen_base + compressed_fb->start;
- if (!cfb_base)
- goto err_fb;
-
-@@ -1094,7 +1088,7 @@ static void i915_setup_compression(struct drm_device *dev, int size)
- if (!compressed_llb)
- goto err_fb;
-
-- ll_base = i915_stolen_to_phys(dev, compressed_llb->start);
-+ ll_base = dev_priv->mm.stolen_base + compressed_llb->start;
- if (!ll_base)
- goto err_llb;
- }
-@@ -1113,7 +1107,7 @@ static void i915_setup_compression(struct drm_device *dev, int size)
- }
-
- DRM_DEBUG_KMS("FBC base 0x%08lx, ll base 0x%08lx, size %dM\n",
-- cfb_base, ll_base, size >> 20);
-+ (long)cfb_base, (long)ll_base, size >> 20);
- return;
-
- err_llb:
-@@ -1187,6 +1181,13 @@ static int i915_load_gem_init(struct drm_device *dev)
- gtt_size = dev_priv->mm.gtt->gtt_total_entries << PAGE_SHIFT;
- mappable_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT;
-
-+ dev_priv->mm.stolen_base = i915_stolen_to_physical(dev);
-+ if (dev_priv->mm.stolen_base == 0)
-+ return 0;
-+
-+ DRM_DEBUG_KMS("found %d bytes of stolen memory at %08lx\n",
-+ dev_priv->mm.gtt->stolen_size, dev_priv->mm.stolen_base);
-+
- /* Basic memrange allocator for stolen space */
- drm_mm_init(&dev_priv->mm.stolen, 0, prealloc_size);
-
-diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
-index 144d37c..20cd295 100644
---- a/drivers/gpu/drm/i915/i915_drv.h
-+++ b/drivers/gpu/drm/i915/i915_drv.h
-@@ -581,6 +581,7 @@ typedef struct drm_i915_private {
- unsigned long gtt_start;
- unsigned long gtt_mappable_end;
- unsigned long gtt_end;
-+ unsigned long stolen_base; /* limited to low memory (32-bit) */
-
- struct io_mapping *gtt_mapping;
- int gtt_mtrr;
-diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
-index b0186b8..2865b44 100644
---- a/drivers/gpu/drm/i915/i915_gem.c
-+++ b/drivers/gpu/drm/i915/i915_gem.c
-@@ -2520,6 +2520,11 @@ i915_find_fence_reg(struct drm_device *dev,
- return avail;
- }
-
-+static void i915_gem_write_fence__ipi(void *data)
-+{
-+ wbinvd();
-+}
-+
- /**
- * i915_gem_object_get_fence - set up a fence reg for an object
- * @obj: object to map through a fence reg
-@@ -2640,6 +2645,17 @@ update:
- switch (INTEL_INFO(dev)->gen) {
- case 7:
- case 6:
-+ /* In order to fully serialize access to the fenced region and
-+ * the update to the fence register we need to take extreme
-+ * measures on SNB+. In theory, the write to the fence register
-+ * flushes all memory transactions before, and coupled with the
-+ * mb() placed around the register write we serialise all memory
-+ * operations with respect to the changes in the tiler. Yet, on
-+ * SNB+ we need to take a step further and emit an explicit wbinvd()
-+ * on each processor in order to manually flush all memory
-+ * transactions before updating the fence register.
-+ */
-+ on_each_cpu(i915_gem_write_fence__ipi, NULL, 1);
- ret = sandybridge_write_fence_reg(obj, pipelined);
- break;
- case 5:
-diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index 897ca06..cfbb893 100644
---- a/drivers/gpu/drm/i915/intel_display.c
-+++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -9093,6 +9093,9 @@ void intel_modeset_cleanup(struct drm_device *dev)
- del_timer_sync(&dev_priv->idle_timer);
- cancel_work_sync(&dev_priv->idle_work);
-
-+ /* destroy backlight, if any, before the connectors */
-+ intel_panel_destroy_backlight(dev);
-+
- drm_mode_config_cleanup(dev);
- }
-
-diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
-index c8ecaab..a07ccab 100644
---- a/drivers/gpu/drm/i915/intel_dp.c
-+++ b/drivers/gpu/drm/i915/intel_dp.c
-@@ -2274,11 +2274,6 @@ done:
- static void
- intel_dp_destroy(struct drm_connector *connector)
- {
-- struct drm_device *dev = connector->dev;
--
-- if (intel_dpd_is_edp(dev))
-- intel_panel_destroy_backlight(dev);
--
- drm_sysfs_connector_remove(connector);
- drm_connector_cleanup(connector);
- kfree(connector);
-diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
-index 6eda1b5..8ac91b8 100644
---- a/drivers/gpu/drm/i915/intel_dvo.c
-+++ b/drivers/gpu/drm/i915/intel_dvo.c
-@@ -371,6 +371,7 @@ void intel_dvo_init(struct drm_device *dev)
- const struct intel_dvo_device *dvo = &intel_dvo_devices[i];
- struct i2c_adapter *i2c;
- int gpio;
-+ bool dvoinit;
-
- /* Allow the I2C driver info to specify the GPIO to be used in
- * special cases, but otherwise default to what's defined
-@@ -390,7 +391,17 @@ void intel_dvo_init(struct drm_device *dev)
- i2c = &dev_priv->gmbus[gpio].adapter;
-
- intel_dvo->dev = *dvo;
-- if (!dvo->dev_ops->init(&intel_dvo->dev, i2c))
-+
-+ /* GMBUS NAK handling seems to be unstable, hence let the
-+ * transmitter detection run in bit banging mode for now.
-+ */
-+ intel_gmbus_force_bit(i2c, true);
-+
-+ dvoinit = dvo->dev_ops->init(&intel_dvo->dev, i2c);
-+
-+ intel_gmbus_force_bit(i2c, false);
-+
-+ if (!dvoinit)
- continue;
-
- intel_encoder->type = INTEL_OUTPUT_DVO;
-diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
-index 6601d21..876bac0 100644
---- a/drivers/gpu/drm/i915/intel_lvds.c
-+++ b/drivers/gpu/drm/i915/intel_lvds.c
-@@ -553,8 +553,6 @@ static void intel_lvds_destroy(struct drm_connector *connector)
- struct drm_device *dev = connector->dev;
- struct drm_i915_private *dev_priv = dev->dev_private;
-
-- intel_panel_destroy_backlight(dev);
--
- if (dev_priv->lid_notifier.notifier_call)
- acpi_lid_notifier_unregister(&dev_priv->lid_notifier);
- drm_sysfs_connector_remove(connector);
-@@ -788,6 +786,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
- DMI_MATCH(DMI_PRODUCT_NAME, "X7SPA-H"),
- },
- },
-+ {
-+ .callback = intel_no_lvds_dmi_callback,
-+ .ident = "Fujitsu Esprimo Q900",
-+ .matches = {
-+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
-+ DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Q900"),
-+ },
-+ },
-
- { } /* terminating entry */
- };
-diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
-index 72b8949..04cb34a 100644
---- a/drivers/gpu/drm/i915/intel_panel.c
-+++ b/drivers/gpu/drm/i915/intel_panel.c
-@@ -361,6 +361,9 @@ int intel_panel_setup_backlight(struct drm_device *dev)
-
- intel_panel_init_backlight(dev);
-
-+ if (WARN_ON(dev_priv->backlight))
-+ return -ENODEV;
-+
- if (dev_priv->int_lvds_connector)
- connector = dev_priv->int_lvds_connector;
- else if (dev_priv->int_edp_connector)
-@@ -388,8 +391,10 @@ int intel_panel_setup_backlight(struct drm_device *dev)
- void intel_panel_destroy_backlight(struct drm_device *dev)
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
-- if (dev_priv->backlight)
-+ if (dev_priv->backlight) {
- backlight_device_unregister(dev_priv->backlight);
-+ dev_priv->backlight = NULL;
-+ }
- }
- #else
- int intel_panel_setup_backlight(struct drm_device *dev)
-diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
-index 3a05cdb..d969f3c 100644
---- a/drivers/gpu/drm/radeon/atom.c
-+++ b/drivers/gpu/drm/radeon/atom.c
-@@ -1387,10 +1387,10 @@ int atom_allocate_fb_scratch(struct atom_context *ctx)
- firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset);
-
- DRM_DEBUG("atom firmware requested %08x %dkb\n",
-- firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware,
-- firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb);
-+ le32_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware),
-+ le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb));
-
-- usage_bytes = firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024;
-+ usage_bytes = le16_to_cpu(firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb) * 1024;
- }
- ctx->scratch_size_bytes = 0;
- if (usage_bytes == 0)
-diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
-index a25d08a..038570a 100644
---- a/drivers/gpu/drm/radeon/atombios_crtc.c
-+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
-@@ -544,6 +544,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
- /* use frac fb div on APUs */
- if (ASIC_IS_DCE41(rdev))
- pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
-+ /* use frac fb div on RS780/RS880 */
-+ if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880))
-+ pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
- if (ASIC_IS_DCE32(rdev) && mode->clock > 165000)
- pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
- } else {
-diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
-index 60d13fe..0495a50 100644
---- a/drivers/gpu/drm/radeon/evergreen.c
-+++ b/drivers/gpu/drm/radeon/evergreen.c
-@@ -412,6 +412,16 @@ void evergreen_hpd_init(struct radeon_device *rdev)
-
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
- struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-+
-+ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
-+ connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-+ /* don't try to enable hpd on eDP or LVDS avoid breaking the
-+ * aux dp channel on imac and help (but not completely fix)
-+ * https://bugzilla.redhat.com/show_bug.cgi?id=726143
-+ * also avoid interrupt storms during dpms.
-+ */
-+ continue;
-+ }
- switch (radeon_connector->hpd.hpd) {
- case RADEON_HPD_1:
- WREG32(DC_HPD1_CONTROL, tmp);
-diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
-index c45d921..57a825d 100644
---- a/drivers/gpu/drm/radeon/r600_hdmi.c
-+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
-@@ -506,7 +506,7 @@ void r600_hdmi_enable(struct drm_encoder *encoder)
- offset = radeon_encoder->hdmi_offset;
- if (ASIC_IS_DCE32(rdev) && !ASIC_IS_DCE4(rdev)) {
- WREG32_P(radeon_encoder->hdmi_config_offset + 0x4, 0x1, ~0x1);
-- } else if (rdev->family >= CHIP_R600 && !ASIC_IS_DCE3(rdev)) {
-+ } else if (ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE3(rdev)) {
- switch (radeon_encoder->encoder_id) {
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
- WREG32_P(AVIVO_TMDSA_CNTL, 0x4, ~0x4);
-@@ -572,7 +572,7 @@ void r600_hdmi_disable(struct drm_encoder *encoder)
-
- if (ASIC_IS_DCE32(rdev) && !ASIC_IS_DCE4(rdev)) {
- WREG32_P(radeon_encoder->hdmi_config_offset + 0x4, 0, ~0x1);
-- } else if (rdev->family >= CHIP_R600 && !ASIC_IS_DCE3(rdev)) {
-+ } else if (ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE3(rdev)) {
- switch (radeon_encoder->encoder_id) {
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
- WREG32_P(AVIVO_TMDSA_CNTL, 0, ~0x4);
-diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
-index 38585c5..383b38e 100644
---- a/drivers/gpu/drm/radeon/radeon_atombios.c
-+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
-@@ -1989,6 +1989,8 @@ static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
- num_modes = power_info->info.ucNumOfPowerModeEntries;
- if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
- num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
-+ if (num_modes == 0)
-+ return state_index;
- rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
- if (!rdev->pm.power_state)
- return state_index;
-@@ -2361,6 +2363,8 @@ static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
- power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
-
- radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
-+ if (power_info->pplib.ucNumStates == 0)
-+ return state_index;
- rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
- power_info->pplib.ucNumStates, GFP_KERNEL);
- if (!rdev->pm.power_state)
-@@ -2443,6 +2447,7 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
- int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
- u16 data_offset;
- u8 frev, crev;
-+ u8 *power_state_offset;
-
- if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
- &frev, &crev, &data_offset))
-@@ -2459,15 +2464,17 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
- non_clock_info_array = (struct NonClockInfoArray *)
- (mode_info->atom_context->bios + data_offset +
- le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
-+ if (state_array->ucNumEntries == 0)
-+ return state_index;
- rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
- state_array->ucNumEntries, GFP_KERNEL);
- if (!rdev->pm.power_state)
- return state_index;
-+ power_state_offset = (u8 *)state_array->states;
- for (i = 0; i < state_array->ucNumEntries; i++) {
- mode_index = 0;
-- power_state = (union pplib_power_state *)&state_array->states[i];
-- /* XXX this might be an inagua bug... */
-- non_clock_array_index = i; /* power_state->v2.nonClockInfoIndex */
-+ power_state = (union pplib_power_state *)power_state_offset;
-+ non_clock_array_index = power_state->v2.nonClockInfoIndex;
- non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
- &non_clock_info_array->nonClockInfo[non_clock_array_index];
- rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
-@@ -2479,9 +2486,6 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
- if (power_state->v2.ucNumDPMLevels) {
- for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
- clock_array_index = power_state->v2.clockInfoIndex[j];
-- /* XXX this might be an inagua bug... */
-- if (clock_array_index >= clock_info_array->ucNumEntries)
-- continue;
- clock_info = (union pplib_clock_info *)
- &clock_info_array->clockInfo[clock_array_index];
- valid = radeon_atombios_parse_pplib_clock_info(rdev,
-@@ -2503,6 +2507,7 @@ static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
- non_clock_info);
- state_index++;
- }
-+ power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
- }
- /* if multiple clock modes, mark the lowest as no display */
- for (i = 0; i < state_index; i++) {
-@@ -2549,7 +2554,9 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
- default:
- break;
- }
-- } else {
-+ }
-+
-+ if (state_index == 0) {
- rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
- if (rdev->pm.power_state) {
- rdev->pm.power_state[0].clock_info =
-diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
-index be2c122..4bb9e27 100644
---- a/drivers/gpu/drm/radeon/radeon_kms.c
-+++ b/drivers/gpu/drm/radeon/radeon_kms.c
-@@ -39,8 +39,12 @@ int radeon_driver_unload_kms(struct drm_device *dev)
-
- if (rdev == NULL)
- return 0;
-+ if (rdev->rmmio == NULL)
-+ goto done_free;
- radeon_modeset_fini(rdev);
- radeon_device_fini(rdev);
-+
-+done_free:
- kfree(rdev);
- dev->dev_private = NULL;
- return 0;
-diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
-index ebd6c51..d58eccb 100644
---- a/drivers/gpu/drm/radeon/radeon_pm.c
-+++ b/drivers/gpu/drm/radeon/radeon_pm.c
-@@ -863,7 +863,11 @@ static int radeon_debugfs_pm_info(struct seq_file *m, void *data)
- struct radeon_device *rdev = dev->dev_private;
-
- seq_printf(m, "default engine clock: %u0 kHz\n", rdev->pm.default_sclk);
-- seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev));
-+ /* radeon_get_engine_clock is not reliable on APUs so just print the current clock */
-+ if ((rdev->family >= CHIP_PALM) && (rdev->flags & RADEON_IS_IGP))
-+ seq_printf(m, "current engine clock: %u0 kHz\n", rdev->pm.current_sclk);
-+ else
-+ seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev));
- seq_printf(m, "default memory clock: %u0 kHz\n", rdev->pm.default_mclk);
- if (rdev->asic->get_memory_clock)
- seq_printf(m, "current memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev));
-diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
-index 4bb68f3..64e7065 100644
---- a/drivers/i2c/busses/i2c-xiic.c
-+++ b/drivers/i2c/busses/i2c-xiic.c
-@@ -311,10 +311,8 @@ static void xiic_fill_tx_fifo(struct xiic_i2c *i2c)
- /* last message in transfer -> STOP */
- data |= XIIC_TX_DYN_STOP_MASK;
- dev_dbg(i2c->adap.dev.parent, "%s TX STOP\n", __func__);
--
-- xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data);
-- } else
-- xiic_setreg8(i2c, XIIC_DTR_REG_OFFSET, data);
-+ }
-+ xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data);
- }
- }
-
-diff --git a/drivers/md/md.c b/drivers/md/md.c
-index 1702133..2d0544c 100644
---- a/drivers/md/md.c
-+++ b/drivers/md/md.c
-@@ -1588,8 +1588,8 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
- sector, count, 1) == 0)
- return -EINVAL;
- }
-- } else if (sb->bblog_offset == 0)
-- rdev->badblocks.shift = -1;
-+ } else if (sb->bblog_offset != 0)
-+ rdev->badblocks.shift = 0;
-
- if (!refdev) {
- ret = 1;
-@@ -3063,7 +3063,7 @@ int md_rdev_init(struct md_rdev *rdev)
- * be used - I wonder if that matters
- */
- rdev->badblocks.count = 0;
-- rdev->badblocks.shift = 0;
-+ rdev->badblocks.shift = -1; /* disabled until explicitly enabled */
- rdev->badblocks.page = kmalloc(PAGE_SIZE, GFP_KERNEL);
- seqlock_init(&rdev->badblocks.lock);
- if (rdev->badblocks.page == NULL)
-@@ -3135,9 +3135,6 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe
- goto abort_free;
- }
- }
-- if (super_format == -1)
-- /* hot-add for 0.90, or non-persistent: so no badblocks */
-- rdev->badblocks.shift = -1;
-
- return rdev;
-
-diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
-index fc07f90..b436b84 100644
---- a/drivers/net/bonding/bond_main.c
-+++ b/drivers/net/bonding/bond_main.c
-@@ -1866,6 +1866,7 @@ err_detach:
- write_unlock_bh(&bond->lock);
-
- err_close:
-+ slave_dev->priv_flags &= ~IFF_BONDING;
- dev_close(slave_dev);
-
- err_unset_master:
-@@ -4853,9 +4854,18 @@ static int __net_init bond_net_init(struct net *net)
- static void __net_exit bond_net_exit(struct net *net)
- {
- struct bond_net *bn = net_generic(net, bond_net_id);
-+ struct bonding *bond, *tmp_bond;
-+ LIST_HEAD(list);
-
- bond_destroy_sysfs(bn);
- bond_destroy_proc_dir(bn);
-+
-+ /* Kill off any bonds created after unregistering bond rtnl ops */
-+ rtnl_lock();
-+ list_for_each_entry_safe(bond, tmp_bond, &bn->dev_list, bond_list)
-+ unregister_netdevice_queue(bond->dev, &list);
-+ unregister_netdevice_many(&list);
-+ rtnl_unlock();
- }
-
- static struct pernet_operations bond_net_ops = {
-diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e.h b/drivers/net/ethernet/atheros/atl1e/atl1e.h
-index edfdf6b..b5fd934 100644
---- a/drivers/net/ethernet/atheros/atl1e/atl1e.h
-+++ b/drivers/net/ethernet/atheros/atl1e/atl1e.h
-@@ -186,7 +186,7 @@ struct atl1e_tpd_desc {
- /* how about 0x2000 */
- #define MAX_TX_BUF_LEN 0x2000
- #define MAX_TX_BUF_SHIFT 13
--/*#define MAX_TX_BUF_LEN 0x3000 */
-+#define MAX_TSO_SEG_SIZE 0x3c00
-
- /* rrs word 1 bit 0:31 */
- #define RRS_RX_CSUM_MASK 0xFFFF
-diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
-index c69dc29..dd893b3 100644
---- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
-+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
-@@ -2352,6 +2352,7 @@ static int __devinit atl1e_probe(struct pci_dev *pdev,
-
- INIT_WORK(&adapter->reset_task, atl1e_reset_task);
- INIT_WORK(&adapter->link_chg_task, atl1e_link_chg_task);
-+ netif_set_gso_max_size(netdev, MAX_TSO_SEG_SIZE);
- err = register_netdev(netdev);
- if (err) {
- netdev_err(netdev, "register netdevice failed\n");
-diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c
-index f67b8ae..69c3adf 100644
---- a/drivers/net/ethernet/freescale/gianfar_ptp.c
-+++ b/drivers/net/ethernet/freescale/gianfar_ptp.c
-@@ -127,7 +127,6 @@ struct gianfar_ptp_registers {
-
- #define DRIVER "gianfar_ptp"
- #define DEFAULT_CKSEL 1
--#define N_ALARM 1 /* first alarm is used internally to reset fipers */
- #define N_EXT_TS 2
- #define REG_SIZE sizeof(struct gianfar_ptp_registers)
-
-@@ -410,7 +409,7 @@ static struct ptp_clock_info ptp_gianfar_caps = {
- .owner = THIS_MODULE,
- .name = "gianfar clock",
- .max_adj = 512000,
-- .n_alarm = N_ALARM,
-+ .n_alarm = 0,
- .n_ext_ts = N_EXT_TS,
- .n_per_out = 0,
- .pps = 1,
-diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-index 41396fa..d93eee1 100644
---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-@@ -1937,6 +1937,16 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data)
- * with the write to EICR.
- */
- eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
-+
-+ /* The lower 16bits of the EICR register are for the queue interrupts
-+ * which should be masked here in order to not accidently clear them if
-+ * the bits are high when ixgbe_msix_other is called. There is a race
-+ * condition otherwise which results in possible performance loss
-+ * especially if the ixgbe_msix_other interrupt is triggering
-+ * consistently (as it would when PPS is turned on for the X540 device)
-+ */
-+ eicr &= 0xFFFF0000;
-+
- IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
-
- if (eicr & IXGBE_EICR_LSC)
-@@ -5408,7 +5418,9 @@ static int ixgbe_resume(struct pci_dev *pdev)
-
- pci_wake_from_d3(pdev, false);
-
-+ rtnl_lock();
- err = ixgbe_init_interrupt_scheme(adapter);
-+ rtnl_unlock();
- if (err) {
- e_dev_err("Cannot initialize interrupts for device\n");
- return err;
-diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
-index d812790..f698183 100644
---- a/drivers/net/ethernet/realtek/r8169.c
-+++ b/drivers/net/ethernet/realtek/r8169.c
-@@ -1629,8 +1629,6 @@ static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
-
- if (opts2 & RxVlanTag)
- __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
--
-- desc->opts2 = 0;
- }
-
- static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
-@@ -5566,6 +5564,14 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
- goto err_stop_0;
- }
-
-+ /* 8168evl does not automatically pad to minimum length. */
-+ if (unlikely(tp->mac_version == RTL_GIGA_MAC_VER_34 &&
-+ skb->len < ETH_ZLEN)) {
-+ if (skb_padto(skb, ETH_ZLEN))
-+ goto err_update_stats;
-+ skb_put(skb, ETH_ZLEN - skb->len);
-+ }
-+
- if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
- goto err_stop_0;
-
-@@ -5633,6 +5639,7 @@ err_dma_1:
- rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
- err_dma_0:
- dev_kfree_skb(skb);
-+err_update_stats:
- dev->stats.tx_dropped++;
- return NETDEV_TX_OK;
-
-@@ -5814,7 +5821,6 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
- rtl8169_schedule_work(dev, rtl8169_reset_task);
- dev->stats.rx_fifo_errors++;
- }
-- rtl8169_mark_to_asic(desc, rx_buf_sz);
- } else {
- struct sk_buff *skb;
- dma_addr_t addr = le64_to_cpu(desc->addr);
-@@ -5828,16 +5834,14 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
- if (unlikely(rtl8169_fragmented_frame(status))) {
- dev->stats.rx_dropped++;
- dev->stats.rx_length_errors++;
-- rtl8169_mark_to_asic(desc, rx_buf_sz);
-- continue;
-+ goto release_descriptor;
- }
-
- skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],
- tp, pkt_size, addr);
-- rtl8169_mark_to_asic(desc, rx_buf_sz);
- if (!skb) {
- dev->stats.rx_dropped++;
-- continue;
-+ goto release_descriptor;
- }
-
- rtl8169_rx_csum(skb, status);
-@@ -5851,6 +5855,10 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
- dev->stats.rx_bytes += pkt_size;
- dev->stats.rx_packets++;
- }
-+release_descriptor:
-+ desc->opts2 = 0;
-+ wmb();
-+ rtl8169_mark_to_asic(desc, rx_buf_sz);
- }
-
- count = cur_rx - tp->cur_rx;
-diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
-index ccf1524..3935994 100644
---- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
-@@ -563,6 +563,7 @@ void iwl_clear_ucode_stations(struct iwl_priv *priv,
- void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
- {
- struct iwl_addsta_cmd sta_cmd;
-+ static const struct iwl_link_quality_cmd zero_lq = {};
- struct iwl_link_quality_cmd lq;
- unsigned long flags_spin;
- int i;
-@@ -602,7 +603,9 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
- else
- memcpy(&lq, priv->stations[i].lq,
- sizeof(struct iwl_link_quality_cmd));
-- send_lq = true;
-+
-+ if (!memcmp(&lq, &zero_lq, sizeof(lq)))
-+ send_lq = true;
- }
- spin_unlock_irqrestore(&priv->shrd->sta_lock,
- flags_spin);
-diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c
-index 3cf4ecc..621b84f 100644
---- a/drivers/net/wireless/mwifiex/pcie.c
-+++ b/drivers/net/wireless/mwifiex/pcie.c
-@@ -1821,9 +1821,9 @@ static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
- if (pdev) {
- pci_iounmap(pdev, card->pci_mmap);
- pci_iounmap(pdev, card->pci_mmap1);
--
-- pci_release_regions(pdev);
- pci_disable_device(pdev);
-+ pci_release_region(pdev, 2);
-+ pci_release_region(pdev, 0);
- pci_set_drvdata(pdev, NULL);
- }
- }
-diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
-index 6d4a531..363a5c6 100644
---- a/drivers/pci/pci.c
-+++ b/drivers/pci/pci.c
-@@ -664,15 +664,11 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state)
- error = platform_pci_set_power_state(dev, state);
- if (!error)
- pci_update_current_state(dev, state);
-- /* Fall back to PCI_D0 if native PM is not supported */
-- if (!dev->pm_cap)
-- dev->current_state = PCI_D0;
-- } else {
-+ } else
- error = -ENODEV;
-- /* Fall back to PCI_D0 if native PM is not supported */
-- if (!dev->pm_cap)
-- dev->current_state = PCI_D0;
-- }
-+
-+ if (error && !dev->pm_cap) /* Fall back to PCI_D0 */
-+ dev->current_state = PCI_D0;
-
- return error;
- }
-diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
-index 05beb6c..e3eed18 100644
---- a/drivers/rtc/rtc-cmos.c
-+++ b/drivers/rtc/rtc-cmos.c
-@@ -805,9 +805,8 @@ static int cmos_suspend(struct device *dev)
- mask = RTC_IRQMASK;
- tmp &= ~mask;
- CMOS_WRITE(tmp, RTC_CONTROL);
-+ hpet_mask_rtc_irq_bit(mask);
-
-- /* shut down hpet emulation - we don't need it for alarm */
-- hpet_mask_rtc_irq_bit(RTC_PIE|RTC_AIE|RTC_UIE);
- cmos_checkintr(cmos, tmp);
- }
- spin_unlock_irq(&rtc_lock);
-@@ -872,6 +871,7 @@ static int cmos_resume(struct device *dev)
- rtc_update_irq(cmos->rtc, 1, mask);
- tmp &= ~RTC_AIE;
- hpet_mask_rtc_irq_bit(RTC_AIE);
-+ hpet_rtc_timer_init();
- } while (mask & RTC_AIE);
- spin_unlock_irq(&rtc_lock);
- }
-diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c
-index 0b54a91..a56a15e 100644
---- a/drivers/s390/char/sclp_cmd.c
-+++ b/drivers/s390/char/sclp_cmd.c
-@@ -509,6 +509,8 @@ static void __init sclp_add_standby_memory(void)
- add_memory_merged(0);
- }
-
-+#define MEM_SCT_SIZE (1UL << SECTION_SIZE_BITS)
-+
- static void __init insert_increment(u16 rn, int standby, int assigned)
- {
- struct memory_increment *incr, *new_incr;
-@@ -521,7 +523,7 @@ static void __init insert_increment(u16 rn, int standby, int assigned)
- new_incr->rn = rn;
- new_incr->standby = standby;
- if (!standby)
-- new_incr->usecount = 1;
-+ new_incr->usecount = rzm > MEM_SCT_SIZE ? rzm/MEM_SCT_SIZE : 1;
- last_rn = 0;
- prev = &sclp_mem_list;
- list_for_each_entry(incr, &sclp_mem_list, list) {
-diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c
-index d19b879..4735928 100644
---- a/drivers/tty/pty.c
-+++ b/drivers/tty/pty.c
-@@ -669,6 +669,9 @@ static int ptmx_open(struct inode *inode, struct file *filp)
-
- nonseekable_open(inode, filp);
-
-+ /* We refuse fsnotify events on ptmx, since it's a shared resource */
-+ filp->f_mode |= FMODE_NONOTIFY;
-+
- retval = tty_alloc_file(filp);
- if (retval)
- return retval;
-diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
-index af5ffb9..488214a 100644
---- a/drivers/tty/serial/serial_core.c
-+++ b/drivers/tty/serial/serial_core.c
-@@ -1901,6 +1901,8 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
- mutex_unlock(&port->mutex);
- return 0;
- }
-+ put_device(tty_dev);
-+
- if (console_suspend_enabled || !uart_console(uport))
- uport->suspended = 1;
-
-@@ -1966,9 +1968,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
- disable_irq_wake(uport->irq);
- uport->irq_wake = 0;
- }
-+ put_device(tty_dev);
- mutex_unlock(&port->mutex);
- return 0;
- }
-+ put_device(tty_dev);
- uport->suspended = 0;
-
- /*
-diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
-index 05085be..3f35e42 100644
---- a/drivers/tty/tty_io.c
-+++ b/drivers/tty/tty_io.c
-@@ -940,6 +940,14 @@ void start_tty(struct tty_struct *tty)
-
- EXPORT_SYMBOL(start_tty);
-
-+/* We limit tty time update visibility to every 8 seconds or so. */
-+static void tty_update_time(struct timespec *time)
-+{
-+ unsigned long sec = get_seconds() & ~7;
-+ if ((long)(sec - time->tv_sec) > 0)
-+ time->tv_sec = sec;
-+}
-+
- /**
- * tty_read - read method for tty device files
- * @file: pointer to tty file
-@@ -976,8 +984,10 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
- else
- i = -EIO;
- tty_ldisc_deref(ld);
-+
- if (i > 0)
-- inode->i_atime = current_fs_time(inode->i_sb);
-+ tty_update_time(&inode->i_atime);
-+
- return i;
- }
-
-@@ -1079,8 +1089,8 @@ static inline ssize_t do_tty_write(
- cond_resched();
- }
- if (written) {
-- struct inode *inode = file->f_path.dentry->d_inode;
-- inode->i_mtime = current_fs_time(inode->i_sb);
-+ struct inode *inode = file->f_path.dentry->d_inode;
-+ tty_update_time(&inode->i_mtime);
- ret = written;
- }
- out:
-diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
-index a9df218..22f770a 100644
---- a/drivers/usb/core/devio.c
-+++ b/drivers/usb/core/devio.c
-@@ -643,6 +643,8 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype,
- index &= 0xff;
- switch (requesttype & USB_RECIP_MASK) {
- case USB_RECIP_ENDPOINT:
-+ if ((index & ~USB_DIR_IN) == 0)
-+ return 0;
- ret = findintfep(ps->dev, index);
- if (ret >= 0)
- ret = checkintf(ps, ret);
-diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c
-index ac0d75a..9f7003e 100644
---- a/drivers/usb/misc/appledisplay.c
-+++ b/drivers/usb/misc/appledisplay.c
-@@ -63,6 +63,7 @@ static const struct usb_device_id appledisplay_table[] = {
- { APPLEDISPLAY_DEVICE(0x9219) },
- { APPLEDISPLAY_DEVICE(0x921c) },
- { APPLEDISPLAY_DEVICE(0x921d) },
-+ { APPLEDISPLAY_DEVICE(0x9236) },
-
- /* Terminating entry */
- { }
-diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
-index 06394e5a..51d1712 100644
---- a/drivers/usb/serial/ftdi_sio.c
-+++ b/drivers/usb/serial/ftdi_sio.c
-@@ -195,6 +195,7 @@ static struct usb_device_id id_table_combined [] = {
- { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
- { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
- { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
-+ { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
- { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
- { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
- { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
-@@ -876,7 +877,9 @@ static struct usb_device_id id_table_combined [] = {
- { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
- { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
- .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
-- { USB_DEVICE(ST_VID, ST_STMCLT1030_PID),
-+ { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
-+ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
-+ { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
- .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
- { USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
- { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
-@@ -1816,8 +1819,11 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial)
- }
-
- /*
-- * First and second port on STMCLiteadaptors is reserved for JTAG interface
-- * and the forth port for pio
-+ * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's
-+ * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and
-+ * can be accessed from userspace.
-+ * The next two ports are enabled as UARTs by default, where port 2 is
-+ * a conventional RS-232 UART.
- */
- static int ftdi_stmclite_probe(struct usb_serial *serial)
- {
-@@ -1826,12 +1832,13 @@ static int ftdi_stmclite_probe(struct usb_serial *serial)
-
- dbg("%s", __func__);
-
-- if (interface == udev->actconfig->interface[2])
-- return 0;
--
-- dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n");
-+ if (interface == udev->actconfig->interface[0] ||
-+ interface == udev->actconfig->interface[1]) {
-+ dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n");
-+ return -ENODEV;
-+ }
-
-- return -ENODEV;
-+ return 0;
- }
-
- /*
-diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
-index 809c03a..2f86008 100644
---- a/drivers/usb/serial/ftdi_sio_ids.h
-+++ b/drivers/usb/serial/ftdi_sio_ids.h
-@@ -74,6 +74,7 @@
- #define FTDI_OPENDCC_THROTTLE_PID 0xBFDA
- #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB
- #define FTDI_OPENDCC_GBM_PID 0xBFDC
-+#define FTDI_OPENDCC_GBM_BOOST_PID 0xBFDD
-
- /* NZR SEM 16+ USB (http://www.nzr.de) */
- #define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */
-@@ -1150,7 +1151,8 @@
- * STMicroelectonics
- */
- #define ST_VID 0x0483
--#define ST_STMCLT1030_PID 0x3747 /* ST Micro Connect Lite STMCLT1030 */
-+#define ST_STMCLT_2232_PID 0x3746
-+#define ST_STMCLT_4232_PID 0x3747
-
- /*
- * Papouch products (http://www.papouch.com/)
-diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
-index 4418538..8513f51 100644
---- a/drivers/usb/serial/option.c
-+++ b/drivers/usb/serial/option.c
-@@ -347,6 +347,7 @@ static void option_instat_callback(struct urb *urb);
- /* Olivetti products */
- #define OLIVETTI_VENDOR_ID 0x0b3c
- #define OLIVETTI_PRODUCT_OLICARD100 0xc000
-+#define OLIVETTI_PRODUCT_OLICARD145 0xc003
-
- /* Celot products */
- #define CELOT_VENDOR_ID 0x211f
-@@ -1273,6 +1274,7 @@ static const struct usb_device_id option_ids[] = {
- { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
-
- { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
-+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) },
- { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */
- { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */
- { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/
-@@ -1350,6 +1352,12 @@ static const struct usb_device_id option_ids[] = {
- { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180),
- .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
- { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) },
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x02, 0x01) }, /* D-Link DWM-156 (variant) */
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x00, 0x00) }, /* D-Link DWM-156 (variant) */
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x02, 0x01) },
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) },
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) },
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) },
- { } /* Terminating entry */
- };
- MODULE_DEVICE_TABLE(usb, option_ids);
-diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c
-index c844718..7341ce2 100644
---- a/drivers/usb/storage/cypress_atacb.c
-+++ b/drivers/usb/storage/cypress_atacb.c
-@@ -248,14 +248,26 @@ static int cypress_probe(struct usb_interface *intf,
- {
- struct us_data *us;
- int result;
-+ struct usb_device *device;
-
- result = usb_stor_probe1(&us, intf, id,
- (id - cypress_usb_ids) + cypress_unusual_dev_list);
- if (result)
- return result;
-
-- us->protocol_name = "Transparent SCSI with Cypress ATACB";
-- us->proto_handler = cypress_atacb_passthrough;
-+ /* Among CY7C68300 chips, the A revision does not support Cypress ATACB
-+ * Filter out this revision from EEPROM default descriptor values
-+ */
-+ device = interface_to_usbdev(intf);
-+ if (device->descriptor.iManufacturer != 0x38 ||
-+ device->descriptor.iProduct != 0x4e ||
-+ device->descriptor.iSerialNumber != 0x64) {
-+ us->protocol_name = "Transparent SCSI with Cypress ATACB";
-+ us->proto_handler = cypress_atacb_passthrough;
-+ } else {
-+ us->protocol_name = "Transparent SCSI";
-+ us->proto_handler = usb_stor_transparent_scsi_command;
-+ }
-
- result = usb_stor_probe2(us);
- return result;
-diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
-index 7a36dff..6b4fb5c 100644
---- a/drivers/video/console/fbcon.c
-+++ b/drivers/video/console/fbcon.c
-@@ -1229,6 +1229,8 @@ static void fbcon_deinit(struct vc_data *vc)
- finished:
-
- fbcon_free_font(p, free_font);
-+ if (free_font)
-+ vc->vc_font.data = NULL;
-
- if (!con_is_bound(&fb_con))
- fbcon_exit();
-diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
-index babbb07..0a22808 100644
---- a/drivers/video/fbmem.c
-+++ b/drivers/video/fbmem.c
-@@ -1350,15 +1350,12 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
- {
- struct fb_info *info = file_fb_info(file);
- struct fb_ops *fb;
-- unsigned long off;
-+ unsigned long mmio_pgoff;
- unsigned long start;
- u32 len;
-
- if (!info)
- return -ENODEV;
-- if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
-- return -EINVAL;
-- off = vma->vm_pgoff << PAGE_SHIFT;
- fb = info->fbops;
- if (!fb)
- return -ENODEV;
-@@ -1370,33 +1367,24 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
- return res;
- }
-
-- /* frame buffer memory */
-+ /*
-+ * Ugh. This can be either the frame buffer mapping, or
-+ * if pgoff points past it, the mmio mapping.
-+ */
- start = info->fix.smem_start;
-- len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len);
-- if (off >= len) {
-- /* memory mapped io */
-- off -= len;
-- if (info->var.accel_flags) {
-- mutex_unlock(&info->mm_lock);
-- return -EINVAL;
-- }
-+ len = info->fix.smem_len;
-+ mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT;
-+ if (vma->vm_pgoff >= mmio_pgoff) {
-+ vma->vm_pgoff -= mmio_pgoff;
- start = info->fix.mmio_start;
-- len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.mmio_len);
-+ len = info->fix.mmio_len;
- }
- mutex_unlock(&info->mm_lock);
-- start &= PAGE_MASK;
-- if ((vma->vm_end - vma->vm_start + off) > len)
-- return -EINVAL;
-- off += start;
-- vma->vm_pgoff = off >> PAGE_SHIFT;
-- /* This is an IO map - tell maydump to skip this VMA */
-- vma->vm_flags |= VM_IO | VM_RESERVED;
-+
- vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
-- fb_pgprotect(file, vma, off);
-- if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT,
-- vma->vm_end - vma->vm_start, vma->vm_page_prot))
-- return -EAGAIN;
-- return 0;
-+ fb_pgprotect(file, vma, start);
-+
-+ return vm_iomap_memory(vma, start, len);
- }
-
- static int
-diff --git a/fs/aio.c b/fs/aio.c
-index 3b65ee7..8cdd8ea 100644
---- a/fs/aio.c
-+++ b/fs/aio.c
-@@ -1112,9 +1112,9 @@ static int aio_read_evt(struct kioctx *ioctx, struct io_event *ent)
- spin_unlock(&info->ring_lock);
-
- out:
-- kunmap_atomic(ring, KM_USER0);
- dprintk("leaving aio_read_evt: %d h%lu t%lu\n", ret,
- (unsigned long)ring->head, (unsigned long)ring->tail);
-+ kunmap_atomic(ring, KM_USER0);
- return ret;
- }
-
-diff --git a/fs/dcache.c b/fs/dcache.c
-index e923bf4..d322929 100644
---- a/fs/dcache.c
-+++ b/fs/dcache.c
-@@ -1176,8 +1176,10 @@ void shrink_dcache_parent(struct dentry * parent)
- LIST_HEAD(dispose);
- int found;
-
-- while ((found = select_parent(parent, &dispose)) != 0)
-+ while ((found = select_parent(parent, &dispose)) != 0) {
- shrink_dentry_list(&dispose);
-+ cond_resched();
-+ }
- }
- EXPORT_SYMBOL(shrink_dcache_parent);
-
-diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig
-index 9ed1bb1..5459168 100644
---- a/fs/ext4/Kconfig
-+++ b/fs/ext4/Kconfig
-@@ -82,4 +82,5 @@ config EXT4_DEBUG
- Enables run-time debugging support for the ext4 filesystem.
-
- If you select Y here, then you will be able to turn on debugging
-- with a command such as "echo 1 > /sys/kernel/debug/ext4/mballoc-debug"
-+ with a command such as:
-+ echo 1 > /sys/module/ext4/parameters/mballoc_debug
-diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c
-index bb6c7d8..a8d03a4 100644
---- a/fs/ext4/fsync.c
-+++ b/fs/ext4/fsync.c
-@@ -260,8 +260,7 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
- if (journal->j_flags & JBD2_BARRIER &&
- !jbd2_trans_will_send_data_barrier(journal, commit_tid))
- needs_barrier = true;
-- jbd2_log_start_commit(journal, commit_tid);
-- ret = jbd2_log_wait_commit(journal, commit_tid);
-+ ret = jbd2_complete_transaction(journal, commit_tid);
- if (needs_barrier)
- blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
- out:
-diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
-index 3270ffd..025b4b6 100644
---- a/fs/ext4/inode.c
-+++ b/fs/ext4/inode.c
-@@ -147,8 +147,7 @@ void ext4_evict_inode(struct inode *inode)
- journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
- tid_t commit_tid = EXT4_I(inode)->i_datasync_tid;
-
-- jbd2_log_start_commit(journal, commit_tid);
-- jbd2_log_wait_commit(journal, commit_tid);
-+ jbd2_complete_transaction(journal, commit_tid);
- filemap_write_and_wait(&inode->i_data);
- }
- truncate_inode_pages(&inode->i_data, 0);
-diff --git a/fs/fscache/stats.c b/fs/fscache/stats.c
-index 4765190..73c0bd7 100644
---- a/fs/fscache/stats.c
-+++ b/fs/fscache/stats.c
-@@ -276,5 +276,5 @@ const struct file_operations fscache_stats_fops = {
- .open = fscache_stats_open,
- .read = seq_read,
- .llseek = seq_lseek,
-- .release = seq_release,
-+ .release = single_release,
- };
-diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
-index d751f04..ab9463a 100644
---- a/fs/jbd2/commit.c
-+++ b/fs/jbd2/commit.c
-@@ -326,7 +326,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
- int space_left = 0;
- int first_tag = 0;
- int tag_flag;
-- int i, to_free = 0;
-+ int i;
- int tag_bytes = journal_tag_bytes(journal);
- struct buffer_head *cbh = NULL; /* For transactional checksums */
- __u32 crc32_sum = ~0;
-@@ -996,7 +996,7 @@ restart_loop:
- journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged;
- spin_unlock(&journal->j_history_lock);
-
-- commit_transaction->t_state = T_FINISHED;
-+ commit_transaction->t_state = T_COMMIT_CALLBACK;
- J_ASSERT(commit_transaction == journal->j_committing_transaction);
- journal->j_commit_sequence = commit_transaction->t_tid;
- journal->j_committing_transaction = NULL;
-@@ -1011,38 +1011,44 @@ restart_loop:
- journal->j_average_commit_time*3) / 4;
- else
- journal->j_average_commit_time = commit_time;
-+
- write_unlock(&journal->j_state_lock);
-
-- if (commit_transaction->t_checkpoint_list == NULL &&
-- commit_transaction->t_checkpoint_io_list == NULL) {
-- __jbd2_journal_drop_transaction(journal, commit_transaction);
-- to_free = 1;
-+ if (journal->j_checkpoint_transactions == NULL) {
-+ journal->j_checkpoint_transactions = commit_transaction;
-+ commit_transaction->t_cpnext = commit_transaction;
-+ commit_transaction->t_cpprev = commit_transaction;
- } else {
-- if (journal->j_checkpoint_transactions == NULL) {
-- journal->j_checkpoint_transactions = commit_transaction;
-- commit_transaction->t_cpnext = commit_transaction;
-- commit_transaction->t_cpprev = commit_transaction;
-- } else {
-- commit_transaction->t_cpnext =
-- journal->j_checkpoint_transactions;
-- commit_transaction->t_cpprev =
-- commit_transaction->t_cpnext->t_cpprev;
-- commit_transaction->t_cpnext->t_cpprev =
-- commit_transaction;
-- commit_transaction->t_cpprev->t_cpnext =
-+ commit_transaction->t_cpnext =
-+ journal->j_checkpoint_transactions;
-+ commit_transaction->t_cpprev =
-+ commit_transaction->t_cpnext->t_cpprev;
-+ commit_transaction->t_cpnext->t_cpprev =
-+ commit_transaction;
-+ commit_transaction->t_cpprev->t_cpnext =
- commit_transaction;
-- }
- }
- spin_unlock(&journal->j_list_lock);
--
-+ /* Drop all spin_locks because commit_callback may be block.
-+ * __journal_remove_checkpoint() can not destroy transaction
-+ * under us because it is not marked as T_FINISHED yet */
- if (journal->j_commit_callback)
- journal->j_commit_callback(journal, commit_transaction);
-
- trace_jbd2_end_commit(journal, commit_transaction);
- jbd_debug(1, "JBD2: commit %d complete, head %d\n",
- journal->j_commit_sequence, journal->j_tail_sequence);
-- if (to_free)
-- kfree(commit_transaction);
-
-+ write_lock(&journal->j_state_lock);
-+ spin_lock(&journal->j_list_lock);
-+ commit_transaction->t_state = T_FINISHED;
-+ /* Recheck checkpoint lists after j_list_lock was dropped */
-+ if (commit_transaction->t_checkpoint_list == NULL &&
-+ commit_transaction->t_checkpoint_io_list == NULL) {
-+ __jbd2_journal_drop_transaction(journal, commit_transaction);
-+ kfree(commit_transaction);
-+ }
-+ spin_unlock(&journal->j_list_lock);
-+ write_unlock(&journal->j_state_lock);
- wake_up(&journal->j_wait_done_commit);
- }
-diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
-index 0fa0123..17b04fc 100644
---- a/fs/jbd2/journal.c
-+++ b/fs/jbd2/journal.c
-@@ -663,6 +663,37 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid)
- }
-
- /*
-+ * When this function returns the transaction corresponding to tid
-+ * will be completed. If the transaction has currently running, start
-+ * committing that transaction before waiting for it to complete. If
-+ * the transaction id is stale, it is by definition already completed,
-+ * so just return SUCCESS.
-+ */
-+int jbd2_complete_transaction(journal_t *journal, tid_t tid)
-+{
-+ int need_to_wait = 1;
-+
-+ read_lock(&journal->j_state_lock);
-+ if (journal->j_running_transaction &&
-+ journal->j_running_transaction->t_tid == tid) {
-+ if (journal->j_commit_request != tid) {
-+ /* transaction not yet started, so request it */
-+ read_unlock(&journal->j_state_lock);
-+ jbd2_log_start_commit(journal, tid);
-+ goto wait_commit;
-+ }
-+ } else if (!(journal->j_committing_transaction &&
-+ journal->j_committing_transaction->t_tid == tid))
-+ need_to_wait = 0;
-+ read_unlock(&journal->j_state_lock);
-+ if (!need_to_wait)
-+ return 0;
-+wait_commit:
-+ return jbd2_log_wait_commit(journal, tid);
-+}
-+EXPORT_SYMBOL(jbd2_complete_transaction);
-+
-+/*
- * Log buffer allocation routines:
- */
-
-diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c
-index 8d4ea83..de88922 100644
---- a/fs/lockd/clntlock.c
-+++ b/fs/lockd/clntlock.c
-@@ -141,6 +141,9 @@ int nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout)
- timeout);
- if (ret < 0)
- return -ERESTARTSYS;
-+ /* Reset the lock status after a server reboot so we resend */
-+ if (block->b_status == nlm_lck_denied_grace_period)
-+ block->b_status = nlm_lck_blocked;
- req->a_res.status = block->b_status;
- return 0;
- }
-diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c
-index a3a0987..8392cb8 100644
---- a/fs/lockd/clntproc.c
-+++ b/fs/lockd/clntproc.c
-@@ -551,9 +551,6 @@ again:
- status = nlmclnt_block(block, req, NLMCLNT_POLL_TIMEOUT);
- if (status < 0)
- break;
-- /* Resend the blocking lock request after a server reboot */
-- if (resp->status == nlm_lck_denied_grace_period)
-- continue;
- if (resp->status != nlm_lck_blocked)
- break;
- }
-diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
-index fe5c5fb..08921b8 100644
---- a/fs/nfsd/nfs4proc.c
-+++ b/fs/nfsd/nfs4proc.c
-@@ -880,14 +880,14 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
-
- nfs4_lock_state();
- status = nfs4_preprocess_stateid_op(cstate, stateid, WR_STATE, &filp);
-- if (filp)
-- get_file(filp);
-- nfs4_unlock_state();
--
- if (status) {
-+ nfs4_unlock_state();
- dprintk("NFSD: nfsd4_write: couldn't process stateid!\n");
- return status;
- }
-+ if (filp)
-+ get_file(filp);
-+ nfs4_unlock_state();
-
- cnt = write->wr_buflen;
- write->wr_how_written = write->wr_stable_how;
-diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
-index 7d189dc..4cef99f 100644
---- a/fs/nfsd/nfs4state.c
-+++ b/fs/nfsd/nfs4state.c
-@@ -188,13 +188,7 @@ static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag)
- {
- if (atomic_dec_and_test(&fp->fi_access[oflag])) {
- nfs4_file_put_fd(fp, oflag);
-- /*
-- * It's also safe to get rid of the RDWR open *if*
-- * we no longer have need of the other kind of access
-- * or if we already have the other kind of open:
-- */
-- if (fp->fi_fds[1-oflag]
-- || atomic_read(&fp->fi_access[1 - oflag]) == 0)
-+ if (atomic_read(&fp->fi_access[1 - oflag]) == 0)
- nfs4_file_put_fd(fp, O_RDWR);
- }
- }
-diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
-index 24afa96..ade5316 100644
---- a/fs/nfsd/nfs4xdr.c
-+++ b/fs/nfsd/nfs4xdr.c
-@@ -360,10 +360,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
- all 32 bits of 'nseconds'. */
- READ_BUF(12);
- len += 12;
-- READ32(dummy32);
-- if (dummy32)
-- return nfserr_inval;
-- READ32(iattr->ia_atime.tv_sec);
-+ READ64(iattr->ia_atime.tv_sec);
- READ32(iattr->ia_atime.tv_nsec);
- if (iattr->ia_atime.tv_nsec >= (u32)1000000000)
- return nfserr_inval;
-@@ -386,10 +383,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
- all 32 bits of 'nseconds'. */
- READ_BUF(12);
- len += 12;
-- READ32(dummy32);
-- if (dummy32)
-- return nfserr_inval;
-- READ32(iattr->ia_mtime.tv_sec);
-+ READ64(iattr->ia_mtime.tv_sec);
- READ32(iattr->ia_mtime.tv_nsec);
- if (iattr->ia_mtime.tv_nsec >= (u32)1000000000)
- return nfserr_inval;
-@@ -2374,8 +2368,7 @@ out_acl:
- if (bmval1 & FATTR4_WORD1_TIME_ACCESS) {
- if ((buflen -= 12) < 0)
- goto out_resource;
-- WRITE32(0);
-- WRITE32(stat.atime.tv_sec);
-+ WRITE64((s64)stat.atime.tv_sec);
- WRITE32(stat.atime.tv_nsec);
- }
- if (bmval1 & FATTR4_WORD1_TIME_DELTA) {
-@@ -2388,15 +2381,13 @@ out_acl:
- if (bmval1 & FATTR4_WORD1_TIME_METADATA) {
- if ((buflen -= 12) < 0)
- goto out_resource;
-- WRITE32(0);
-- WRITE32(stat.ctime.tv_sec);
-+ WRITE64((s64)stat.ctime.tv_sec);
- WRITE32(stat.ctime.tv_nsec);
- }
- if (bmval1 & FATTR4_WORD1_TIME_MODIFY) {
- if ((buflen -= 12) < 0)
- goto out_resource;
-- WRITE32(0);
-- WRITE32(stat.mtime.tv_sec);
-+ WRITE64((s64)stat.mtime.tv_sec);
- WRITE32(stat.mtime.tv_nsec);
- }
- if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
-diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
-index 6f292dd..f255d37 100644
---- a/fs/notify/inotify/inotify_user.c
-+++ b/fs/notify/inotify/inotify_user.c
-@@ -577,7 +577,6 @@ static int inotify_update_existing_watch(struct fsnotify_group *group,
- int add = (arg & IN_MASK_ADD);
- int ret;
-
-- /* don't allow invalid bits: we don't want flags set */
- mask = inotify_arg_to_mask(arg);
-
- fsn_mark = fsnotify_find_inode_mark(group, inode);
-@@ -628,7 +627,6 @@ static int inotify_new_watch(struct fsnotify_group *group,
- struct idr *idr = &group->inotify_data.idr;
- spinlock_t *idr_lock = &group->inotify_data.idr_lock;
-
-- /* don't allow invalid bits: we don't want flags set */
- mask = inotify_arg_to_mask(arg);
-
- tmp_i_mark = kmem_cache_alloc(inotify_inode_mark_cachep, GFP_KERNEL);
-@@ -757,6 +755,10 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
- int ret, fput_needed;
- unsigned flags = 0;
-
-+ /* don't allow invalid bits: we don't want flags set */
-+ if (unlikely(!(mask & ALL_INOTIFY_BITS)))
-+ return -EINVAL;
-+
- filp = fget_light(fd, &fput_needed);
- if (unlikely(!filp))
- return -EBADF;
-diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
-index 3899e24..e756bc4 100644
---- a/fs/sysfs/dir.c
-+++ b/fs/sysfs/dir.c
-@@ -977,6 +977,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
- enum kobj_ns_type type;
- const void *ns;
- ino_t ino;
-+ loff_t off;
-
- type = sysfs_ns_type(parent_sd);
- ns = sysfs_info(dentry->d_sb)->ns[type];
-@@ -999,6 +1000,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
- return 0;
- }
- mutex_lock(&sysfs_mutex);
-+ off = filp->f_pos;
- for (pos = sysfs_dir_pos(ns, parent_sd, filp->f_pos, pos);
- pos;
- pos = sysfs_dir_next_pos(ns, parent_sd, filp->f_pos, pos)) {
-@@ -1010,19 +1012,24 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
- len = strlen(name);
- ino = pos->s_ino;
- type = dt_type(pos);
-- filp->f_pos = ino;
-+ off = filp->f_pos = ino;
- filp->private_data = sysfs_get(pos);
-
- mutex_unlock(&sysfs_mutex);
-- ret = filldir(dirent, name, len, filp->f_pos, ino, type);
-+ ret = filldir(dirent, name, len, off, ino, type);
- mutex_lock(&sysfs_mutex);
- if (ret < 0)
- break;
- }
- mutex_unlock(&sysfs_mutex);
-- if ((filp->f_pos > 1) && !pos) { /* EOF */
-- filp->f_pos = INT_MAX;
-+
-+ /* don't reference last entry if its refcount is dropped */
-+ if (!pos) {
- filp->private_data = NULL;
-+
-+ /* EOF and not changed as 0 or 1 in read/write path */
-+ if (off == filp->f_pos && off > 1)
-+ filp->f_pos = INT_MAX;
- }
- return 0;
- }
-diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h
-index 8a297a5..497c6cc 100644
---- a/include/linux/ipc_namespace.h
-+++ b/include/linux/ipc_namespace.h
-@@ -42,8 +42,8 @@ struct ipc_namespace {
-
- size_t shm_ctlmax;
- size_t shm_ctlall;
-+ unsigned long shm_tot;
- int shm_ctlmni;
-- int shm_tot;
- /*
- * Defines whether IPC_RMID is forced for _all_ shm segments regardless
- * of shmctl()
-diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
-index 2092ea2..a153ed5 100644
---- a/include/linux/jbd2.h
-+++ b/include/linux/jbd2.h
-@@ -470,6 +470,7 @@ struct transaction_s
- T_COMMIT,
- T_COMMIT_DFLUSH,
- T_COMMIT_JFLUSH,
-+ T_COMMIT_CALLBACK,
- T_FINISHED
- } t_state;
-
-@@ -1165,6 +1166,7 @@ int __jbd2_log_start_commit(journal_t *journal, tid_t tid);
- int jbd2_journal_start_commit(journal_t *journal, tid_t *tid);
- int jbd2_journal_force_commit_nested(journal_t *journal);
- int jbd2_log_wait_commit(journal_t *journal, tid_t tid);
-+int jbd2_complete_transaction(journal_t *journal, tid_t tid);
- int jbd2_log_do_checkpoint(journal_t *journal);
- int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid);
-
-diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 4baadd1..d0493f6 100644
---- a/include/linux/mm.h
-+++ b/include/linux/mm.h
-@@ -1509,6 +1509,8 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
- unsigned long pfn);
- int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,
- unsigned long pfn);
-+int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len);
-+
-
- struct page *follow_page(struct vm_area_struct *, unsigned long address,
- unsigned int foll_flags);
-diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index 00ca32b..8c43fd1 100644
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -225,9 +225,9 @@ struct netdev_hw_addr {
- #define NETDEV_HW_ADDR_T_SLAVE 3
- #define NETDEV_HW_ADDR_T_UNICAST 4
- #define NETDEV_HW_ADDR_T_MULTICAST 5
-- bool synced;
- bool global_use;
- int refcount;
-+ int synced;
- struct rcu_head rcu_head;
- };
-
-diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
-index da65890..efe50af 100644
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -2367,6 +2367,13 @@ static inline void nf_reset(struct sk_buff *skb)
- #endif
- }
-
-+static inline void nf_reset_trace(struct sk_buff *skb)
-+{
-+#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE)
-+ skb->nf_trace = 0;
-+#endif
-+}
-+
- /* Note: This doesn't put any conntrack and bridge info in dst. */
- static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
- {
-diff --git a/ipc/shm.c b/ipc/shm.c
-index b76be5b..326a20b 100644
---- a/ipc/shm.c
-+++ b/ipc/shm.c
-@@ -450,7 +450,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
- size_t size = params->u.size;
- int error;
- struct shmid_kernel *shp;
-- int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT;
-+ size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
- struct file * file;
- char name[13];
- int id;
-diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
-index 31fdc48..0caf1f8 100644
---- a/kernel/audit_tree.c
-+++ b/kernel/audit_tree.c
-@@ -608,9 +608,9 @@ void audit_trim_trees(void)
- }
- spin_unlock(&hash_lock);
- trim_marked(tree);
-- put_tree(tree);
- drop_collected_mounts(root_mnt);
- skip_it:
-+ put_tree(tree);
- mutex_lock(&audit_filter_mutex);
- }
- list_del(&cursor);
-diff --git a/kernel/cgroup.c b/kernel/cgroup.c
-index c0739f8..d2a01fe 100644
---- a/kernel/cgroup.c
-+++ b/kernel/cgroup.c
-@@ -2029,7 +2029,7 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader)
- if (!group)
- return -ENOMEM;
- /* pre-allocate to guarantee space while iterating in rcu read-side. */
-- retval = flex_array_prealloc(group, 0, group_size - 1, GFP_KERNEL);
-+ retval = flex_array_prealloc(group, 0, group_size, GFP_KERNEL);
- if (retval)
- goto out_free_group_list;
-
-diff --git a/kernel/events/core.c b/kernel/events/core.c
-index 7d1f05e..9f21915 100644
---- a/kernel/events/core.c
-+++ b/kernel/events/core.c
-@@ -5164,7 +5164,7 @@ static void sw_perf_event_destroy(struct perf_event *event)
-
- static int perf_swevent_init(struct perf_event *event)
- {
-- int event_id = event->attr.config;
-+ u64 event_id = event->attr.config;
-
- if (event->attr.type != PERF_TYPE_SOFTWARE)
- return -ENOENT;
-@@ -5756,6 +5756,7 @@ skip_type:
- if (pmu->pmu_cpu_context)
- goto got_cpu_context;
-
-+ ret = -ENOMEM;
- pmu->pmu_cpu_context = alloc_percpu(struct perf_cpu_context);
- if (!pmu->pmu_cpu_context)
- goto free_dev;
-diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
-index e4cee8d..60f7e32 100644
---- a/kernel/hrtimer.c
-+++ b/kernel/hrtimer.c
-@@ -298,6 +298,10 @@ ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec)
- } else {
- unsigned long rem = do_div(nsec, NSEC_PER_SEC);
-
-+ /* Make sure nsec fits into long */
-+ if (unlikely(nsec > KTIME_SEC_MAX))
-+ return (ktime_t){ .tv64 = KTIME_MAX };
-+
- tmp = ktime_set((long)nsec, rem);
- }
-
-@@ -1308,6 +1312,8 @@ retry:
-
- expires = ktime_sub(hrtimer_get_expires(timer),
- base->offset);
-+ if (expires.tv64 < 0)
-+ expires.tv64 = KTIME_MAX;
- if (expires.tv64 < expires_next.tv64)
- expires_next = expires;
- break;
-diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
-index cd068b2..c3509fb 100644
---- a/kernel/time/tick-broadcast.c
-+++ b/kernel/time/tick-broadcast.c
-@@ -66,6 +66,8 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc)
- */
- int tick_check_broadcast_device(struct clock_event_device *dev)
- {
-+ struct clock_event_device *cur = tick_broadcast_device.evtdev;
-+
- if ((dev->features & CLOCK_EVT_FEAT_DUMMY) ||
- (tick_broadcast_device.evtdev &&
- tick_broadcast_device.evtdev->rating >= dev->rating) ||
-@@ -73,6 +75,8 @@ int tick_check_broadcast_device(struct clock_event_device *dev)
- return 0;
-
- clockevents_exchange_device(tick_broadcast_device.evtdev, dev);
-+ if (cur)
-+ cur->event_handler = clockevents_handle_noop;
- tick_broadcast_device.evtdev = dev;
- if (!cpumask_empty(tick_get_broadcast_mask()))
- tick_broadcast_start_periodic(dev);
-diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
-index da6c9ec..ead79bc 100644
---- a/kernel/time/tick-common.c
-+++ b/kernel/time/tick-common.c
-@@ -323,6 +323,7 @@ static void tick_shutdown(unsigned int *cpup)
- */
- dev->mode = CLOCK_EVT_MODE_UNUSED;
- clockevents_exchange_device(dev, NULL);
-+ dev->event_handler = clockevents_handle_noop;
- td->evtdev = NULL;
- }
- raw_spin_unlock_irqrestore(&tick_device_lock, flags);
-diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
-index 5527211..24b3759 100644
---- a/kernel/trace/ftrace.c
-+++ b/kernel/trace/ftrace.c
-@@ -554,7 +554,7 @@ int ftrace_profile_pages_init(struct ftrace_profile_stat *stat)
-
- pages = DIV_ROUND_UP(functions, PROFILES_PER_PAGE);
-
-- for (i = 0; i < pages; i++) {
-+ for (i = 1; i < pages; i++) {
- pg->next = (void *)get_zeroed_page(GFP_KERNEL);
- if (!pg->next)
- goto out_free;
-@@ -3303,7 +3303,8 @@ out:
- if (fail)
- return -EINVAL;
-
-- ftrace_graph_filter_enabled = 1;
-+ ftrace_graph_filter_enabled = !!(*idx);
-+
- return 0;
- }
-
-diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index 17edb14..0ec6c34 100644
---- a/kernel/trace/trace.c
-+++ b/kernel/trace/trace.c
-@@ -4563,6 +4563,8 @@ static __init int tracer_init_debugfs(void)
- trace_access_lock_init();
-
- d_tracer = tracing_init_dentry();
-+ if (!d_tracer)
-+ return 0;
-
- trace_create_file("tracing_enabled", 0644, d_tracer,
- &global_trace, &tracing_ctrl_fops);
-@@ -4696,36 +4698,32 @@ void trace_init_global_iter(struct trace_iterator *iter)
- iter->cpu_file = TRACE_PIPE_ALL_CPU;
- }
-
--static void
--__ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
-+void ftrace_dump(enum ftrace_dump_mode oops_dump_mode)
- {
-- static arch_spinlock_t ftrace_dump_lock =
-- (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED;
- /* use static because iter can be a bit big for the stack */
- static struct trace_iterator iter;
-+ static atomic_t dump_running;
- unsigned int old_userobj;
-- static int dump_ran;
- unsigned long flags;
- int cnt = 0, cpu;
-
-- /* only one dump */
-- local_irq_save(flags);
-- arch_spin_lock(&ftrace_dump_lock);
-- if (dump_ran)
-- goto out;
--
-- dump_ran = 1;
-+ /* Only allow one dump user at a time. */
-+ if (atomic_inc_return(&dump_running) != 1) {
-+ atomic_dec(&dump_running);
-+ return;
-+ }
-
-+ /*
-+ * Always turn off tracing when we dump.
-+ * We don't need to show trace output of what happens
-+ * between multiple crashes.
-+ *
-+ * If the user does a sysrq-z, then they can re-enable
-+ * tracing with echo 1 > tracing_on.
-+ */
- tracing_off();
-
-- /* Did function tracer already get disabled? */
-- if (ftrace_is_dead()) {
-- printk("# WARNING: FUNCTION TRACING IS CORRUPTED\n");
-- printk("# MAY BE MISSING FUNCTION EVENTS\n");
-- }
--
-- if (disable_tracing)
-- ftrace_kill();
-+ local_irq_save(flags);
-
- trace_init_global_iter(&iter);
-
-@@ -4758,6 +4756,12 @@ __ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
-
- printk(KERN_TRACE "Dumping ftrace buffer:\n");
-
-+ /* Did function tracer already get disabled? */
-+ if (ftrace_is_dead()) {
-+ printk("# WARNING: FUNCTION TRACING IS CORRUPTED\n");
-+ printk("# MAY BE MISSING FUNCTION EVENTS\n");
-+ }
-+
- /*
- * We need to stop all tracing on all CPUS to read the
- * the next buffer. This is a bit expensive, but is
-@@ -4796,26 +4800,15 @@ __ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
- printk(KERN_TRACE "---------------------------------\n");
-
- out_enable:
-- /* Re-enable tracing if requested */
-- if (!disable_tracing) {
-- trace_flags |= old_userobj;
-+ trace_flags |= old_userobj;
-
-- for_each_tracing_cpu(cpu) {
-- atomic_dec(&iter.tr->data[cpu]->disabled);
-- }
-- tracing_on();
-+ for_each_tracing_cpu(cpu) {
-+ atomic_dec(&iter.tr->data[cpu]->disabled);
- }
--
-- out:
-- arch_spin_unlock(&ftrace_dump_lock);
-+ atomic_dec(&dump_running);
- local_irq_restore(flags);
- }
--
--/* By default: disable tracing after the dump */
--void ftrace_dump(enum ftrace_dump_mode oops_dump_mode)
--{
-- __ftrace_dump(true, oops_dump_mode);
--}
-+EXPORT_SYMBOL_GPL(ftrace_dump);
-
- __init static int tracer_alloc_buffers(void)
- {
-diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c
-index 288541f..09fd98a 100644
---- a/kernel/trace/trace_selftest.c
-+++ b/kernel/trace/trace_selftest.c
-@@ -461,8 +461,6 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr)
- /* Maximum number of functions to trace before diagnosing a hang */
- #define GRAPH_MAX_FUNC_TEST 100000000
-
--static void
--__ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode);
- static unsigned int graph_hang_thresh;
-
- /* Wrap the real function entry probe to avoid possible hanging */
-@@ -472,8 +470,11 @@ static int trace_graph_entry_watchdog(struct ftrace_graph_ent *trace)
- if (unlikely(++graph_hang_thresh > GRAPH_MAX_FUNC_TEST)) {
- ftrace_graph_stop();
- printk(KERN_WARNING "BUG: Function graph tracer hang!\n");
-- if (ftrace_dump_on_oops)
-- __ftrace_dump(false, DUMP_ALL);
-+ if (ftrace_dump_on_oops) {
-+ ftrace_dump(DUMP_ALL);
-+ /* ftrace_dump() disables tracing */
-+ tracing_on();
-+ }
- return 0;
- }
-
-diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
-index 77575b3..c5b20a3 100644
---- a/kernel/trace/trace_stack.c
-+++ b/kernel/trace/trace_stack.c
-@@ -17,13 +17,24 @@
-
- #define STACK_TRACE_ENTRIES 500
-
-+#ifdef CC_USING_FENTRY
-+# define fentry 1
-+#else
-+# define fentry 0
-+#endif
-+
- static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES+1] =
- { [0 ... (STACK_TRACE_ENTRIES)] = ULONG_MAX };
- static unsigned stack_dump_index[STACK_TRACE_ENTRIES];
-
-+/*
-+ * Reserve one entry for the passed in ip. This will allow
-+ * us to remove most or all of the stack size overhead
-+ * added by the stack tracer itself.
-+ */
- static struct stack_trace max_stack_trace = {
-- .max_entries = STACK_TRACE_ENTRIES,
-- .entries = stack_dump_trace,
-+ .max_entries = STACK_TRACE_ENTRIES - 1,
-+ .entries = &stack_dump_trace[1],
- };
-
- static unsigned long max_stack_size;
-@@ -37,25 +48,34 @@ static DEFINE_MUTEX(stack_sysctl_mutex);
- int stack_tracer_enabled;
- static int last_stack_tracer_enabled;
-
--static inline void check_stack(void)
-+static inline void
-+check_stack(unsigned long ip, unsigned long *stack)
- {
- unsigned long this_size, flags;
- unsigned long *p, *top, *start;
-+ static int tracer_frame;
-+ int frame_size = ACCESS_ONCE(tracer_frame);
- int i;
-
-- this_size = ((unsigned long)&this_size) & (THREAD_SIZE-1);
-+ this_size = ((unsigned long)stack) & (THREAD_SIZE-1);
- this_size = THREAD_SIZE - this_size;
-+ /* Remove the frame of the tracer */
-+ this_size -= frame_size;
-
- if (this_size <= max_stack_size)
- return;
-
- /* we do not handle interrupt stacks yet */
-- if (!object_is_on_stack(&this_size))
-+ if (!object_is_on_stack(stack))
- return;
-
- local_irq_save(flags);
- arch_spin_lock(&max_stack_lock);
-
-+ /* In case another CPU set the tracer_frame on us */
-+ if (unlikely(!frame_size))
-+ this_size -= tracer_frame;
-+
- /* a race could have already updated it */
- if (this_size <= max_stack_size)
- goto out;
-@@ -68,10 +88,18 @@ static inline void check_stack(void)
- save_stack_trace(&max_stack_trace);
-
- /*
-+ * Add the passed in ip from the function tracer.
-+ * Searching for this on the stack will skip over
-+ * most of the overhead from the stack tracer itself.
-+ */
-+ stack_dump_trace[0] = ip;
-+ max_stack_trace.nr_entries++;
-+
-+ /*
- * Now find where in the stack these are.
- */
- i = 0;
-- start = &this_size;
-+ start = stack;
- top = (unsigned long *)
- (((unsigned long)start & ~(THREAD_SIZE-1)) + THREAD_SIZE);
-
-@@ -95,6 +123,18 @@ static inline void check_stack(void)
- found = 1;
- /* Start the search from here */
- start = p + 1;
-+ /*
-+ * We do not want to show the overhead
-+ * of the stack tracer stack in the
-+ * max stack. If we haven't figured
-+ * out what that is, then figure it out
-+ * now.
-+ */
-+ if (unlikely(!tracer_frame) && i == 1) {
-+ tracer_frame = (p - stack) *
-+ sizeof(unsigned long);
-+ max_stack_size -= tracer_frame;
-+ }
- }
- }
-
-@@ -110,6 +150,7 @@ static inline void check_stack(void)
- static void
- stack_trace_call(unsigned long ip, unsigned long parent_ip)
- {
-+ unsigned long stack;
- int cpu;
-
- if (unlikely(!ftrace_enabled || stack_trace_disabled))
-@@ -122,7 +163,26 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip)
- if (per_cpu(trace_active, cpu)++ != 0)
- goto out;
-
-- check_stack();
-+ /*
-+ * When fentry is used, the traced function does not get
-+ * its stack frame set up, and we lose the parent.
-+ * The ip is pretty useless because the function tracer
-+ * was called before that function set up its stack frame.
-+ * In this case, we use the parent ip.
-+ *
-+ * By adding the return address of either the parent ip
-+ * or the current ip we can disregard most of the stack usage
-+ * caused by the stack tracer itself.
-+ *
-+ * The function tracer always reports the address of where the
-+ * mcount call was, but the stack will hold the return address.
-+ */
-+ if (fentry)
-+ ip = parent_ip;
-+ else
-+ ip += MCOUNT_INSN_SIZE;
-+
-+ check_stack(ip, &stack);
-
- out:
- per_cpu(trace_active, cpu)--;
-@@ -351,6 +411,8 @@ static __init int stack_trace_init(void)
- struct dentry *d_tracer;
-
- d_tracer = tracing_init_dentry();
-+ if (!d_tracer)
-+ return 0;
-
- trace_create_file("stack_max_size", 0644, d_tracer,
- &max_stack_size, &stack_max_size_fops);
-diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c
-index 96cffb2..847f88a 100644
---- a/kernel/trace/trace_stat.c
-+++ b/kernel/trace/trace_stat.c
-@@ -307,6 +307,8 @@ static int tracing_stat_init(void)
- struct dentry *d_tracing;
-
- d_tracing = tracing_init_dentry();
-+ if (!d_tracing)
-+ return 0;
-
- stat_dir = debugfs_create_dir("trace_stat", d_tracing);
- if (!stat_dir)
-diff --git a/mm/memory.c b/mm/memory.c
-index 4f2add1..d5f913b 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -2309,6 +2309,53 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
- }
- EXPORT_SYMBOL(remap_pfn_range);
-
-+/**
-+ * vm_iomap_memory - remap memory to userspace
-+ * @vma: user vma to map to
-+ * @start: start of area
-+ * @len: size of area
-+ *
-+ * This is a simplified io_remap_pfn_range() for common driver use. The
-+ * driver just needs to give us the physical memory range to be mapped,
-+ * we'll figure out the rest from the vma information.
-+ *
-+ * NOTE! Some drivers might want to tweak vma->vm_page_prot first to get
-+ * whatever write-combining details or similar.
-+ */
-+int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len)
-+{
-+ unsigned long vm_len, pfn, pages;
-+
-+ /* Check that the physical memory area passed in looks valid */
-+ if (start + len < start)
-+ return -EINVAL;
-+ /*
-+ * You *really* shouldn't map things that aren't page-aligned,
-+ * but we've historically allowed it because IO memory might
-+ * just have smaller alignment.
-+ */
-+ len += start & ~PAGE_MASK;
-+ pfn = start >> PAGE_SHIFT;
-+ pages = (len + ~PAGE_MASK) >> PAGE_SHIFT;
-+ if (pfn + pages < pfn)
-+ return -EINVAL;
-+
-+ /* We start the mapping 'vm_pgoff' pages into the area */
-+ if (vma->vm_pgoff > pages)
-+ return -EINVAL;
-+ pfn += vma->vm_pgoff;
-+ pages -= vma->vm_pgoff;
-+
-+ /* Can we fit all of the mapping? */
-+ vm_len = vma->vm_end - vma->vm_start;
-+ if (vm_len >> PAGE_SHIFT > pages)
-+ return -EINVAL;
-+
-+ /* Ok, let it rip */
-+ return io_remap_pfn_range(vma, vma->vm_start, pfn, vm_len, vma->vm_page_prot);
-+}
-+EXPORT_SYMBOL(vm_iomap_memory);
-+
- static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
- unsigned long addr, unsigned long end,
- pte_fn_t fn, void *data)
-diff --git a/net/atm/common.c b/net/atm/common.c
-index 0ca06e8..43b6bfe 100644
---- a/net/atm/common.c
-+++ b/net/atm/common.c
-@@ -500,6 +500,8 @@ int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
- struct sk_buff *skb;
- int copied, error = -EINVAL;
-
-+ msg->msg_namelen = 0;
-+
- if (sock->state != SS_CONNECTED)
- return -ENOTCONN;
- if (flags & ~MSG_DONTWAIT) /* only handle MSG_DONTWAIT */
-diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
-index b04a6ef..86ac37f 100644
---- a/net/ax25/af_ax25.c
-+++ b/net/ax25/af_ax25.c
-@@ -1641,6 +1641,7 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
- ax25_address src;
- const unsigned char *mac = skb_mac_header(skb);
-
-+ memset(sax, 0, sizeof(struct full_sockaddr_ax25));
- ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
- &digi, NULL, NULL);
- sax->sax25_family = AF_AX25;
-diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
-index 062124c..838f113 100644
---- a/net/bluetooth/af_bluetooth.c
-+++ b/net/bluetooth/af_bluetooth.c
-@@ -245,6 +245,8 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
- if (flags & (MSG_OOB))
- return -EOPNOTSUPP;
-
-+ msg->msg_namelen = 0;
-+
- skb = skb_recv_datagram(sk, flags, noblock, &err);
- if (!skb) {
- if (sk->sk_shutdown & RCV_SHUTDOWN)
-@@ -252,8 +254,6 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
- return err;
- }
-
-- msg->msg_namelen = 0;
--
- copied = skb->len;
- if (len < copied) {
- msg->msg_flags |= MSG_TRUNC;
-diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
-index 14c4864..82ce164 100644
---- a/net/bluetooth/rfcomm/sock.c
-+++ b/net/bluetooth/rfcomm/sock.c
-@@ -627,6 +627,7 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
-
- if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
- rfcomm_dlc_accept(d);
-+ msg->msg_namelen = 0;
- return 0;
- }
-
-diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
-index a986280..53a8e37 100644
---- a/net/caif/caif_socket.c
-+++ b/net/caif/caif_socket.c
-@@ -320,6 +320,8 @@ static int caif_seqpkt_recvmsg(struct kiocb *iocb, struct socket *sock,
- if (m->msg_flags&MSG_OOB)
- goto read_error;
-
-+ m->msg_namelen = 0;
-+
- skb = skb_recv_datagram(sk, flags, 0 , &ret);
- if (!skb)
- goto read_error;
-diff --git a/net/core/dev.c b/net/core/dev.c
-index 720aea0..8e455b8 100644
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -1619,6 +1619,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
- skb->mark = 0;
- secpath_reset(skb);
- nf_reset(skb);
-+ nf_reset_trace(skb);
- return netif_rx(skb);
- }
- EXPORT_SYMBOL_GPL(dev_forward_skb);
-diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c
-index 0387da0..cd09414 100644
---- a/net/core/dev_addr_lists.c
-+++ b/net/core/dev_addr_lists.c
-@@ -57,7 +57,7 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list,
- ha->type = addr_type;
- ha->refcount = 1;
- ha->global_use = global;
-- ha->synced = false;
-+ ha->synced = 0;
- list_add_tail_rcu(&ha->list, &list->list);
- list->count++;
- return 0;
-@@ -155,7 +155,7 @@ int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
- addr_len, ha->type);
- if (err)
- break;
-- ha->synced = true;
-+ ha->synced++;
- ha->refcount++;
- } else if (ha->refcount == 1) {
- __hw_addr_del(to_list, ha->addr, addr_len, ha->type);
-@@ -176,7 +176,7 @@ void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
- if (ha->synced) {
- __hw_addr_del(to_list, ha->addr,
- addr_len, ha->type);
-- ha->synced = false;
-+ ha->synced--;
- __hw_addr_del(from_list, ha->addr,
- addr_len, ha->type);
- }
-diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
-index 3b5e680..5b7d5f2 100644
---- a/net/core/rtnetlink.c
-+++ b/net/core/rtnetlink.c
-@@ -1064,7 +1064,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
- rcu_read_lock();
- cb->seq = net->dev_base_seq;
-
-- if (nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
-+ if (nlmsg_parse(cb->nlh, sizeof(struct ifinfomsg), tb, IFLA_MAX,
- ifla_policy) >= 0) {
-
- if (tb[IFLA_EXT_MASK])
-@@ -1907,7 +1907,7 @@ static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh)
- u32 ext_filter_mask = 0;
- u16 min_ifinfo_dump_size = 0;
-
-- if (nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
-+ if (nlmsg_parse(nlh, sizeof(struct ifinfomsg), tb, IFLA_MAX,
- ifla_policy) >= 0) {
- if (tb[IFLA_EXT_MASK])
- ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
-diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
-index 530787b..238fc3b 100644
---- a/net/ipv4/esp4.c
-+++ b/net/ipv4/esp4.c
-@@ -137,8 +137,6 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
-
- /* skb is pure payload to encrypt */
-
-- err = -ENOMEM;
--
- esp = x->data;
- aead = esp->aead;
- alen = crypto_aead_authsize(aead);
-@@ -174,8 +172,10 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
- }
-
- tmp = esp_alloc_tmp(aead, nfrags + sglists, seqhilen);
-- if (!tmp)
-+ if (!tmp) {
-+ err = -ENOMEM;
- goto error;
-+ }
-
- seqhi = esp_tmp_seqhi(tmp);
- iv = esp_tmp_iv(aead, tmp, seqhilen);
-diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
-index b2cfe83..8f441b2 100644
---- a/net/ipv4/ip_fragment.c
-+++ b/net/ipv4/ip_fragment.c
-@@ -251,8 +251,7 @@ static void ip_expire(unsigned long arg)
- if (!head->dev)
- goto out_rcu_unlock;
-
-- /* skb dst is stale, drop it, and perform route lookup again */
-- skb_dst_drop(head);
-+ /* skb has no dst, perform route lookup again */
- iph = ip_hdr(head);
- err = ip_route_input_noref(head, iph->daddr, iph->saddr,
- iph->tos, head->dev);
-@@ -518,8 +517,16 @@ found:
- qp->q.last_in |= INET_FRAG_FIRST_IN;
-
- if (qp->q.last_in == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) &&
-- qp->q.meat == qp->q.len)
-- return ip_frag_reasm(qp, prev, dev);
-+ qp->q.meat == qp->q.len) {
-+ unsigned long orefdst = skb->_skb_refdst;
-+
-+ skb->_skb_refdst = 0UL;
-+ err = ip_frag_reasm(qp, prev, dev);
-+ skb->_skb_refdst = orefdst;
-+ return err;
-+ }
-+
-+ skb_dst_drop(skb);
-
- write_lock(&ip4_frags.lock);
- list_move_tail(&qp->q.lru_list, &qp->q.net->lru_list);
-diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c
-index 769c0e9..8a1bed2 100644
---- a/net/ipv4/syncookies.c
-+++ b/net/ipv4/syncookies.c
-@@ -347,8 +347,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
- * hasn't changed since we received the original syn, but I see
- * no easy way to do this.
- */
-- flowi4_init_output(&fl4, 0, sk->sk_mark, RT_CONN_FLAGS(sk),
-- RT_SCOPE_UNIVERSE, IPPROTO_TCP,
-+ flowi4_init_output(&fl4, sk->sk_bound_dev_if, sk->sk_mark,
-+ RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, IPPROTO_TCP,
- inet_sk_flowi_flags(sk),
- (opt && opt->srr) ? opt->faddr : ireq->rmt_addr,
- ireq->loc_addr, th->source, th->dest);
-diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
-index 3124e17..872b41d 100644
---- a/net/ipv4/tcp_input.c
-+++ b/net/ipv4/tcp_input.c
-@@ -115,6 +115,7 @@ int sysctl_tcp_abc __read_mostly;
- #define FLAG_DSACKING_ACK 0x800 /* SACK blocks contained D-SACK info */
- #define FLAG_NONHEAD_RETRANS_ACKED 0x1000 /* Non-head rexmitted data was ACKed */
- #define FLAG_SACK_RENEGING 0x2000 /* snd_una advanced to a sacked seq */
-+#define FLAG_UPDATE_TS_RECENT 0x4000 /* tcp_replace_ts_recent() */
-
- #define FLAG_ACKED (FLAG_DATA_ACKED|FLAG_SYN_ACKED)
- #define FLAG_NOT_DUP (FLAG_DATA|FLAG_WIN_UPDATE|FLAG_ACKED)
-@@ -3723,6 +3724,27 @@ static void tcp_send_challenge_ack(struct sock *sk)
- }
- }
-
-+static void tcp_store_ts_recent(struct tcp_sock *tp)
-+{
-+ tp->rx_opt.ts_recent = tp->rx_opt.rcv_tsval;
-+ tp->rx_opt.ts_recent_stamp = get_seconds();
-+}
-+
-+static void tcp_replace_ts_recent(struct tcp_sock *tp, u32 seq)
-+{
-+ if (tp->rx_opt.saw_tstamp && !after(seq, tp->rcv_wup)) {
-+ /* PAWS bug workaround wrt. ACK frames, the PAWS discard
-+ * extra check below makes sure this can only happen
-+ * for pure ACK frames. -DaveM
-+ *
-+ * Not only, also it occurs for expired timestamps.
-+ */
-+
-+ if (tcp_paws_check(&tp->rx_opt, 0))
-+ tcp_store_ts_recent(tp);
-+ }
-+}
-+
- /* This routine deals with incoming acks, but not outgoing ones. */
- static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
- {
-@@ -3771,6 +3793,12 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
- prior_fackets = tp->fackets_out;
- prior_in_flight = tcp_packets_in_flight(tp);
-
-+ /* ts_recent update must be made after we are sure that the packet
-+ * is in window.
-+ */
-+ if (flag & FLAG_UPDATE_TS_RECENT)
-+ tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
-+
- if (!(flag & FLAG_SLOWPATH) && after(ack, prior_snd_una)) {
- /* Window is constant, pure forward advance.
- * No more checks are required.
-@@ -4061,27 +4089,6 @@ const u8 *tcp_parse_md5sig_option(const struct tcphdr *th)
- EXPORT_SYMBOL(tcp_parse_md5sig_option);
- #endif
-
--static inline void tcp_store_ts_recent(struct tcp_sock *tp)
--{
-- tp->rx_opt.ts_recent = tp->rx_opt.rcv_tsval;
-- tp->rx_opt.ts_recent_stamp = get_seconds();
--}
--
--static inline void tcp_replace_ts_recent(struct tcp_sock *tp, u32 seq)
--{
-- if (tp->rx_opt.saw_tstamp && !after(seq, tp->rcv_wup)) {
-- /* PAWS bug workaround wrt. ACK frames, the PAWS discard
-- * extra check below makes sure this can only happen
-- * for pure ACK frames. -DaveM
-- *
-- * Not only, also it occurs for expired timestamps.
-- */
--
-- if (tcp_paws_check(&tp->rx_opt, 0))
-- tcp_store_ts_recent(tp);
-- }
--}
--
- /* Sorry, PAWS as specified is broken wrt. pure-ACKs -DaveM
- *
- * It is not fatal. If this ACK does _not_ change critical state (seqs, window)
-@@ -5552,14 +5559,10 @@ slow_path:
- return 0;
-
- step5:
-- if (th->ack && tcp_ack(sk, skb, FLAG_SLOWPATH) < 0)
-+ if (th->ack &&
-+ tcp_ack(sk, skb, FLAG_SLOWPATH | FLAG_UPDATE_TS_RECENT) < 0)
- goto discard;
-
-- /* ts_recent update must be made after we are sure that the packet
-- * is in window.
-- */
-- tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
--
- tcp_rcv_rtt_measure_ts(sk, skb);
-
- /* Process urgent data. */
-@@ -5923,7 +5926,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
-
- /* step 5: check the ACK field */
- if (th->ack) {
-- int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH) > 0;
-+ int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH |
-+ FLAG_UPDATE_TS_RECENT) > 0;
-
- switch (sk->sk_state) {
- case TCP_SYN_RECV:
-@@ -6030,11 +6034,6 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
- } else
- goto discard;
-
-- /* ts_recent update must be made after we are sure that the packet
-- * is in window.
-- */
-- tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
--
- /* step 6: check the URG bit */
- tcp_urg(sk, skb, th);
-
-diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 8589c2d..d84033b 100644
---- a/net/ipv6/addrconf.c
-+++ b/net/ipv6/addrconf.c
-@@ -2404,6 +2404,9 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
- static void init_loopback(struct net_device *dev)
- {
- struct inet6_dev *idev;
-+ struct net_device *sp_dev;
-+ struct inet6_ifaddr *sp_ifa;
-+ struct rt6_info *sp_rt;
-
- /* ::1 */
-
-@@ -2415,6 +2418,30 @@ static void init_loopback(struct net_device *dev)
- }
-
- add_addr(idev, &in6addr_loopback, 128, IFA_HOST);
-+
-+ /* Add routes to other interface's IPv6 addresses */
-+ for_each_netdev(dev_net(dev), sp_dev) {
-+ if (!strcmp(sp_dev->name, dev->name))
-+ continue;
-+
-+ idev = __in6_dev_get(sp_dev);
-+ if (!idev)
-+ continue;
-+
-+ read_lock_bh(&idev->lock);
-+ list_for_each_entry(sp_ifa, &idev->addr_list, if_list) {
-+
-+ if (sp_ifa->flags & (IFA_F_DADFAILED | IFA_F_TENTATIVE))
-+ continue;
-+
-+ sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0);
-+
-+ /* Failure cases are ignored */
-+ if (!IS_ERR(sp_rt))
-+ ip6_ins_rt(sp_rt);
-+ }
-+ read_unlock_bh(&idev->lock);
-+ }
- }
-
- static void addrconf_add_linklocal(struct inet6_dev *idev, const struct in6_addr *addr)
-diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
-index 2b0a4ca..411fe2c 100644
---- a/net/ipv6/reassembly.c
-+++ b/net/ipv6/reassembly.c
-@@ -386,8 +386,17 @@ found:
- }
-
- if (fq->q.last_in == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) &&
-- fq->q.meat == fq->q.len)
-- return ip6_frag_reasm(fq, prev, dev);
-+ fq->q.meat == fq->q.len) {
-+ int res;
-+ unsigned long orefdst = skb->_skb_refdst;
-+
-+ skb->_skb_refdst = 0UL;
-+ res = ip6_frag_reasm(fq, prev, dev);
-+ skb->_skb_refdst = orefdst;
-+ return res;
-+ }
-+
-+ skb_dst_drop(skb);
-
- write_lock(&ip6_frags.lock);
- list_move_tail(&fq->q.lru_list, &fq->q.net->lru_list);
-diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
-index f4b49c5..91821e9 100644
---- a/net/irda/af_irda.c
-+++ b/net/irda/af_irda.c
-@@ -1386,6 +1386,8 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock,
-
- IRDA_DEBUG(4, "%s()\n", __func__);
-
-+ msg->msg_namelen = 0;
-+
- skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
- flags & MSG_DONTWAIT, &err);
- if (!skb)
-diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
-index cf98d62..e836140 100644
---- a/net/iucv/af_iucv.c
-+++ b/net/iucv/af_iucv.c
-@@ -1356,6 +1356,8 @@ static int iucv_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
- int blen;
- int err = 0;
-
-+ msg->msg_namelen = 0;
-+
- if ((sk->sk_state == IUCV_DISCONN || sk->sk_state == IUCV_SEVERED) &&
- skb_queue_empty(&iucv->backlog_skb_q) &&
- skb_queue_empty(&sk->sk_receive_queue) &&
-diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
-index 99a60d5..e5565c7 100644
---- a/net/llc/af_llc.c
-+++ b/net/llc/af_llc.c
-@@ -720,6 +720,8 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
- int target; /* Read at least this many bytes */
- long timeo;
-
-+ msg->msg_namelen = 0;
-+
- lock_sock(sk);
- copied = -ENOTCONN;
- if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN))
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index f156382..3df7c5a 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -1178,6 +1178,7 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
- }
-
- if (sax != NULL) {
-+ memset(sax, 0, sizeof(*sax));
- sax->sax25_family = AF_NETROM;
- skb_copy_from_linear_data_offset(skb, 7, sax->sax25_call.ax25_call,
- AX25_ADDR_LEN);
-diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
-index f9ea925..1f96fb9 100644
---- a/net/rose/af_rose.c
-+++ b/net/rose/af_rose.c
-@@ -1258,6 +1258,7 @@ static int rose_recvmsg(struct kiocb *iocb, struct socket *sock,
- skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
-
- if (srose != NULL) {
-+ memset(srose, 0, msg->msg_namelen);
- srose->srose_family = AF_ROSE;
- srose->srose_addr = rose->dest_addr;
- srose->srose_call = rose->dest_call;
-diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
-index 599f67a..b7cddb9 100644
---- a/net/sched/sch_cbq.c
-+++ b/net/sched/sch_cbq.c
-@@ -963,8 +963,11 @@ cbq_dequeue(struct Qdisc *sch)
- cbq_update(q);
- if ((incr -= incr2) < 0)
- incr = 0;
-+ q->now += incr;
-+ } else {
-+ if (now > q->now)
-+ q->now = now;
- }
-- q->now += incr;
- q->now_rt = now;
-
- for (;;) {
-diff --git a/net/sctp/auth.c b/net/sctp/auth.c
-index bf81204..333926d 100644
---- a/net/sctp/auth.c
-+++ b/net/sctp/auth.c
-@@ -71,7 +71,7 @@ void sctp_auth_key_put(struct sctp_auth_bytes *key)
- return;
-
- if (atomic_dec_and_test(&key->refcnt)) {
-- kfree(key);
-+ kzfree(key);
- SCTP_DBG_OBJCNT_DEC(keys);
- }
- }
-diff --git a/net/tipc/socket.c b/net/tipc/socket.c
-index 42b8324..fdf34af 100644
---- a/net/tipc/socket.c
-+++ b/net/tipc/socket.c
-@@ -829,6 +829,7 @@ static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)
- if (addr) {
- addr->family = AF_TIPC;
- addr->addrtype = TIPC_ADDR_ID;
-+ memset(&addr->addr, 0, sizeof(addr->addr));
- addr->addr.id.ref = msg_origport(msg);
- addr->addr.id.node = msg_orignode(msg);
- addr->addr.name.domain = 0; /* could leave uninitialized */
-@@ -948,6 +949,9 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock,
- goto exit;
- }
-
-+ /* will be updated in set_orig_addr() if needed */
-+ m->msg_namelen = 0;
-+
- timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
- restart:
-
-@@ -1074,6 +1078,9 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock,
- goto exit;
- }
-
-+ /* will be updated in set_orig_addr() if needed */
-+ m->msg_namelen = 0;
-+
- target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len);
- timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
- restart:
-diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
-index 18978b6..5611563 100644
---- a/net/unix/af_unix.c
-+++ b/net/unix/af_unix.c
-@@ -1956,7 +1956,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
- if ((UNIXCB(skb).pid != siocb->scm->pid) ||
- (UNIXCB(skb).cred != siocb->scm->cred))
- break;
-- } else {
-+ } else if (test_bit(SOCK_PASSCRED, &sock->flags)) {
- /* Copy credentials */
- scm_set_cred(siocb->scm, UNIXCB(skb).pid, UNIXCB(skb).cred);
- check_creds = 1;
-diff --git a/net/wireless/reg.c b/net/wireless/reg.c
-index 0b08905..21958cd 100644
---- a/net/wireless/reg.c
-+++ b/net/wireless/reg.c
-@@ -853,7 +853,7 @@ static void handle_channel(struct wiphy *wiphy,
- return;
-
- REG_DBG_PRINT("Disabling freq %d MHz\n", chan->center_freq);
-- chan->flags = IEEE80211_CHAN_DISABLED;
-+ chan->flags |= IEEE80211_CHAN_DISABLED;
- return;
- }
-
-diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
-index 7ada40e..638600b 100644
---- a/sound/core/pcm_native.c
-+++ b/sound/core/pcm_native.c
-@@ -3204,18 +3204,10 @@ EXPORT_SYMBOL_GPL(snd_pcm_lib_default_mmap);
- int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream,
- struct vm_area_struct *area)
- {
-- long size;
-- unsigned long offset;
-+ struct snd_pcm_runtime *runtime = substream->runtime;;
-
- area->vm_page_prot = pgprot_noncached(area->vm_page_prot);
-- area->vm_flags |= VM_IO;
-- size = area->vm_end - area->vm_start;
-- offset = area->vm_pgoff << PAGE_SHIFT;
-- if (io_remap_pfn_range(area, area->vm_start,
-- (substream->runtime->dma_addr + offset) >> PAGE_SHIFT,
-- size, area->vm_page_prot))
-- return -EAGAIN;
-- return 0;
-+ return vm_iomap_memory(area, runtime->dma_addr, runtime->dma_bytes);
- }
-
- EXPORT_SYMBOL(snd_pcm_lib_mmap_iomem);
-diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c
-index ebbf63c..b7cf246 100644
---- a/sound/soc/codecs/max98088.c
-+++ b/sound/soc/codecs/max98088.c
-@@ -2007,7 +2007,7 @@ static int max98088_probe(struct snd_soc_codec *codec)
- ret);
- goto err_access;
- }
-- dev_info(codec->dev, "revision %c\n", ret + 'A');
-+ dev_info(codec->dev, "revision %c\n", ret - 0x40 + 'A');
-
- snd_soc_write(codec, M98088_REG_51_PWR_SYS, M98088_PWRSV);
-
-diff --git a/sound/usb/card.c b/sound/usb/card.c
-index 566acb3..acb7fac 100644
---- a/sound/usb/card.c
-+++ b/sound/usb/card.c
-@@ -611,7 +611,9 @@ int snd_usb_autoresume(struct snd_usb_audio *chip)
- int err = -ENODEV;
-
- down_read(&chip->shutdown_rwsem);
-- if (!chip->shutdown && !chip->probing)
-+ if (chip->probing)
-+ err = 0;
-+ else if (!chip->shutdown)
- err = usb_autopm_get_interface(chip->pm_intf);
- up_read(&chip->shutdown_rwsem);
-
-diff --git a/sound/usb/card.h b/sound/usb/card.h
-index 665e297..2b7559c 100644
---- a/sound/usb/card.h
-+++ b/sound/usb/card.h
-@@ -73,6 +73,7 @@ struct snd_usb_substream {
- unsigned int fill_max: 1; /* fill max packet size always */
- unsigned int txfr_quirk:1; /* allow sub-frame alignment */
- unsigned int fmt_type; /* USB audio format type (1-3) */
-+ unsigned int pkt_offset_adj; /* Bytes to drop from beginning of packets (for non-compliant devices) */
-
- unsigned int running: 1; /* running status */
-
-diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
-index 9ab2b3e..5ebe8c4 100644
---- a/sound/usb/endpoint.c
-+++ b/sound/usb/endpoint.c
-@@ -458,7 +458,7 @@ static int retire_capture_urb(struct snd_usb_substream *subs,
- stride = runtime->frame_bits >> 3;
-
- for (i = 0; i < urb->number_of_packets; i++) {
-- cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset;
-+ cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset + subs->pkt_offset_adj;
- if (urb->iso_frame_desc[i].status && printk_ratelimit()) {
- snd_printdd("frame %d active: %d\n", i, urb->iso_frame_desc[i].status);
- // continue;
-@@ -898,6 +898,7 @@ void snd_usb_init_substream(struct snd_usb_stream *as,
- subs->speed = snd_usb_get_speed(subs->dev);
- if (subs->speed >= USB_SPEED_HIGH)
- subs->ops.prepare_sync = prepare_capture_sync_urb_hs;
-+ subs->pkt_offset_adj = 0;
-
- snd_usb_set_pcm_ops(as->pcm, stream);
-
-diff --git a/sound/usb/midi.c b/sound/usb/midi.c
-index 34b9bb7..e5fee18 100644
---- a/sound/usb/midi.c
-+++ b/sound/usb/midi.c
-@@ -126,7 +126,6 @@ struct snd_usb_midi {
- struct snd_usb_midi_in_endpoint *in;
- } endpoints[MIDI_MAX_ENDPOINTS];
- unsigned long input_triggered;
-- bool autopm_reference;
- unsigned int opened[2];
- unsigned char disconnected;
- unsigned char input_running;
-@@ -1040,7 +1039,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir,
- {
- struct snd_usb_midi* umidi = substream->rmidi->private_data;
- struct snd_kcontrol *ctl;
-- int err;
-
- down_read(&umidi->disc_rwsem);
- if (umidi->disconnected) {
-@@ -1051,13 +1049,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir,
- mutex_lock(&umidi->mutex);
- if (open) {
- if (!umidi->opened[0] && !umidi->opened[1]) {
-- err = usb_autopm_get_interface(umidi->iface);
-- umidi->autopm_reference = err >= 0;
-- if (err < 0 && err != -EACCES) {
-- mutex_unlock(&umidi->mutex);
-- up_read(&umidi->disc_rwsem);
-- return -EIO;
-- }
- if (umidi->roland_load_ctl) {
- ctl = umidi->roland_load_ctl;
- ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
-@@ -1080,8 +1071,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir,
- snd_ctl_notify(umidi->card,
- SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
- }
-- if (umidi->autopm_reference)
-- usb_autopm_put_interface(umidi->iface);
- }
- }
- mutex_unlock(&umidi->mutex);
-@@ -2256,6 +2245,8 @@ int snd_usbmidi_create(struct snd_card *card,
- return err;
- }
-
-+ usb_autopm_get_interface_no_resume(umidi->iface);
-+
- list_add_tail(&umidi->list, midi_list);
- return 0;
- }
-diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
-index dfbd65d..42eeee8 100644
---- a/sound/usb/quirks.c
-+++ b/sound/usb/quirks.c
-@@ -744,6 +744,7 @@ static void set_format_emu_quirk(struct snd_usb_substream *subs,
- break;
- }
- snd_emuusb_set_samplerate(subs->stream->chip, emu_samplerate_id);
-+ subs->pkt_offset_adj = (emu_samplerate_id >= EMU_QUIRK_SR_176400HZ) ? 4 : 0;
- }
-
- void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
-diff --git a/sound/usb/stream.c b/sound/usb/stream.c
-index 5ff8010..33a335b 100644
---- a/sound/usb/stream.c
-+++ b/sound/usb/stream.c
-@@ -168,6 +168,14 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip,
- if (!csep && altsd->bNumEndpoints >= 2)
- csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
-
-+ /*
-+ * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra
-+ * bytes after the first endpoint, go search the entire interface.
-+ * Some devices have it directly *before* the standard endpoint.
-+ */
-+ if (!csep)
-+ csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT);
-+
- if (!csep || csep->bLength < 7 ||
- csep->bDescriptorSubtype != UAC_EP_GENERAL) {
- snd_printk(KERN_WARNING "%d:%u:%d : no or invalid"