commit:     2a83da120accdc9f3d66856fcc4b60dea3f4a9f3
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Fri Jul 10 23:26:15 2015 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Fri Jul 10 23:26:15 2015 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=2a83da12

Linux patch 3.10.84

 0000_README              |   4 +
 1083_linux-3.10.84.patch | 369 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 373 insertions(+)

diff --git a/0000_README b/0000_README
index 1cfdd1d..fc173a9 100644
--- a/0000_README
+++ b/0000_README
@@ -374,6 +374,10 @@ Patch:  1082_linux-3.10.83.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.10.83
 
+Patch:  1083_linux-3.10.84.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.10.84
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1083_linux-3.10.84.patch b/1083_linux-3.10.84.patch
new file mode 100644
index 0000000..2851596
--- /dev/null
+++ b/1083_linux-3.10.84.patch
@@ -0,0 +1,369 @@
+diff --git a/Makefile b/Makefile
+index 21529dbcc11d..f7b10bb56737 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 10
+-SUBLEVEL = 83
++SUBLEVEL = 84
+ EXTRAVERSION =
+ NAME = TOSSUG Baby Fish
+ 
+diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
+index 16cd4ba5d7fd..bb117abb1b3b 100644
+--- a/arch/arm/kvm/interrupts.S
++++ b/arch/arm/kvm/interrupts.S
+@@ -159,13 +159,9 @@ __kvm_vcpu_return:
+       @ Don't trap coprocessor accesses for host kernel
+       set_hstr vmexit
+       set_hdcr vmexit
+-      set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11))
++      set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)), 
after_vfp_restore
+ 
+ #ifdef CONFIG_VFPv3
+-      @ Save floating point registers we if let guest use them.
+-      tst     r2, #(HCPTR_TCP(10) | HCPTR_TCP(11))
+-      bne     after_vfp_restore
+-
+       @ Switch VFP/NEON hardware state to the host's
+       add     r7, vcpu, #VCPU_VFP_GUEST
+       store_vfp_state r7
+@@ -177,6 +173,8 @@ after_vfp_restore:
+       @ Restore FPEXC_EN which we clobbered on entry
+       pop     {r2}
+       VFPFMXR FPEXC, r2
++#else
++after_vfp_restore:
+ #endif
+ 
+       @ Reset Hyp-role
+@@ -458,7 +456,7 @@ switch_to_guest_vfp:
+       push    {r3-r7}
+ 
+       @ NEON/VFP used.  Turn on VFP access.
+-      set_hcptr vmexit, (HCPTR_TCP(10) | HCPTR_TCP(11))
++      set_hcptr vmtrap, (HCPTR_TCP(10) | HCPTR_TCP(11))
+ 
+       @ Switch VFP/NEON hardware state to the guest's
+       add     r7, r0, #VCPU_VFP_HOST
+diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S
+index 6f18695a09cb..b6f6137f5984 100644
+--- a/arch/arm/kvm/interrupts_head.S
++++ b/arch/arm/kvm/interrupts_head.S
+@@ -570,8 +570,13 @@ vcpu      .req    r0              @ vcpu pointer always 
in r0
+ .endm
+ 
+ /* Configures the HCPTR (Hyp Coprocessor Trap Register) on entry/return
+- * (hardware reset value is 0). Keep previous value in r2. */
+-.macro set_hcptr operation, mask
++ * (hardware reset value is 0). Keep previous value in r2.
++ * An ISB is emited on vmexit/vmtrap, but executed on vmexit only if
++ * VFP wasn't already enabled (always executed on vmtrap).
++ * If a label is specified with vmexit, it is branched to if VFP wasn't
++ * enabled.
++ */
++.macro set_hcptr operation, mask, label = none
+       mrc     p15, 4, r2, c1, c1, 2
+       ldr     r3, =\mask
+       .if \operation == vmentry
+@@ -580,6 +585,17 @@ vcpu      .req    r0              @ vcpu pointer always 
in r0
+       bic     r3, r2, r3              @ Don't trap defined coproc-accesses
+       .endif
+       mcr     p15, 4, r3, c1, c1, 2
++      .if \operation != vmentry
++      .if \operation == vmexit
++      tst     r2, #(HCPTR_TCP(10) | HCPTR_TCP(11))
++      beq     1f
++      .endif
++      isb
++      .if \label != none
++      b       \label
++      .endif
++1:
++      .endif
+ .endm
+ 
+ /* Configures the HDCR (Hyp Debug Configuration Register) on entry/return
+diff --git a/arch/mips/include/asm/mach-generic/spaces.h 
b/arch/mips/include/asm/mach-generic/spaces.h
+index 5b2f2e68e57f..503eb6ca5802 100644
+--- a/arch/mips/include/asm/mach-generic/spaces.h
++++ b/arch/mips/include/asm/mach-generic/spaces.h
+@@ -90,7 +90,11 @@
+ #endif
+ 
+ #ifndef FIXADDR_TOP
++#ifdef CONFIG_KVM_GUEST
++#define FIXADDR_TOP           ((unsigned long)(long)(int)0x7ffe0000)
++#else
+ #define FIXADDR_TOP           ((unsigned long)(long)(int)0xfffe0000)
+ #endif
++#endif
+ 
+ #endif /* __ASM_MACH_GENERIC_SPACES_H */
+diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
+index 846861a20b07..b63dc809596d 100644
+--- a/arch/powerpc/perf/core-book3s.c
++++ b/arch/powerpc/perf/core-book3s.c
+@@ -112,7 +112,16 @@ static inline void power_pmu_bhrb_read(struct 
cpu_hw_events *cpuhw) {}
+ 
+ static bool regs_use_siar(struct pt_regs *regs)
+ {
+-      return !!regs->result;
++      /*
++       * When we take a performance monitor exception the regs are setup
++       * using perf_read_regs() which overloads some fields, in particular
++       * regs->result to tell us whether to use SIAR.
++       *
++       * However if the regs are from another exception, eg. a syscall, then
++       * they have not been setup using perf_read_regs() and so regs->result
++       * is something random.
++       */
++      return ((TRAP(regs) == 0xf00) && regs->result);
+ }
+ 
+ /*
+diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c
+index fa4c900a0d1f..62983d77455e 100644
+--- a/arch/sparc/kernel/ldc.c
++++ b/arch/sparc/kernel/ldc.c
+@@ -2306,7 +2306,7 @@ void *ldc_alloc_exp_dring(struct ldc_channel *lp, 
unsigned int len,
+       if (len & (8UL - 1))
+               return ERR_PTR(-EINVAL);
+ 
+-      buf = kzalloc(len, GFP_KERNEL);
++      buf = kzalloc(len, GFP_ATOMIC);
+       if (!buf)
+               return ERR_PTR(-ENOMEM);
+ 
+diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
+index 4c481e751e8e..98b68c2f1a1c 100644
+--- a/arch/x86/include/asm/kvm_host.h
++++ b/arch/x86/include/asm/kvm_host.h
+@@ -541,7 +541,7 @@ struct kvm_arch {
+       struct kvm_pic *vpic;
+       struct kvm_ioapic *vioapic;
+       struct kvm_pit *vpit;
+-      int vapics_in_nmi_mode;
++      atomic_t vapics_in_nmi_mode;
+       struct mutex apic_map_lock;
+       struct kvm_apic_map *apic_map;
+ 
+diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
+index 298781d4cfb4..1406ffde3e35 100644
+--- a/arch/x86/kvm/i8254.c
++++ b/arch/x86/kvm/i8254.c
+@@ -305,7 +305,7 @@ static void pit_do_work(struct kthread_work *work)
+                * LVT0 to NMI delivery. Other PIC interrupts are just sent to
+                * VCPU0, and only if its LVT0 is in EXTINT mode.
+                */
+-              if (kvm->arch.vapics_in_nmi_mode > 0)
++              if (atomic_read(&kvm->arch.vapics_in_nmi_mode) > 0)
+                       kvm_for_each_vcpu(i, vcpu, kvm)
+                               kvm_apic_nmi_wd_deliver(vcpu);
+       }
+diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
+index 681e4e251f00..ff280209d7de 100644
+--- a/arch/x86/kvm/lapic.c
++++ b/arch/x86/kvm/lapic.c
+@@ -1123,10 +1123,10 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic 
*apic, u32 lvt0_val)
+               if (!nmi_wd_enabled) {
+                       apic_debug("Receive NMI setting on APIC_LVT0 "
+                                  "for cpu %d\n", apic->vcpu->vcpu_id);
+-                      apic->vcpu->kvm->arch.vapics_in_nmi_mode++;
++                      atomic_inc(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
+               }
+       } else if (nmi_wd_enabled)
+-              apic->vcpu->kvm->arch.vapics_in_nmi_mode--;
++              atomic_dec(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
+ }
+ 
+ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
+diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
+index 3e724256dbee..a3b0265c2ca7 100644
+--- a/arch/x86/pci/acpi.c
++++ b/arch/x86/pci/acpi.c
+@@ -84,6 +84,17 @@ static const struct dmi_system_id pci_crs_quirks[] 
__initconst = {
+                       DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
+               },
+       },
++      /* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/931368 */
++      /* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1033299 */
++      {
++              .callback = set_use_crs,
++              .ident = "Foxconn K8M890-8237A",
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "Foxconn"),
++                      DMI_MATCH(DMI_BOARD_NAME, "K8M890-8237A"),
++                      DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
++              },
++      },
+ 
+       /* Now for the blacklist.. */
+ 
+diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
+index 5b2b5e61e4f9..057d894eee66 100644
+--- a/drivers/crypto/talitos.c
++++ b/drivers/crypto/talitos.c
+@@ -935,7 +935,8 @@ static int sg_to_link_tbl(struct scatterlist *sg, int 
sg_count,
+               sg_count--;
+               link_tbl_ptr--;
+       }
+-      be16_add_cpu(&link_tbl_ptr->len, cryptlen);
++      link_tbl_ptr->len = cpu_to_be16(be16_to_cpu(link_tbl_ptr->len)
++                                      + cryptlen);
+ 
+       /* tag end of link table */
+       link_tbl_ptr->j_extent = DESC_PTR_LNKTBL_RETURN;
+@@ -2621,6 +2622,7 @@ static struct talitos_crypto_alg 
*talitos_alg_alloc(struct device *dev,
+               break;
+       default:
+               dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
++              kfree(t_alg);
+               return ERR_PTR(-EINVAL);
+       }
+ 
+diff --git a/fs/inode.c b/fs/inode.c
+index 1b300a06b8be..17f95b417955 100644
+--- a/fs/inode.c
++++ b/fs/inode.c
+@@ -1628,8 +1628,8 @@ int file_remove_suid(struct file *file)
+               error = security_inode_killpriv(dentry);
+       if (!error && killsuid)
+               error = __remove_suid(dentry, killsuid);
+-      if (!error && (inode->i_sb->s_flags & MS_NOSEC))
+-              inode->i_flags |= S_NOSEC;
++      if (!error)
++              inode_has_no_xattr(inode);
+ 
+       return error;
+ }
+diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c
+index cd8c3a44ab7d..b73eaba85667 100644
+--- a/net/bridge/br_ioctl.c
++++ b/net/bridge/br_ioctl.c
+@@ -247,9 +247,7 @@ static int old_dev_ioctl(struct net_device *dev, struct 
ifreq *rq, int cmd)
+               if (!ns_capable(dev_net(dev)->user_ns, CAP_NET_ADMIN))
+                       return -EPERM;
+ 
+-              spin_lock_bh(&br->lock);
+               br_stp_set_bridge_priority(br, args[1]);
+-              spin_unlock_bh(&br->lock);
+               return 0;
+ 
+       case BRCTL_SET_PORT_PRIORITY:
+diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
+index 49b4a82d3f86..a09ea178348c 100644
+--- a/net/bridge/br_multicast.c
++++ b/net/bridge/br_multicast.c
+@@ -1026,6 +1026,9 @@ static void br_multicast_add_router(struct net_bridge 
*br,
+       struct net_bridge_port *p;
+       struct hlist_node *slot = NULL;
+ 
++      if (!hlist_unhashed(&port->rlist))
++              return;
++
+       hlist_for_each_entry(p, &br->router_list, rlist) {
+               if ((unsigned long) port >= (unsigned long) p)
+                       break;
+@@ -1053,12 +1056,8 @@ static void br_multicast_mark_router(struct net_bridge 
*br,
+       if (port->multicast_router != 1)
+               return;
+ 
+-      if (!hlist_unhashed(&port->rlist))
+-              goto timer;
+-
+       br_multicast_add_router(br, port);
+ 
+-timer:
+       mod_timer(&port->multicast_router_timer,
+                 now + br->multicast_querier_interval);
+ }
+diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c
+index 656a6f3e40de..886f6d6dc48a 100644
+--- a/net/bridge/br_stp_if.c
++++ b/net/bridge/br_stp_if.c
+@@ -241,12 +241,13 @@ bool br_stp_recalculate_bridge_id(struct net_bridge *br)
+       return true;
+ }
+ 
+-/* called under bridge lock */
++/* Acquires and releases bridge lock */
+ void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio)
+ {
+       struct net_bridge_port *p;
+       int wasroot;
+ 
++      spin_lock_bh(&br->lock);
+       wasroot = br_is_root_bridge(br);
+ 
+       list_for_each_entry(p, &br->port_list, list) {
+@@ -264,6 +265,7 @@ void br_stp_set_bridge_priority(struct net_bridge *br, u16 
newprio)
+       br_port_state_selection(br);
+       if (br_is_root_bridge(br) && !wasroot)
+               br_become_root_bridge(br);
++      spin_unlock_bh(&br->lock);
+ }
+ 
+ /* called under bridge lock */
+diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
+index 81b4b816f131..39fa33969b09 100644
+--- a/net/packet/af_packet.c
++++ b/net/packet/af_packet.c
+@@ -1150,16 +1150,6 @@ static void packet_sock_destruct(struct sock *sk)
+       sk_refcnt_debug_dec(sk);
+ }
+ 
+-static int fanout_rr_next(struct packet_fanout *f, unsigned int num)
+-{
+-      int x = atomic_read(&f->rr_cur) + 1;
+-
+-      if (x >= num)
+-              x = 0;
+-
+-      return x;
+-}
+-
+ static unsigned int fanout_demux_hash(struct packet_fanout *f,
+                                     struct sk_buff *skb,
+                                     unsigned int num)
+@@ -1171,13 +1161,9 @@ static unsigned int fanout_demux_lb(struct 
packet_fanout *f,
+                                   struct sk_buff *skb,
+                                   unsigned int num)
+ {
+-      int cur, old;
++      unsigned int val = atomic_inc_return(&f->rr_cur);
+ 
+-      cur = atomic_read(&f->rr_cur);
+-      while ((old = atomic_cmpxchg(&f->rr_cur, cur,
+-                                   fanout_rr_next(f, num))) != cur)
+-              cur = old;
+-      return cur;
++      return val % num;
+ }
+ 
+ static unsigned int fanout_demux_cpu(struct packet_fanout *f,
+@@ -1217,7 +1203,7 @@ static int packet_rcv_fanout(struct sk_buff *skb, struct 
net_device *dev,
+                            struct packet_type *pt, struct net_device 
*orig_dev)
+ {
+       struct packet_fanout *f = pt->af_packet_priv;
+-      unsigned int num = f->num_members;
++      unsigned int num = ACCESS_ONCE(f->num_members);
+       struct packet_sock *po;
+       unsigned int idx;
+ 
+diff --git a/net/sctp/output.c b/net/sctp/output.c
+index 73b8ca51ba14..2d9689333fe4 100644
+--- a/net/sctp/output.c
++++ b/net/sctp/output.c
+@@ -618,7 +618,9 @@ out:
+       return err;
+ no_route:
+       kfree_skb(nskb);
+-      IP_INC_STATS(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES);
++
++      if (asoc)
++              IP_INC_STATS(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES);
+ 
+       /* FIXME: Returning the 'err' will effect all the associations
+        * associated with a socket, although only one of the paths of the

Reply via email to