diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/blackfin/mach-common/pm.c linux-libre-3.12.53-gnu/arch/blackfin/mach-common/pm.c
--- linux-libre-3.12.52-gnu/arch/blackfin/mach-common/pm.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/blackfin/mach-common/pm.c	2016-01-27 03:56:20.000000000 -0500
@@ -144,7 +144,7 @@ int bfin_pm_suspend_mem_enter(void)
 
 	unsigned char *memptr = kmalloc(L1_CODE_LENGTH + L1_DATA_A_LENGTH
 					 + L1_DATA_B_LENGTH + L1_SCRATCH_LENGTH,
-					  GFP_KERNEL);
+					  GFP_ATOMIC);
 
 	if (memptr == NULL) {
 		panic("bf53x_suspend_l1_mem malloc failed");
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/m32r/include/asm/pgalloc.h linux-libre-3.12.53-gnu/arch/m32r/include/asm/pgalloc.h
--- linux-libre-3.12.52-gnu/arch/m32r/include/asm/pgalloc.h	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/m32r/include/asm/pgalloc.h	2016-01-27 03:56:20.000000000 -0500
@@ -43,6 +43,8 @@ static __inline__ pgtable_t pte_alloc_on
 {
 	struct page *pte = alloc_page(GFP_KERNEL|__GFP_ZERO);
 
+	if (!pte)
+		return NULL;
 	pgtable_page_ctor(pte);
 	return pte;
 }
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/m68k/kernel/head.S linux-libre-3.12.53-gnu/arch/m68k/kernel/head.S
--- linux-libre-3.12.52-gnu/arch/m68k/kernel/head.S	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/m68k/kernel/head.S	2016-01-27 03:56:20.000000000 -0500
@@ -2909,7 +2909,9 @@ func_start	serial_init,%d0/%d1/%a0/%a1
 
 #if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B)
 	movel	%pc@(L(mac_sccbase)),%a0
-	/* Reset SCC device */
+	/* Reset SCC register pointer */
+	moveb	%a0@(mac_scc_cha_a_ctrl_offset),%d0
+	/* Reset SCC device: write register pointer then register value */
 	moveb	#9,%a0@(mac_scc_cha_a_ctrl_offset)
 	moveb	#0xc0,%a0@(mac_scc_cha_a_ctrl_offset)
 	/* Wait for 5 PCLK cycles, which is about 68 CPU cycles */
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/m68k/mm/fault.c linux-libre-3.12.53-gnu/arch/m68k/mm/fault.c
--- linux-libre-3.12.52-gnu/arch/m68k/mm/fault.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/m68k/mm/fault.c	2016-01-27 03:56:20.000000000 -0500
@@ -77,8 +77,7 @@ int do_page_fault(struct pt_regs *regs,
 
 #ifdef DEBUG
 	printk ("do page fault:\nregs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld, %p\n",
-		regs->sr, regs->pc, address, error_code,
-		current->mm->pgd);
+		regs->sr, regs->pc, address, error_code, mm ? mm->pgd : NULL);
 #endif
 
 	/*
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/powerpc/kvm/book3s_hv.c linux-libre-3.12.53-gnu/arch/powerpc/kvm/book3s_hv.c
--- linux-libre-3.12.52-gnu/arch/powerpc/kvm/book3s_hv.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/powerpc/kvm/book3s_hv.c	2016-01-27 03:56:20.000000000 -0500
@@ -160,6 +160,12 @@ void kvmppc_core_vcpu_put(struct kvm_vcp
 
 void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr)
 {
+	/*
+	 * Check for illegal transactional state bit combination
+	 * and if we find it, force the TS field to a safe state.
+	 */
+	if ((msr & MSR_TS_MASK) == MSR_TS_MASK)
+		msr &= ~MSR_TS_MASK;
 	vcpu->arch.shregs.msr = msr;
 	kvmppc_end_cede(vcpu);
 }
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/x86/include/asm/boot.h linux-libre-3.12.53-gnu/arch/x86/include/asm/boot.h
--- linux-libre-3.12.52-gnu/arch/x86/include/asm/boot.h	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/x86/include/asm/boot.h	2016-01-27 03:56:20.000000000 -0500
@@ -27,7 +27,7 @@
 #define BOOT_HEAP_SIZE             0x400000
 #else /* !CONFIG_KERNEL_BZIP2 */
 
-#define BOOT_HEAP_SIZE	0x8000
+#define BOOT_HEAP_SIZE	0x10000
 
 #endif /* !CONFIG_KERNEL_BZIP2 */
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/x86/kernel/reboot.c linux-libre-3.12.53-gnu/arch/x86/kernel/reboot.c
--- linux-libre-3.12.52-gnu/arch/x86/kernel/reboot.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/x86/kernel/reboot.c	2016-01-27 03:56:20.000000000 -0500
@@ -180,6 +180,14 @@ static struct dmi_system_id __initdata r
 			DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1"),
 		},
 	},
+	{	/* Handle problems with rebooting on the iMac10,1. */
+		.callback = set_pci_reboot,
+		.ident = "Apple iMac10,1",
+		.matches = {
+		    DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+		    DMI_MATCH(DMI_PRODUCT_NAME, "iMac10,1"),
+		},
+	},
 
 	/* ASRock */
 	{	/* Handle problems with rebooting on ASRock Q1900DC-ITX */
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/x86/kernel/signal.c linux-libre-3.12.53-gnu/arch/x86/kernel/signal.c
--- linux-libre-3.12.52-gnu/arch/x86/kernel/signal.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/x86/kernel/signal.c	2016-01-27 03:56:20.000000000 -0500
@@ -682,12 +682,15 @@ handle_signal(struct ksignal *ksig, stru
 	signal_setup_done(failed, ksig, test_thread_flag(TIF_SINGLESTEP));
 }
 
-#ifdef CONFIG_X86_32
-#define NR_restart_syscall	__NR_restart_syscall
-#else /* !CONFIG_X86_32 */
-#define NR_restart_syscall	\
-	test_thread_flag(TIF_IA32) ? __NR_ia32_restart_syscall : __NR_restart_syscall
-#endif /* CONFIG_X86_32 */
+static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs)
+{
+#if defined(CONFIG_X86_32) || !defined(CONFIG_X86_64)
+	return __NR_restart_syscall;
+#else /* !CONFIG_X86_32 && CONFIG_X86_64 */
+	return test_thread_flag(TIF_IA32) ? __NR_ia32_restart_syscall :
+		__NR_restart_syscall | (regs->orig_ax & __X32_SYSCALL_BIT);
+#endif /* CONFIG_X86_32 || !CONFIG_X86_64 */
+}
 
 /*
  * Note that 'init' is a special process: it doesn't get signals it doesn't
@@ -716,7 +719,7 @@ static void do_signal(struct pt_regs *re
 			break;
 
 		case -ERESTART_RESTARTBLOCK:
-			regs->ax = NR_restart_syscall;
+			regs->ax = get_nr_restart_syscall(regs);
 			regs->ip -= 2;
 			break;
 		}
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/x86/platform/efi/efi_32.c linux-libre-3.12.53-gnu/arch/x86/platform/efi/efi_32.c
--- linux-libre-3.12.52-gnu/arch/x86/platform/efi/efi_32.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/x86/platform/efi/efi_32.c	2016-01-27 03:56:20.000000000 -0500
@@ -33,19 +33,16 @@
 
 /*
  * To make EFI call EFI runtime service in physical addressing mode we need
- * prelog/epilog before/after the invocation to disable interrupt, to
- * claim EFI runtime service handler exclusively and to duplicate a memory in
- * low memory space say 0 - 3G.
+ * prolog/epilog before/after the invocation to claim the EFI runtime service
+ * handler exclusively and to duplicate a memory mapping in low memory space,
+ * say 0 - 3G.
  */
 
-static unsigned long efi_rt_eflags;
 
 void efi_call_phys_prelog(void)
 {
 	struct desc_ptr gdt_descr;
 
-	local_irq_save(efi_rt_eflags);
-
 	load_cr3(initial_page_table);
 	__flush_tlb_all();
 
@@ -64,6 +61,4 @@ void efi_call_phys_epilog(void)
 
 	load_cr3(swapper_pg_dir);
 	__flush_tlb_all();
-
-	local_irq_restore(efi_rt_eflags);
 }
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/x86/platform/efi/efi_64.c linux-libre-3.12.53-gnu/arch/x86/platform/efi/efi_64.c
--- linux-libre-3.12.52-gnu/arch/x86/platform/efi/efi_64.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/x86/platform/efi/efi_64.c	2016-01-27 03:56:20.000000000 -0500
@@ -40,7 +40,6 @@
 #include <asm/fixmap.h>
 
 static pgd_t *save_pgd __initdata;
-static unsigned long efi_flags __initdata;
 
 static void __init early_code_mapping_set_exec(int executable)
 {
@@ -66,7 +65,6 @@ void __init efi_call_phys_prelog(void)
 	int n_pgds;
 
 	early_code_mapping_set_exec(1);
-	local_irq_save(efi_flags);
 
 	n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE);
 	save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL);
@@ -90,7 +88,6 @@ void __init efi_call_phys_epilog(void)
 		set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]);
 	kfree(save_pgd);
 	__flush_tlb_all();
-	local_irq_restore(efi_flags);
 	early_code_mapping_set_exec(0);
 }
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/x86/platform/efi/efi.c linux-libre-3.12.53-gnu/arch/x86/platform/efi/efi.c
--- linux-libre-3.12.52-gnu/arch/x86/platform/efi/efi.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/x86/platform/efi/efi.c	2016-01-27 03:56:20.000000000 -0500
@@ -250,12 +250,19 @@ static efi_status_t __init phys_efi_set_
 	efi_memory_desc_t *virtual_map)
 {
 	efi_status_t status;
+	unsigned long flags;
 
 	efi_call_phys_prelog();
+
+	/* Disable interrupts around EFI calls: */
+	local_irq_save(flags);
 	status = efi_call_phys4(efi_phys.set_virtual_address_map,
 				memory_map_size, descriptor_size,
 				descriptor_version, virtual_map);
+	local_irq_restore(flags);
+
 	efi_call_phys_epilog();
+
 	return status;
 }
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/arch/x86/xen/suspend.c linux-libre-3.12.53-gnu/arch/x86/xen/suspend.c
--- linux-libre-3.12.52-gnu/arch/x86/xen/suspend.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/arch/x86/xen/suspend.c	2016-01-27 03:56:20.000000000 -0500
@@ -30,7 +30,8 @@ void xen_arch_hvm_post_suspend(int suspe
 {
 #ifdef CONFIG_XEN_PVHVM
 	int cpu;
-	xen_hvm_init_shared_info();
+	if (!suspend_cancelled)
+	    xen_hvm_init_shared_info();
 	xen_callback_vector();
 	xen_unplug_emulated_devices();
 	if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
diff -druNp --no-dereference linux-libre-3.12.52-gnu/block/blk-core.c linux-libre-3.12.53-gnu/block/blk-core.c
--- linux-libre-3.12.52-gnu/block/blk-core.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/block/blk-core.c	2016-01-27 03:56:20.000000000 -0500
@@ -1893,7 +1893,8 @@ void submit_bio(int rw, struct bio *bio)
 EXPORT_SYMBOL(submit_bio);
 
 /**
- * blk_rq_check_limits - Helper function to check a request for the queue limit
+ * blk_cloned_rq_check_limits - Helper function to check a cloned request
+ *                              for new the queue limits
  * @q:  the queue
  * @rq: the request being checked
  *
@@ -1904,20 +1905,13 @@ EXPORT_SYMBOL(submit_bio);
  *    after it is inserted to @q, it should be checked against @q before
  *    the insertion using this generic function.
  *
- *    This function should also be useful for request stacking drivers
- *    in some cases below, so export this function.
  *    Request stacking drivers like request-based dm may change the queue
- *    limits while requests are in the queue (e.g. dm's table swapping).
- *    Such request stacking drivers should check those requests agaist
- *    the new queue limits again when they dispatch those requests,
- *    although such checkings are also done against the old queue limits
- *    when submitting requests.
+ *    limits when retrying requests on other queues. Those requests need
+ *    to be checked against the new queue limits again during dispatch.
  */
-int blk_rq_check_limits(struct request_queue *q, struct request *rq)
+static int blk_cloned_rq_check_limits(struct request_queue *q,
+				      struct request *rq)
 {
-	if (!rq_mergeable(rq))
-		return 0;
-
 	if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, rq->cmd_flags)) {
 		printk(KERN_ERR "%s: over max size limit.\n", __func__);
 		return -EIO;
@@ -1937,7 +1931,6 @@ int blk_rq_check_limits(struct request_q
 
 	return 0;
 }
-EXPORT_SYMBOL_GPL(blk_rq_check_limits);
 
 /**
  * blk_insert_cloned_request - Helper for stacking drivers to submit a request
@@ -1949,7 +1942,7 @@ int blk_insert_cloned_request(struct req
 	unsigned long flags;
 	int where = ELEVATOR_INSERT_BACK;
 
-	if (blk_rq_check_limits(q, rq))
+	if (blk_cloned_rq_check_limits(q, rq))
 		return -EIO;
 
 	if (rq->rq_disk &&
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/char/ipmi/ipmi_si_intf.c linux-libre-3.12.53-gnu/drivers/char/ipmi/ipmi_si_intf.c
--- linux-libre-3.12.52-gnu/drivers/char/ipmi/ipmi_si_intf.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/char/ipmi/ipmi_si_intf.c	2016-01-27 03:56:20.000000000 -0500
@@ -1152,14 +1152,14 @@ static int smi_start_processing(void
 
 	new_smi->intf = intf;
 
-	/* Try to claim any interrupts. */
-	if (new_smi->irq_setup)
-		new_smi->irq_setup(new_smi);
-
 	/* Set up the timer that drives the interface. */
 	setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi);
 	smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES);
 
+	/* Try to claim any interrupts. */
+	if (new_smi->irq_setup)
+		new_smi->irq_setup(new_smi);
+
 	/*
 	 * Check if the user forcefully enabled the daemon.
 	 */
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/gpu/drm/i915/intel_ringbuffer.c linux-libre-3.12.53-gnu/drivers/gpu/drm/i915/intel_ringbuffer.c
--- linux-libre-3.12.52-gnu/drivers/gpu/drm/i915/intel_ringbuffer.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/gpu/drm/i915/intel_ringbuffer.c	2016-01-27 03:56:20.000000000 -0500
@@ -1125,7 +1125,7 @@ i830_dispatch_execbuffer(struct intel_ri
 		 */
 		intel_ring_emit(ring, SRC_COPY_BLT_CMD | BLT_WRITE_RGBA);
 		intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_SRC_COPY | 4096);
-		intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 1024);
+		intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 4096);
 		intel_ring_emit(ring, cs_offset);
 		intel_ring_emit(ring, 4096);
 		intel_ring_emit(ring, offset);
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/input/tablet/aiptek.c linux-libre-3.12.53-gnu/drivers/input/tablet/aiptek.c
--- linux-libre-3.12.52-gnu/drivers/input/tablet/aiptek.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/input/tablet/aiptek.c	2016-01-27 03:56:20.000000000 -0500
@@ -1820,6 +1820,14 @@ aiptek_probe(struct usb_interface *intf,
 	input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
 	input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
 
+	/* Verify that a device really has an endpoint */
+	if (intf->altsetting[0].desc.bNumEndpoints < 1) {
+		dev_err(&intf->dev,
+			"interface has %d endpoints, but must have minimum 1\n",
+			intf->altsetting[0].desc.bNumEndpoints);
+		err = -EINVAL;
+		goto fail3;
+	}
 	endpoint = &intf->altsetting[0].endpoint[0].desc;
 
 	/* Go set up our URB, which is called when the tablet receives
@@ -1862,6 +1870,7 @@ aiptek_probe(struct usb_interface *intf,
 	if (i == ARRAY_SIZE(speeds)) {
 		dev_info(&intf->dev,
 			 "Aiptek tried all speeds, no sane response\n");
+		err = -EINVAL;
 		goto fail3;
 	}
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/isdn/i4l/isdn_ppp.c linux-libre-3.12.53-gnu/drivers/isdn/i4l/isdn_ppp.c
--- linux-libre-3.12.52-gnu/drivers/isdn/i4l/isdn_ppp.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/isdn/i4l/isdn_ppp.c	2016-01-27 03:56:20.000000000 -0500
@@ -301,6 +301,8 @@ isdn_ppp_open(int min, struct file *file
 	is->compflags = 0;
 
 	is->reset = isdn_ppp_ccp_reset_alloc(is);
+	if (!is->reset)
+		return -ENOMEM;
 
 	is->lp = NULL;
 	is->mp_seqno = 0;       /* MP sequence number */
@@ -320,6 +322,10 @@ isdn_ppp_open(int min, struct file *file
 	 * VJ header compression init
 	 */
 	is->slcomp = slhc_init(16, 16);	/* not necessary for 2. link in bundle */
+	if (IS_ERR(is->slcomp)) {
+		isdn_ppp_ccp_reset_free(is);
+		return PTR_ERR(is->slcomp);
+	}
 #endif
 #ifdef CONFIG_IPPP_FILTER
 	is->pass_filter = NULL;
@@ -568,10 +574,8 @@ isdn_ppp_ioctl(int min, struct file *fil
 			is->maxcid = val;
 #ifdef CONFIG_ISDN_PPP_VJ
 			sltmp = slhc_init(16, val);
-			if (!sltmp) {
-				printk(KERN_ERR "ippp, can't realloc slhc struct\n");
-				return -ENOMEM;
-			}
+			if (IS_ERR(sltmp))
+				return PTR_ERR(sltmp);
 			if (is->slcomp)
 				slhc_free(is->slcomp);
 			is->slcomp = sltmp;
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/net/ppp/ppp_generic.c linux-libre-3.12.53-gnu/drivers/net/ppp/ppp_generic.c
--- linux-libre-3.12.52-gnu/drivers/net/ppp/ppp_generic.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/net/ppp/ppp_generic.c	2016-01-27 03:56:20.000000000 -0500
@@ -716,10 +716,8 @@ static long ppp_ioctl(struct file *file,
 			val &= 0xffff;
 		}
 		vj = slhc_init(val2+1, val+1);
-		if (!vj) {
-			netdev_err(ppp->dev,
-				   "PPP: no memory (VJ compressor)\n");
-			err = -ENOMEM;
+		if (IS_ERR(vj)) {
+			err = PTR_ERR(vj);
 			break;
 		}
 		ppp_lock(ppp);
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/net/slip/slhc.c linux-libre-3.12.53-gnu/drivers/net/slip/slhc.c
--- linux-libre-3.12.52-gnu/drivers/net/slip/slhc.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/net/slip/slhc.c	2016-01-27 03:56:20.000000000 -0500
@@ -84,8 +84,9 @@ static long decode(unsigned char **cpp);
 static unsigned char * put16(unsigned char *cp, unsigned short x);
 static unsigned short pull16(unsigned char **cpp);
 
-/* Initialize compression data structure
+/* Allocate compression data structure
  *	slots must be in range 0 to 255 (zero meaning no compression)
+ * Returns pointer to structure or ERR_PTR() on error.
  */
 struct slcompress *
 slhc_init(int rslots, int tslots)
@@ -94,11 +95,14 @@ slhc_init(int rslots, int tslots)
 	register struct cstate *ts;
 	struct slcompress *comp;
 
+	if (rslots < 0 || rslots > 255 || tslots < 0 || tslots > 255)
+		return ERR_PTR(-EINVAL);
+
 	comp = kzalloc(sizeof(struct slcompress), GFP_KERNEL);
 	if (! comp)
 		goto out_fail;
 
-	if ( rslots > 0  &&  rslots < 256 ) {
+	if (rslots > 0) {
 		size_t rsize = rslots * sizeof(struct cstate);
 		comp->rstate = kzalloc(rsize, GFP_KERNEL);
 		if (! comp->rstate)
@@ -106,7 +110,7 @@ slhc_init(int rslots, int tslots)
 		comp->rslot_limit = rslots - 1;
 	}
 
-	if ( tslots > 0  &&  tslots < 256 ) {
+	if (tslots > 0) {
 		size_t tsize = tslots * sizeof(struct cstate);
 		comp->tstate = kzalloc(tsize, GFP_KERNEL);
 		if (! comp->tstate)
@@ -141,7 +145,7 @@ out_free2:
 out_free:
 	kfree(comp);
 out_fail:
-	return NULL;
+	return ERR_PTR(-ENOMEM);
 }
 
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/net/slip/slip.c linux-libre-3.12.53-gnu/drivers/net/slip/slip.c
--- linux-libre-3.12.52-gnu/drivers/net/slip/slip.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/net/slip/slip.c	2016-01-27 03:56:20.000000000 -0500
@@ -164,7 +164,7 @@ static int sl_alloc_bufs(struct slip *sl
 	if (cbuff == NULL)
 		goto err_exit;
 	slcomp = slhc_init(16, 16);
-	if (slcomp == NULL)
+	if (IS_ERR(slcomp))
 		goto err_exit;
 #endif
 	spin_lock_bh(&sl->lock);
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/pci/pci.c linux-libre-3.12.53-gnu/drivers/pci/pci.c
--- linux-libre-3.12.52-gnu/drivers/pci/pci.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/pci/pci.c	2016-01-27 03:56:20.000000000 -0500
@@ -2871,7 +2871,7 @@ void __weak pcibios_set_master(struct pc
 		lat = pcibios_max_latency;
 	else
 		return;
-	dev_printk(KERN_DEBUG, &dev->dev, "setting latency timer to %d\n", lat);
+
 	pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
 }
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/scsi/lpfc/lpfc_scsi.c linux-libre-3.12.53-gnu/drivers/scsi/lpfc/lpfc_scsi.c
--- linux-libre-3.12.52-gnu/drivers/scsi/lpfc/lpfc_scsi.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/scsi/lpfc/lpfc_scsi.c	2016-01-27 03:56:20.000000000 -0500
@@ -5264,7 +5264,15 @@ lpfc_target_reset_handler(struct scsi_cm
 	if (status == FAILED) {
 		lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
 			"0722 Target Reset rport failure: rdata x%p\n", rdata);
-		return FAILED;
+		if (pnode) {
+			spin_lock_irq(shost->host_lock);
+			pnode->nlp_flag &= ~NLP_NPR_ADISC;
+			pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
+			spin_unlock_irq(shost->host_lock);
+		}
+		lpfc_reset_flush_io_context(vport, tgt_id, lun_id,
+					    LPFC_CTX_TGT);
+		return FAST_IO_FAIL;
 	}
 
 	scsi_event.event_type = FC_REG_SCSI_EVENT;
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/scsi/qla2xxx/qla_init.c linux-libre-3.12.53-gnu/drivers/scsi/qla2xxx/qla_init.c
--- linux-libre-3.12.52-gnu/drivers/scsi/qla2xxx/qla_init.c	2016-01-10 08:11:35.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/scsi/qla2xxx/qla_init.c	2016-01-27 16:33:13.000000000 -0500
@@ -2725,6 +2725,7 @@ qla2x00_rport_del(void *data)
 	struct fc_rport *rport;
 	scsi_qla_host_t *vha = fcport->vha;
 	unsigned long flags;
+	unsigned long vha_flags;
 
 	spin_lock_irqsave(fcport->vha->host->host_lock, flags);
 	rport = fcport->drport ? fcport->drport: fcport->rport;
@@ -2736,7 +2737,9 @@ qla2x00_rport_del(void *data)
 		 * Release the target mode FC NEXUS in qla_target.c code
 		 * if target mod is enabled.
 		 */
+		spin_lock_irqsave(&vha->hw->hardware_lock, vha_flags);
 		qlt_fc_port_deleted(vha, fcport);
+		spin_unlock_irqrestore(&vha->hw->hardware_lock, vha_flags);
 	}
 }
 
@@ -3106,6 +3109,7 @@ qla2x00_reg_remote_port(scsi_qla_host_t
 	 * Create target mode FC NEXUS in qla_target.c if target mode is
 	 * enabled..
 	 */
+
 	qlt_fc_port_added(vha, fcport);
 
 	spin_lock_irqsave(fcport->vha->host->host_lock, flags);
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/scsi/qla2xxx/qla_target.c linux-libre-3.12.53-gnu/drivers/scsi/qla2xxx/qla_target.c
--- linux-libre-3.12.52-gnu/drivers/scsi/qla2xxx/qla_target.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/scsi/qla2xxx/qla_target.c	2016-01-27 03:56:20.000000000 -0500
@@ -741,7 +741,6 @@ void qlt_fc_port_deleted(struct scsi_qla
 	struct qla_hw_data *ha = vha->hw;
 	struct qla_tgt *tgt = ha->tgt.qla_tgt;
 	struct qla_tgt_sess *sess;
-	unsigned long flags;
 
 	if (!vha->hw->tgt.tgt_ops)
 		return;
@@ -749,14 +748,11 @@ void qlt_fc_port_deleted(struct scsi_qla
 	if (!tgt || (fcport->port_type != FCT_INITIATOR))
 		return;
 
-	spin_lock_irqsave(&ha->hardware_lock, flags);
 	if (tgt->tgt_stop) {
-		spin_unlock_irqrestore(&ha->hardware_lock, flags);
 		return;
 	}
 	sess = qlt_find_sess_by_port_name(tgt, fcport->port_name);
 	if (!sess) {
-		spin_unlock_irqrestore(&ha->hardware_lock, flags);
 		return;
 	}
 
@@ -764,7 +760,6 @@ void qlt_fc_port_deleted(struct scsi_qla
 
 	sess->local = 1;
 	qlt_schedule_sess_for_deletion(sess, false);
-	spin_unlock_irqrestore(&ha->hardware_lock, flags);
 }
 
 static inline int test_tgt_sess_count(struct qla_tgt *tgt)
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/staging/dgnc/dgnc_mgmt.c linux-libre-3.12.53-gnu/drivers/staging/dgnc/dgnc_mgmt.c
--- linux-libre-3.12.52-gnu/drivers/staging/dgnc/dgnc_mgmt.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/staging/dgnc/dgnc_mgmt.c	2016-01-27 03:56:20.000000000 -0500
@@ -145,6 +145,7 @@ long dgnc_mgmt_ioctl(struct file *file,
 
 		DGNC_LOCK(dgnc_global_lock, lock_flags);
 
+		memset(&ddi, 0, sizeof(ddi));
 		ddi.dinfo_nboards = dgnc_NumBoards;
 		sprintf(ddi.dinfo_version, "%s", DG_PART);
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/usb/core/quirks.c linux-libre-3.12.53-gnu/drivers/usb/core/quirks.c
--- linux-libre-3.12.52-gnu/drivers/usb/core/quirks.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/usb/core/quirks.c	2016-01-27 03:56:20.000000000 -0500
@@ -125,6 +125,9 @@ static const struct usb_device_id usb_qu
 	{ USB_DEVICE(0x04f3, 0x016f), .driver_info =
 			USB_QUIRK_DEVICE_QUALIFIER },
 
+	{ USB_DEVICE(0x04f3, 0x21b8), .driver_info =
+			USB_QUIRK_DEVICE_QUALIFIER },
+
 	/* Roland SC-8820 */
 	{ USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME },
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/drivers/xen/gntdev.c linux-libre-3.12.53-gnu/drivers/xen/gntdev.c
--- linux-libre-3.12.52-gnu/drivers/xen/gntdev.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/drivers/xen/gntdev.c	2016-01-27 03:56:20.000000000 -0500
@@ -763,7 +763,7 @@ static int gntdev_mmap(struct file *flip
 
 	vma->vm_ops = &gntdev_vmops;
 
-	vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
+	vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP | VM_IO;
 
 	if (use_ptemod)
 		vma->vm_flags |= VM_DONTCOPY;
diff -druNp --no-dereference linux-libre-3.12.52-gnu/fs/dlm/plock.c linux-libre-3.12.53-gnu/fs/dlm/plock.c
--- linux-libre-3.12.52-gnu/fs/dlm/plock.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/fs/dlm/plock.c	2016-01-27 03:56:20.000000000 -0500
@@ -145,7 +145,7 @@ int dlm_posix_lock(dlm_lockspace_t *lock
 	send_op(op);
 
 	if (xop->callback == NULL) {
-		rv = wait_event_killable(recv_wq, (op->done != 0));
+		rv = wait_event_interruptible(recv_wq, (op->done != 0));
 		if (rv == -ERESTARTSYS) {
 			log_debug(ls, "dlm_posix_lock: wait killed %llx",
 				  (unsigned long long)number);
diff -druNp --no-dereference linux-libre-3.12.52-gnu/include/linux/blkdev.h linux-libre-3.12.53-gnu/include/linux/blkdev.h
--- linux-libre-3.12.52-gnu/include/linux/blkdev.h	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/include/linux/blkdev.h	2016-01-27 03:56:20.000000000 -0500
@@ -740,7 +740,6 @@ extern struct request *blk_make_request(
 extern void blk_requeue_request(struct request_queue *, struct request *);
 extern void blk_add_request_payload(struct request *rq, struct page *page,
 		unsigned int len);
-extern int blk_rq_check_limits(struct request_queue *q, struct request *rq);
 extern int blk_lld_busy(struct request_queue *q);
 extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src,
 			     struct bio_set *bs, gfp_t gfp_mask,
diff -druNp --no-dereference linux-libre-3.12.52-gnu/include/linux/isapnp.h linux-libre-3.12.53-gnu/include/linux/isapnp.h
--- linux-libre-3.12.52-gnu/include/linux/isapnp.h	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/include/linux/isapnp.h	2016-01-27 03:56:20.000000000 -0500
@@ -56,10 +56,6 @@
 #define ISAPNP_DEVICE_ID(_va, _vb, _vc, _function) \
 		{ .vendor = ISAPNP_VENDOR(_va, _vb, _vc), .function = ISAPNP_FUNCTION(_function) }
 
-/* export used IDs outside module */
-#define ISAPNP_CARD_TABLE(name) \
-		MODULE_GENERIC_TABLE(isapnp_card, name)
-
 struct isapnp_card_id {
 	unsigned long driver_data;	/* data private to the driver */
 	unsigned short card_vendor, card_device;
diff -druNp --no-dereference linux-libre-3.12.52-gnu/include/linux/module.h linux-libre-3.12.53-gnu/include/linux/module.h
--- linux-libre-3.12.52-gnu/include/linux/module.h	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/include/linux/module.h	2016-01-27 03:56:20.000000000 -0500
@@ -83,15 +83,6 @@ void sort_extable(struct exception_table
 void sort_main_extable(void);
 void trim_init_extable(struct module *m);
 
-#ifdef MODULE
-#define MODULE_GENERIC_TABLE(gtype,name)			\
-extern const struct gtype##_id __mod_##gtype##_table		\
-  __attribute__ ((unused, alias(__stringify(name))))
-
-#else  /* !MODULE */
-#define MODULE_GENERIC_TABLE(gtype,name)
-#endif
-
 /* Generic info of form tag = "info" */
 #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
 
@@ -142,8 +133,14 @@ extern const struct gtype##_id __mod_##g
 /* What your module does. */
 #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
 
-#define MODULE_DEVICE_TABLE(type,name)		\
-  MODULE_GENERIC_TABLE(type##__##name##_device, name)
+#ifdef MODULE
+/* Creates an alias so file2alias.c can find device table. */
+#define MODULE_DEVICE_TABLE(type, name)					\
+  extern const struct type##_device_id __mod_##type##__##name##_device_table \
+  __attribute__ ((unused, alias(__stringify(name))))
+#else  /* !MODULE */
+#define MODULE_DEVICE_TABLE(type, name)
+#endif
 
 /* Version of form [<epoch>:]<version>[-<extra-version>].
    Or for CVS/RCS ID version, everything but the number is stripped.
diff -druNp --no-dereference linux-libre-3.12.52-gnu/include/trace/events/sunrpc.h linux-libre-3.12.53-gnu/include/trace/events/sunrpc.h
--- linux-libre-3.12.52-gnu/include/trace/events/sunrpc.h	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/include/trace/events/sunrpc.h	2016-01-27 03:56:20.000000000 -0500
@@ -83,7 +83,7 @@ DECLARE_EVENT_CLASS(rpc_task_running,
 		),
 
 	TP_fast_assign(
-		__entry->client_id = clnt->cl_clid;
+		__entry->client_id = clnt ? clnt->cl_clid : -1;
 		__entry->task_id = task->tk_pid;
 		__entry->action = action;
 		__entry->runstate = task->tk_runstate;
@@ -91,7 +91,7 @@ DECLARE_EVENT_CLASS(rpc_task_running,
 		__entry->flags = task->tk_flags;
 		),
 
-	TP_printk("task:%u@%u flags=%4.4x state=%4.4lx status=%d action=%pf",
+	TP_printk("task:%u@%d flags=%4.4x state=%4.4lx status=%d action=%pf",
 		__entry->task_id, __entry->client_id,
 		__entry->flags,
 		__entry->runstate,
diff -druNp --no-dereference linux-libre-3.12.52-gnu/kernel/trace/ring_buffer.c linux-libre-3.12.53-gnu/kernel/trace/ring_buffer.c
--- linux-libre-3.12.52-gnu/kernel/trace/ring_buffer.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/kernel/trace/ring_buffer.c	2016-01-27 03:56:20.000000000 -0500
@@ -1700,22 +1700,14 @@ int ring_buffer_resize(struct ring_buffe
 			if (!cpu_buffer->nr_pages_to_update)
 				continue;
 
-			/* The update must run on the CPU that is being updated. */
-			preempt_disable();
-			if (cpu == smp_processor_id() || !cpu_online(cpu)) {
+			/* Can't run something on an offline CPU. */
+			if (!cpu_online(cpu)) {
 				rb_update_pages(cpu_buffer);
 				cpu_buffer->nr_pages_to_update = 0;
 			} else {
-				/*
-				 * Can not disable preemption for schedule_work_on()
-				 * on PREEMPT_RT.
-				 */
-				preempt_enable();
 				schedule_work_on(cpu,
 						&cpu_buffer->update_pages_work);
-				preempt_disable();
 			}
-			preempt_enable();
 		}
 
 		/* wait for all the updates to complete */
@@ -1753,22 +1745,14 @@ int ring_buffer_resize(struct ring_buffe
 
 		get_online_cpus();
 
-		preempt_disable();
-		/* The update must run on the CPU that is being updated. */
-		if (cpu_id == smp_processor_id() || !cpu_online(cpu_id))
+		/* Can't run something on an offline CPU. */
+		if (!cpu_online(cpu_id))
 			rb_update_pages(cpu_buffer);
 		else {
-			/*
-			 * Can not disable preemption for schedule_work_on()
-			 * on PREEMPT_RT.
-			 */
-			preempt_enable();
 			schedule_work_on(cpu_id,
 					 &cpu_buffer->update_pages_work);
 			wait_for_completion(&cpu_buffer->update_done);
-			preempt_disable();
 		}
-		preempt_enable();
 
 		cpu_buffer->nr_pages_to_update = 0;
 		put_online_cpus();
diff -druNp --no-dereference linux-libre-3.12.52-gnu/MAINTAINERS linux-libre-3.12.53-gnu/MAINTAINERS
--- linux-libre-3.12.52-gnu/MAINTAINERS	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/MAINTAINERS	2016-01-27 03:56:20.000000000 -0500
@@ -8151,6 +8151,7 @@ F:	include/linux/swiotlb.h
 
 SYNOPSYS ARC ARCHITECTURE
 M:	Vineet Gupta <vgupta@synopsys.com>
+L:	linux-snps-arc@lists.infradead.org
 S:	Supported
 F:	arch/arc/
 F:	Documentation/devicetree/bindings/arc/
diff -druNp --no-dereference linux-libre-3.12.52-gnu/Makefile linux-libre-3.12.53-gnu/Makefile
--- linux-libre-3.12.52-gnu/Makefile	2016-01-10 07:56:50.000000000 -0500
+++ linux-libre-3.12.53-gnu/Makefile	2016-01-27 16:15:18.000000000 -0500
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 12
-SUBLEVEL = 52
+SUBLEVEL = 53
 EXTRAVERSION =-gnu
 NAME = One Giant Leap for Frogkind
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/net/ipv4/route.c linux-libre-3.12.53-gnu/net/ipv4/route.c
--- linux-libre-3.12.52-gnu/net/ipv4/route.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/net/ipv4/route.c	2016-01-27 03:56:20.000000000 -0500
@@ -985,7 +985,7 @@ static void __ip_rt_update_pmtu(struct r
 	if (dst_metric_locked(dst, RTAX_MTU))
 		return;
 
-	if (dst->dev->mtu < mtu)
+	if (ipv4_mtu(dst) < mtu)
 		return;
 
 	if (mtu < ip_rt_min_pmtu)
diff -druNp --no-dereference linux-libre-3.12.52-gnu/net/ipv4/udp.c linux-libre-3.12.53-gnu/net/ipv4/udp.c
--- linux-libre-3.12.52-gnu/net/ipv4/udp.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/net/ipv4/udp.c	2016-01-27 03:56:20.000000000 -0500
@@ -1210,6 +1210,7 @@ int udp_recvmsg(struct kiocb *iocb, stru
 	int peeked, off = 0;
 	int err;
 	int is_udplite = IS_UDPLITE(sk);
+	bool checksum_valid = false;
 	bool slow;
 
 	if (flags & MSG_ERRQUEUE)
@@ -1235,11 +1236,12 @@ try_again:
 	 */
 
 	if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) {
-		if (udp_lib_checksum_complete(skb))
+		checksum_valid = !udp_lib_checksum_complete(skb);
+		if (!checksum_valid)
 			goto csum_copy_err;
 	}
 
-	if (skb_csum_unnecessary(skb))
+	if (checksum_valid || skb_csum_unnecessary(skb))
 		err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr),
 					      msg->msg_iov, copied);
 	else {
diff -druNp --no-dereference linux-libre-3.12.52-gnu/net/ipv6/udp.c linux-libre-3.12.53-gnu/net/ipv6/udp.c
--- linux-libre-3.12.52-gnu/net/ipv6/udp.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/net/ipv6/udp.c	2016-01-27 03:56:20.000000000 -0500
@@ -371,6 +371,7 @@ int udpv6_recvmsg(struct kiocb *iocb, st
 	int peeked, off = 0;
 	int err;
 	int is_udplite = IS_UDPLITE(sk);
+	bool checksum_valid = false;
 	int is_udp4;
 	bool slow;
 
@@ -402,11 +403,12 @@ try_again:
 	 */
 
 	if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) {
-		if (udp_lib_checksum_complete(skb))
+		checksum_valid = !udp_lib_checksum_complete(skb);
+		if (!checksum_valid)
 			goto csum_copy_err;
 	}
 
-	if (skb_csum_unnecessary(skb))
+	if (checksum_valid || skb_csum_unnecessary(skb))
 		err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr),
 					      msg->msg_iov, copied);
 	else {
diff -druNp --no-dereference linux-libre-3.12.52-gnu/net/sctp/sm_sideeffect.c linux-libre-3.12.53-gnu/net/sctp/sm_sideeffect.c
--- linux-libre-3.12.52-gnu/net/sctp/sm_sideeffect.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/net/sctp/sm_sideeffect.c	2016-01-27 03:56:20.000000000 -0500
@@ -245,12 +245,13 @@ void sctp_generate_t3_rtx_event(unsigned
 	int error;
 	struct sctp_transport *transport = (struct sctp_transport *) peer;
 	struct sctp_association *asoc = transport->asoc;
-	struct net *net = sock_net(asoc->base.sk);
+	struct sock *sk = asoc->base.sk;
+	struct net *net = sock_net(sk);
 
 	/* Check whether a task is in the sock.  */
 
-	sctp_bh_lock_sock(asoc->base.sk);
-	if (sock_owned_by_user(asoc->base.sk)) {
+	sctp_bh_lock_sock(sk);
+	if (sock_owned_by_user(sk)) {
 		pr_debug("%s: sock is busy\n", __func__);
 
 		/* Try again later.  */
@@ -273,10 +274,10 @@ void sctp_generate_t3_rtx_event(unsigned
 			   transport, GFP_ATOMIC);
 
 	if (error)
-		asoc->base.sk->sk_err = -error;
+		sk->sk_err = -error;
 
 out_unlock:
-	sctp_bh_unlock_sock(asoc->base.sk);
+	sctp_bh_unlock_sock(sk);
 	sctp_transport_put(transport);
 }
 
@@ -286,11 +287,12 @@ out_unlock:
 static void sctp_generate_timeout_event(struct sctp_association *asoc,
 					sctp_event_timeout_t timeout_type)
 {
-	struct net *net = sock_net(asoc->base.sk);
+	struct sock *sk = asoc->base.sk;
+	struct net *net = sock_net(sk);
 	int error = 0;
 
-	sctp_bh_lock_sock(asoc->base.sk);
-	if (sock_owned_by_user(asoc->base.sk)) {
+	sctp_bh_lock_sock(sk);
+	if (sock_owned_by_user(sk)) {
 		pr_debug("%s: sock is busy: timer %d\n", __func__,
 			 timeout_type);
 
@@ -313,10 +315,10 @@ static void sctp_generate_timeout_event(
 			   (void *)timeout_type, GFP_ATOMIC);
 
 	if (error)
-		asoc->base.sk->sk_err = -error;
+		sk->sk_err = -error;
 
 out_unlock:
-	sctp_bh_unlock_sock(asoc->base.sk);
+	sctp_bh_unlock_sock(sk);
 	sctp_association_put(asoc);
 }
 
@@ -366,10 +368,11 @@ void sctp_generate_heartbeat_event(unsig
 	int error = 0;
 	struct sctp_transport *transport = (struct sctp_transport *) data;
 	struct sctp_association *asoc = transport->asoc;
-	struct net *net = sock_net(asoc->base.sk);
+	struct sock *sk = asoc->base.sk;
+	struct net *net = sock_net(sk);
 
-	sctp_bh_lock_sock(asoc->base.sk);
-	if (sock_owned_by_user(asoc->base.sk)) {
+	sctp_bh_lock_sock(sk);
+	if (sock_owned_by_user(sk)) {
 		pr_debug("%s: sock is busy\n", __func__);
 
 		/* Try again later.  */
@@ -390,10 +393,10 @@ void sctp_generate_heartbeat_event(unsig
 			   transport, GFP_ATOMIC);
 
 	 if (error)
-		 asoc->base.sk->sk_err = -error;
+		 sk->sk_err = -error;
 
 out_unlock:
-	sctp_bh_unlock_sock(asoc->base.sk);
+	sctp_bh_unlock_sock(sk);
 	sctp_transport_put(transport);
 }
 
@@ -404,10 +407,11 @@ void sctp_generate_proto_unreach_event(u
 {
 	struct sctp_transport *transport = (struct sctp_transport *) data;
 	struct sctp_association *asoc = transport->asoc;
-	struct net *net = sock_net(asoc->base.sk);
+	struct sock *sk = asoc->base.sk;
+	struct net *net = sock_net(sk);
 	
-	sctp_bh_lock_sock(asoc->base.sk);
-	if (sock_owned_by_user(asoc->base.sk)) {
+	sctp_bh_lock_sock(sk);
+	if (sock_owned_by_user(sk)) {
 		pr_debug("%s: sock is busy\n", __func__);
 
 		/* Try again later.  */
@@ -428,7 +432,7 @@ void sctp_generate_proto_unreach_event(u
 		   asoc->state, asoc->ep, asoc, transport, GFP_ATOMIC);
 
 out_unlock:
-	sctp_bh_unlock_sock(asoc->base.sk);
+	sctp_bh_unlock_sock(sk);
 	sctp_association_put(asoc);
 }
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/security/keys/keyctl.c linux-libre-3.12.53-gnu/security/keys/keyctl.c
--- linux-libre-3.12.52-gnu/security/keys/keyctl.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/security/keys/keyctl.c	2016-01-27 03:56:20.000000000 -0500
@@ -744,16 +744,16 @@ long keyctl_read_key(key_serial_t keyid,
 
 	/* the key is probably readable - now try to read it */
 can_read_key:
-	ret = key_validate(key);
-	if (ret == 0) {
-		ret = -EOPNOTSUPP;
-		if (key->type->read) {
-			/* read the data with the semaphore held (since we
-			 * might sleep) */
-			down_read(&key->sem);
+	ret = -EOPNOTSUPP;
+	if (key->type->read) {
+		/* Read the data with the semaphore held (since we might sleep)
+		 * to protect against the key being updated or revoked.
+		 */
+		down_read(&key->sem);
+		ret = key_validate(key);
+		if (ret == 0)
 			ret = key->type->read(key, buffer, buflen);
-			up_read(&key->sem);
-		}
+		up_read(&key->sem);
 	}
 
 error2:
diff -druNp --no-dereference linux-libre-3.12.52-gnu/security/keys/process_keys.c linux-libre-3.12.53-gnu/security/keys/process_keys.c
--- linux-libre-3.12.52-gnu/security/keys/process_keys.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/security/keys/process_keys.c	2016-01-27 03:56:20.000000000 -0500
@@ -792,6 +792,7 @@ long join_session_keyring(const char *na
 		ret = PTR_ERR(keyring);
 		goto error2;
 	} else if (keyring == new->session_keyring) {
+		key_put(keyring);
 		ret = 0;
 		goto error2;
 	}
diff -druNp --no-dereference linux-libre-3.12.52-gnu/sound/pci/hda/hda_intel.c linux-libre-3.12.53-gnu/sound/pci/hda/hda_intel.c
--- linux-libre-3.12.52-gnu/sound/pci/hda/hda_intel.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/sound/pci/hda/hda_intel.c	2016-01-27 03:56:20.000000000 -0500
@@ -4082,6 +4082,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids)
 	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
 	{ PCI_DEVICE(0x8086, 0x8d21),
 	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+	/* Lewisburg */
+	{ PCI_DEVICE(0x8086, 0xa1f0),
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+	{ PCI_DEVICE(0x8086, 0xa270),
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
 	/* Lynx Point-LP */
 	{ PCI_DEVICE(0x8086, 0x9c20),
 	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
diff -druNp --no-dereference linux-libre-3.12.52-gnu/sound/pci/hda/patch_realtek.c linux-libre-3.12.53-gnu/sound/pci/hda/patch_realtek.c
--- linux-libre-3.12.52-gnu/sound/pci/hda/patch_realtek.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/sound/pci/hda/patch_realtek.c	2016-01-27 03:56:20.000000000 -0500
@@ -3637,6 +3637,18 @@ static void alc283_fixup_chromebook(stru
 	}
 }
 
+/* additional fixup for Thinkpad T440s noise problem */
+static void alc_fixup_tpt440(struct hda_codec *codec,
+			     const struct hda_fixup *fix, int action)
+{
+	struct alc_spec *spec = codec->spec;
+
+	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
+		spec->shutup = alc_no_shutup; /* reduce click noise */
+		spec->gen.mixer_nid = 0; /* reduce background noise */
+	}
+}
+
 /* mute tablet speaker pin (0x14) via dock plugging in addition */
 static void asus_tx300_automute(struct hda_codec *codec)
 {
@@ -3746,6 +3758,7 @@ enum {
 	ALC283_FIXUP_INT_MIC,
 	ALC290_FIXUP_MONO_SPEAKERS,
 	ALC292_FIXUP_TPT440_DOCK,
+	ALC292_FIXUP_TPT440,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -4090,6 +4103,12 @@ static const struct hda_fixup alc269_fix
 		.chained = true,
 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
 	},
+	[ALC292_FIXUP_TPT440] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc_fixup_tpt440,
+		.chained = true,
+		.chain_id = ALC292_FIXUP_TPT440_DOCK,
+	},
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -4185,7 +4204,7 @@ static const struct snd_pci_quirk alc269
 	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
-	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440_DOCK),
+	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
 	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
 	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
@@ -4263,6 +4282,7 @@ static const struct hda_model_fixup alc2
 	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
 	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
 	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
+	{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
 	{}
 };
 
diff -druNp --no-dereference linux-libre-3.12.52-gnu/sound/pci/hda/patch_sigmatel.c linux-libre-3.12.53-gnu/sound/pci/hda/patch_sigmatel.c
--- linux-libre-3.12.52-gnu/sound/pci/hda/patch_sigmatel.c	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/sound/pci/hda/patch_sigmatel.c	2016-01-27 03:56:20.000000000 -0500
@@ -712,6 +712,7 @@ static bool hp_bnb2011_with_dock(struct
 static bool hp_blike_system(u32 subsystem_id)
 {
 	switch (subsystem_id) {
+	case 0x103c1473: /* HP ProBook 6550b */
 	case 0x103c1520:
 	case 0x103c1521:
 	case 0x103c1523:
diff -druNp --no-dereference linux-libre-3.12.52-gnu/tools/Makefile linux-libre-3.12.53-gnu/tools/Makefile
--- linux-libre-3.12.52-gnu/tools/Makefile	2016-01-05 12:43:37.000000000 -0500
+++ linux-libre-3.12.53-gnu/tools/Makefile	2016-01-27 03:56:20.000000000 -0500
@@ -22,6 +22,10 @@ help:
 	@echo '  from the kernel command line to build and install one of'
 	@echo '  the tools above'
 	@echo ''
+	@echo '  $$ make tools/all'
+	@echo ''
+	@echo '  builds all tools.'
+	@echo ''
 	@echo '  $$ make tools/install'
 	@echo ''
 	@echo '  installs all tools.'
@@ -50,6 +54,10 @@ selftests: FORCE
 turbostat x86_energy_perf_policy: FORCE
 	$(call descend,power/x86/$@)
 
+all: cgroup cpupower firewire lguest \
+		perf selftests turbostat usb \
+		virtio vm net x86_energy_perf_policy
+
 cpupower_install:
 	$(call descend,power/$(@:_install=),install)
 
