diff -druNp linux-libre-3.9-rc8-gnu/arch/arm/mach-omap2/omap_hwmod_44xx_data.c linux-libre-3.9-gnu/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
--- linux-libre-3.9-rc8-gnu/arch/arm/mach-omap2/omap_hwmod_44xx_data.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/arm/mach-omap2/omap_hwmod_44xx_data.c	2013-04-28 20:36:01.000000000 -0400
@@ -2714,16 +2714,22 @@ static struct omap_ocp2scp_dev ocp2scp_d
 	{ }
 };
 
-static struct omap_hwmod_opt_clk ocp2scp_usb_phy_opt_clks[] = {
-	{ .role = "48mhz", .clk = "ocp2scp_usb_phy_phy_48m" },
-};
-
 /* ocp2scp_usb_phy */
 static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = {
 	.name		= "ocp2scp_usb_phy",
 	.class		= &omap44xx_ocp2scp_hwmod_class,
 	.clkdm_name	= "l3_init_clkdm",
-	.main_clk	= "func_48m_fclk",
+	/*
+	 * ocp2scp_usb_phy_phy_48m is provided by the OMAP4 PRCM IP
+	 * block as an "optional clock," and normally should never be
+	 * specified as the main_clk for an OMAP IP block.  However it
+	 * turns out that this clock is actually the main clock for
+	 * the ocp2scp_usb_phy IP block:
+	 * http://lists.infradead.org/pipermail/linux-arm-kernel/2012-September/119943.html
+	 * So listing ocp2scp_usb_phy_phy_48m as a main_clk here seems
+	 * to be the best workaround.
+	 */
+	.main_clk	= "ocp2scp_usb_phy_phy_48m",
 	.prcm = {
 		.omap4 = {
 			.clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET,
@@ -2732,8 +2738,6 @@ static struct omap_hwmod omap44xx_ocp2sc
 		},
 	},
 	.dev_attr	= ocp2scp_dev_attr,
-	.opt_clks	= ocp2scp_usb_phy_opt_clks,
-	.opt_clks_cnt	= ARRAY_SIZE(ocp2scp_usb_phy_opt_clks),
 };
 
 /*
diff -druNp linux-libre-3.9-rc8-gnu/arch/mips/include/asm/page.h linux-libre-3.9-gnu/arch/mips/include/asm/page.h
--- linux-libre-3.9-rc8-gnu/arch/mips/include/asm/page.h	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/mips/include/asm/page.h	2013-04-28 20:36:01.000000000 -0400
@@ -31,7 +31,7 @@
 #define PAGE_SHIFT	16
 #endif
 #define PAGE_SIZE	(_AC(1,UL) << PAGE_SHIFT)
-#define PAGE_MASK	(~(PAGE_SIZE - 1))
+#define PAGE_MASK	(~((1 << PAGE_SHIFT) - 1))
 
 #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
 #define HPAGE_SHIFT	(PAGE_SHIFT + PAGE_SHIFT - 3)
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/include/asm/cacheflush.h linux-libre-3.9-gnu/arch/parisc/include/asm/cacheflush.h
--- linux-libre-3.9-rc8-gnu/arch/parisc/include/asm/cacheflush.h	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/parisc/include/asm/cacheflush.h	2013-04-28 20:36:01.000000000 -0400
@@ -140,7 +140,10 @@ static inline void *kmap(struct page *pa
 	return page_address(page);
 }
 
-#define kunmap(page)			kunmap_parisc(page_address(page))
+static inline void kunmap(struct page *page)
+{
+	kunmap_parisc(page_address(page));
+}
 
 static inline void *kmap_atomic(struct page *page)
 {
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/include/asm/pgtable.h linux-libre-3.9-gnu/arch/parisc/include/asm/pgtable.h
--- linux-libre-3.9-rc8-gnu/arch/parisc/include/asm/pgtable.h	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/parisc/include/asm/pgtable.h	2013-04-28 20:36:01.000000000 -0400
@@ -16,6 +16,8 @@
 #include <asm/processor.h>
 #include <asm/cache.h>
 
+extern spinlock_t pa_dbit_lock;
+
 /*
  * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel
  * memory.  For the return value to be meaningful, ADDR must be >=
@@ -44,8 +46,11 @@ extern void purge_tlb_entries(struct mm_
 
 #define set_pte_at(mm, addr, ptep, pteval)                      \
 	do {                                                    \
+		unsigned long flags;				\
+		spin_lock_irqsave(&pa_dbit_lock, flags);	\
 		set_pte(ptep, pteval);                          \
 		purge_tlb_entries(mm, addr);                    \
+		spin_unlock_irqrestore(&pa_dbit_lock, flags);	\
 	} while (0)
 
 #endif /* !__ASSEMBLY__ */
@@ -435,48 +440,46 @@ extern void update_mmu_cache(struct vm_a
 
 static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
 {
-#ifdef CONFIG_SMP
+	pte_t pte;
+	unsigned long flags;
+
 	if (!pte_young(*ptep))
 		return 0;
-	return test_and_clear_bit(xlate_pabit(_PAGE_ACCESSED_BIT), &pte_val(*ptep));
-#else
-	pte_t pte = *ptep;
-	if (!pte_young(pte))
+
+	spin_lock_irqsave(&pa_dbit_lock, flags);
+	pte = *ptep;
+	if (!pte_young(pte)) {
+		spin_unlock_irqrestore(&pa_dbit_lock, flags);
 		return 0;
-	set_pte_at(vma->vm_mm, addr, ptep, pte_mkold(pte));
+	}
+	set_pte(ptep, pte_mkold(pte));
+	purge_tlb_entries(vma->vm_mm, addr);
+	spin_unlock_irqrestore(&pa_dbit_lock, flags);
 	return 1;
-#endif
 }
 
-extern spinlock_t pa_dbit_lock;
-
 struct mm_struct;
 static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
 {
 	pte_t old_pte;
+	unsigned long flags;
 
-	spin_lock(&pa_dbit_lock);
+	spin_lock_irqsave(&pa_dbit_lock, flags);
 	old_pte = *ptep;
 	pte_clear(mm,addr,ptep);
-	spin_unlock(&pa_dbit_lock);
+	purge_tlb_entries(mm, addr);
+	spin_unlock_irqrestore(&pa_dbit_lock, flags);
 
 	return old_pte;
 }
 
 static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
 {
-#ifdef CONFIG_SMP
-	unsigned long new, old;
-
-	do {
-		old = pte_val(*ptep);
-		new = pte_val(pte_wrprotect(__pte (old)));
-	} while (cmpxchg((unsigned long *) ptep, old, new) != old);
+	unsigned long flags;
+	spin_lock_irqsave(&pa_dbit_lock, flags);
+	set_pte(ptep, pte_wrprotect(*ptep));
 	purge_tlb_entries(mm, addr);
-#else
-	pte_t old_pte = *ptep;
-	set_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
-#endif
+	spin_unlock_irqrestore(&pa_dbit_lock, flags);
 }
 
 #define pte_same(A,B)	(pte_val(A) == pte_val(B))
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/include/asm/uaccess.h linux-libre-3.9-gnu/arch/parisc/include/asm/uaccess.h
--- linux-libre-3.9-rc8-gnu/arch/parisc/include/asm/uaccess.h	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/parisc/include/asm/uaccess.h	2013-04-28 20:36:01.000000000 -0400
@@ -181,30 +181,24 @@ struct exception_data {
 #if !defined(CONFIG_64BIT)
 
 #define __put_kernel_asm64(__val,ptr) do {		    \
-	u64 __val64 = (u64)(__val);			    \
-	u32 hi = (__val64) >> 32;			    \
-	u32 lo = (__val64) & 0xffffffff;		    \
 	__asm__ __volatile__ (				    \
 		"\n1:\tstw %2,0(%1)"			    \
-		"\n2:\tstw %3,4(%1)\n\t"		    \
+		"\n2:\tstw %R2,4(%1)\n\t"		    \
 		ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_2)\
 		ASM_EXCEPTIONTABLE_ENTRY(2b,fixup_put_user_skip_1)\
 		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) \
+		: "r"(ptr), "r"(__val), "0"(__pu_err) \
 		: "r1");				    \
 } while (0)
 
 #define __put_user_asm64(__val,ptr) do {	    	    \
-	u64 __val64 = (u64)(__val);			    \
-	u32 hi = (__val64) >> 32;			    \
-	u32 lo = (__val64) & 0xffffffff;		    \
 	__asm__ __volatile__ (				    \
 		"\n1:\tstw %2,0(%%sr3,%1)"		    \
-		"\n2:\tstw %3,4(%%sr3,%1)\n\t"		    \
+		"\n2:\tstw %R2,4(%%sr3,%1)\n\t"		    \
 		ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_2)\
 		ASM_EXCEPTIONTABLE_ENTRY(2b,fixup_put_user_skip_1)\
 		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) \
+		: "r"(ptr), "r"(__val), "0"(__pu_err) \
 		: "r1");				    \
 } while (0)
 
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/kernel/cache.c linux-libre-3.9-gnu/arch/parisc/kernel/cache.c
--- linux-libre-3.9-rc8-gnu/arch/parisc/kernel/cache.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/parisc/kernel/cache.c	2013-04-28 20:36:01.000000000 -0400
@@ -421,14 +421,11 @@ void purge_tlb_entries(struct mm_struct
 	/* Note: purge_tlb_entries can be called at startup with
 	   no context.  */
 
-	/* Disable preemption while we play with %sr1.  */
-	preempt_disable();
-	mtsp(mm->context, 1);
 	purge_tlb_start(flags);
+	mtsp(mm->context, 1);
 	pdtlb(addr);
 	pitlb(addr);
 	purge_tlb_end(flags);
-	preempt_enable();
 }
 EXPORT_SYMBOL(purge_tlb_entries);
 
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/kernel/parisc_ksyms.c linux-libre-3.9-gnu/arch/parisc/kernel/parisc_ksyms.c
--- linux-libre-3.9-rc8-gnu/arch/parisc/kernel/parisc_ksyms.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/parisc/kernel/parisc_ksyms.c	2013-04-28 20:36:01.000000000 -0400
@@ -120,11 +120,13 @@ extern void __ashrdi3(void);
 extern void __ashldi3(void);
 extern void __lshrdi3(void);
 extern void __muldi3(void);
+extern void __ucmpdi2(void);
 
 EXPORT_SYMBOL(__ashrdi3);
 EXPORT_SYMBOL(__ashldi3);
 EXPORT_SYMBOL(__lshrdi3);
 EXPORT_SYMBOL(__muldi3);
+EXPORT_SYMBOL(__ucmpdi2);
 
 asmlinkage void * __canonicalize_funcptr_for_compare(void *);
 EXPORT_SYMBOL(__canonicalize_funcptr_for_compare);
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/lib/Makefile linux-libre-3.9-gnu/arch/parisc/lib/Makefile
--- linux-libre-3.9-rc8-gnu/arch/parisc/lib/Makefile	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/parisc/lib/Makefile	2013-04-28 20:36:01.000000000 -0400
@@ -2,6 +2,7 @@
 # Makefile for parisc-specific library files
 #
 
-lib-y	:= lusercopy.o bitops.o checksum.o io.o memset.o fixup.o memcpy.o
+lib-y	:= lusercopy.o bitops.o checksum.o io.o memset.o fixup.o memcpy.o \
+	   ucmpdi2.o
 
 obj-y	:= iomap.o
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/lib/ucmpdi2.c linux-libre-3.9-gnu/arch/parisc/lib/ucmpdi2.c
--- linux-libre-3.9-rc8-gnu/arch/parisc/lib/ucmpdi2.c	1969-12-31 19:00:00.000000000 -0500
+++ linux-libre-3.9-gnu/arch/parisc/lib/ucmpdi2.c	2013-04-28 20:36:01.000000000 -0400
@@ -0,0 +1,25 @@
+#include <linux/module.h>
+
+union ull_union {
+	unsigned long long ull;
+	struct {
+		unsigned int high;
+		unsigned int low;
+	} ui;
+};
+
+int __ucmpdi2(unsigned long long a, unsigned long long b)
+{
+	union ull_union au = {.ull = a};
+	union ull_union bu = {.ull = b};
+
+	if (au.ui.high < bu.ui.high)
+		return 0;
+	else if (au.ui.high > bu.ui.high)
+		return 2;
+	if (au.ui.low < bu.ui.low)
+		return 0;
+	else if (au.ui.low > bu.ui.low)
+		return 2;
+	return 1;
+}
diff -druNp linux-libre-3.9-rc8-gnu/arch/parisc/Makefile linux-libre-3.9-gnu/arch/parisc/Makefile
--- linux-libre-3.9-rc8-gnu/arch/parisc/Makefile	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/parisc/Makefile	2013-04-28 20:36:01.000000000 -0400
@@ -65,8 +65,10 @@ ifndef CONFIG_FUNCTION_TRACER
 endif
 
 # Use long jumps instead of long branches (needed if your linker fails to
-# link a too big vmlinux executable)
-cflags-$(CONFIG_MLONGCALLS)	+= -mlong-calls
+# link a too big vmlinux executable). Not enabled for building modules.
+ifdef CONFIG_MLONGCALLS
+KBUILD_CFLAGS_KERNEL += -mlong-calls
+endif
 
 # select which processor to optimise for
 cflags-$(CONFIG_PA7100)		+= -march=1.1 -mschedule=7100
diff -druNp linux-libre-3.9-rc8-gnu/arch/sparc/mm/tlb.c linux-libre-3.9-gnu/arch/sparc/mm/tlb.c
--- linux-libre-3.9-rc8-gnu/arch/sparc/mm/tlb.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/sparc/mm/tlb.c	2013-04-28 20:36:01.000000000 -0400
@@ -87,7 +87,7 @@ static void tlb_batch_add_one(struct mm_
 	if (!tb->active) {
 		global_flush_tlb_page(mm, vaddr);
 		flush_tsb_user_page(mm, vaddr);
-		return;
+		goto out;
 	}
 
 	if (nr == 0)
@@ -98,6 +98,7 @@ static void tlb_batch_add_one(struct mm_
 	if (nr >= TLB_BATCH_NR)
 		flush_tlb_pending();
 
+out:
 	put_cpu_var(tlb_batch);
 }
 
diff -druNp linux-libre-3.9-rc8-gnu/arch/x86/boot/compressed/eboot.c linux-libre-3.9-gnu/arch/x86/boot/compressed/eboot.c
--- linux-libre-3.9-rc8-gnu/arch/x86/boot/compressed/eboot.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/arch/x86/boot/compressed/eboot.c	2013-04-28 20:36:01.000000000 -0400
@@ -258,7 +258,7 @@ static efi_status_t setup_efi_vars(struc
 	u64 store_size, remaining_size, var_size;
 	efi_status_t status;
 
-	if (!sys_table->runtime->query_variable_info)
+	if (sys_table->runtime->hdr.revision < EFI_2_00_SYSTEM_TABLE_REVISION)
 		return EFI_UNSUPPORTED;
 
 	data = (struct setup_data *)(unsigned long)params->hdr.setup_data;
@@ -266,7 +266,7 @@ static efi_status_t setup_efi_vars(struc
 	while (data && data->next)
 		data = (struct setup_data *)(unsigned long)data->next;
 
-	status = efi_call_phys4(sys_table->runtime->query_variable_info,
+	status = efi_call_phys4((void *)sys_table->runtime->query_variable_info,
 				EFI_VARIABLE_NON_VOLATILE |
 				EFI_VARIABLE_BOOTSERVICE_ACCESS |
 				EFI_VARIABLE_RUNTIME_ACCESS, &store_size,
diff -druNp linux-libre-3.9-rc8-gnu/crypto/algif_hash.c linux-libre-3.9-gnu/crypto/algif_hash.c
--- linux-libre-3.9-rc8-gnu/crypto/algif_hash.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/crypto/algif_hash.c	2013-04-28 20:36:01.000000000 -0400
@@ -161,6 +161,8 @@ static int hash_recvmsg(struct kiocb *un
 	else if (len < ds)
 		msg->msg_flags |= MSG_TRUNC;
 
+	msg->msg_namelen = 0;
+
 	lock_sock(sk);
 	if (ctx->more) {
 		ctx->more = 0;
diff -druNp linux-libre-3.9-rc8-gnu/crypto/algif_skcipher.c linux-libre-3.9-gnu/crypto/algif_skcipher.c
--- linux-libre-3.9-rc8-gnu/crypto/algif_skcipher.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/crypto/algif_skcipher.c	2013-04-28 20:36:01.000000000 -0400
@@ -432,6 +432,7 @@ static int skcipher_recvmsg(struct kiocb
 	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 -druNp linux-libre-3.9-rc8-gnu/drivers/firmware/efivars.c linux-libre-3.9-gnu/drivers/firmware/efivars.c
--- linux-libre-3.9-rc8-gnu/drivers/firmware/efivars.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/drivers/firmware/efivars.c	2013-04-28 20:36:01.000000000 -0400
@@ -1628,10 +1628,11 @@ static ssize_t efivar_delete(struct file
 	return count;
 }
 
-static bool variable_is_present(efi_char16_t *variable_name, efi_guid_t *vendor)
+static bool variable_is_present(struct efivars *efivars,
+				efi_char16_t *variable_name,
+				efi_guid_t *vendor)
 {
 	struct efivar_entry *entry, *n;
-	struct efivars *efivars = &__efivars;
 	unsigned long strsize1, strsize2;
 	bool found = false;
 
@@ -1703,8 +1704,8 @@ static void efivar_update_sysfs_entries(
 			if (status != EFI_SUCCESS) {
 				break;
 			} else {
-				if (!variable_is_present(variable_name,
-				    &vendor)) {
+				if (!variable_is_present(efivars,
+				    variable_name, &vendor)) {
 					found = true;
 					break;
 				}
@@ -2008,7 +2009,8 @@ int register_efivars(struct efivars *efi
 			 * we'll ever see a different variable name,
 			 * and may end up looping here forever.
 			 */
-			if (variable_is_present(variable_name, &vendor_guid)) {
+			if (variable_is_present(efivars, variable_name,
+						&vendor_guid)) {
 				dup_variable_bug(variable_name, &vendor_guid,
 						 variable_name_size);
 				status = EFI_NOT_FOUND;
diff -druNp linux-libre-3.9-rc8-gnu/drivers/gpio/gpio-pxa.c linux-libre-3.9-gnu/drivers/gpio/gpio-pxa.c
--- linux-libre-3.9-rc8-gnu/drivers/gpio/gpio-pxa.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/drivers/gpio/gpio-pxa.c	2013-04-28 20:36:01.000000000 -0400
@@ -642,7 +642,12 @@ static struct platform_driver pxa_gpio_d
 		.of_match_table = of_match_ptr(pxa_gpio_dt_ids),
 	},
 };
-module_platform_driver(pxa_gpio_driver);
+
+static int __init pxa_gpio_init(void)
+{
+	return platform_driver_register(&pxa_gpio_driver);
+}
+postcore_initcall(pxa_gpio_init);
 
 #ifdef CONFIG_PM
 static int pxa_gpio_suspend(void)
diff -druNp linux-libre-3.9-rc8-gnu/drivers/media/dvb-frontends/mb86a20s.c linux-libre-3.9-gnu/drivers/media/dvb-frontends/mb86a20s.c
--- linux-libre-3.9-rc8-gnu/drivers/media/dvb-frontends/mb86a20s.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/drivers/media/dvb-frontends/mb86a20s.c	2013-04-28 20:36:01.000000000 -0400
@@ -610,7 +610,7 @@ static void mb86a20s_layer_bitrate(struc
 	       __func__, 'A' + layer, segment * isdbt_rate[m][f][i]/1000,
 		rate, rate);
 
-	state->estimated_rate[i] = rate;
+	state->estimated_rate[layer] = rate;
 }
 
 
diff -druNp linux-libre-3.9-rc8-gnu/drivers/media/pci/cx25821/cx25821-video.c linux-libre-3.9-gnu/drivers/media/pci/cx25821/cx25821-video.c
--- linux-libre-3.9-rc8-gnu/drivers/media/pci/cx25821/cx25821-video.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/drivers/media/pci/cx25821/cx25821-video.c	2013-04-28 20:36:01.000000000 -0400
@@ -461,7 +461,7 @@ int cx25821_video_register(struct cx2582
 
 	spin_lock_init(&dev->slock);
 
-	for (i = 0; i < MAX_VID_CHANNEL_NUM - 1; ++i) {
+	for (i = 0; i < VID_CHANNEL_NUM; ++i) {
 		cx25821_init_controls(dev, i);
 
 		cx25821_risc_stopper(dev->pci, &dev->channels[i].vidq.stopper,
diff -druNp linux-libre-3.9-rc8-gnu/drivers/tty/tty_io.c linux-libre-3.9-gnu/drivers/tty/tty_io.c
--- linux-libre-3.9-rc8-gnu/drivers/tty/tty_io.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/drivers/tty/tty_io.c	2013-04-28 20:36:01.000000000 -0400
@@ -941,6 +941,14 @@ void start_tty(struct tty_struct *tty)
 
 EXPORT_SYMBOL(start_tty);
 
+static void tty_update_time(struct timespec *time)
+{
+	unsigned long sec = get_seconds();
+	sec -= sec % 60;
+	if ((long)(sec - time->tv_sec) > 0)
+		time->tv_sec = sec;
+}
+
 /**
  *	tty_read	-	read method for tty device files
  *	@file: pointer to tty file
@@ -960,10 +968,11 @@ static ssize_t tty_read(struct file *fil
 			loff_t *ppos)
 {
 	int i;
+	struct inode *inode = file_inode(file);
 	struct tty_struct *tty = file_tty(file);
 	struct tty_ldisc *ld;
 
-	if (tty_paranoia_check(tty, file_inode(file), "tty_read"))
+	if (tty_paranoia_check(tty, inode, "tty_read"))
 		return -EIO;
 	if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
 		return -EIO;
@@ -977,6 +986,9 @@ static ssize_t tty_read(struct file *fil
 		i = -EIO;
 	tty_ldisc_deref(ld);
 
+	if (i > 0)
+		tty_update_time(&inode->i_atime);
+
 	return i;
 }
 
@@ -1077,8 +1089,10 @@ static inline ssize_t do_tty_write(
 			break;
 		cond_resched();
 	}
-	if (written)
+	if (written) {
+		tty_update_time(&file_inode(file)->i_mtime);
 		ret = written;
+	}
 out:
 	tty_write_unlock(tty);
 	return ret;
diff -druNp linux-libre-3.9-rc8-gnu/fs/aio.c linux-libre-3.9-gnu/fs/aio.c
--- linux-libre-3.9-rc8-gnu/fs/aio.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/fs/aio.c	2013-04-28 20:36:01.000000000 -0400
@@ -1029,9 +1029,9 @@ static int aio_read_evt(struct kioctx *i
 	spin_unlock(&info->ring_lock);
 
 out:
-	kunmap_atomic(ring);
 	dprintk("leaving aio_read_evt: %d  h%lu t%lu\n", ret,
 		 (unsigned long)ring->head, (unsigned long)ring->tail);
+	kunmap_atomic(ring);
 	return ret;
 }
 
diff -druNp linux-libre-3.9-rc8-gnu/kernel/events/core.c linux-libre-3.9-gnu/kernel/events/core.c
--- linux-libre-3.9-rc8-gnu/kernel/events/core.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/kernel/events/core.c	2013-04-28 20:36:01.000000000 -0400
@@ -4596,6 +4596,7 @@ void perf_event_comm(struct task_struct
 	struct perf_event_context *ctx;
 	int ctxn;
 
+	rcu_read_lock();
 	for_each_task_context_nr(ctxn) {
 		ctx = task->perf_event_ctxp[ctxn];
 		if (!ctx)
@@ -4603,6 +4604,7 @@ void perf_event_comm(struct task_struct
 
 		perf_event_enable_on_exec(ctx);
 	}
+	rcu_read_unlock();
 
 	if (!atomic_read(&nr_comm_events))
 		return;
diff -druNp linux-libre-3.9-rc8-gnu/kernel/.gitignore linux-libre-3.9-gnu/kernel/.gitignore
--- linux-libre-3.9-rc8-gnu/kernel/.gitignore	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/kernel/.gitignore	2013-04-28 20:36:01.000000000 -0400
@@ -4,3 +4,4 @@
 config_data.h
 config_data.gz
 timeconst.h
+hz.bc
diff -druNp linux-libre-3.9-rc8-gnu/Makefile linux-libre-3.9-gnu/Makefile
--- linux-libre-3.9-rc8-gnu/Makefile	2013-04-28 19:10:23.000000000 -0400
+++ linux-libre-3.9-gnu/Makefile	2013-04-28 22:21:03.000000000 -0400
@@ -1,7 +1,7 @@
 VERSION = 3
 PATCHLEVEL = 9
 SUBLEVEL = 0
-EXTRAVERSION = -rc8-gnu
+EXTRAVERSION =-gnu
 NAME = Unicycling Gorilla
 
 # *DOCUMENTATION*
diff -druNp linux-libre-3.9-rc8-gnu/mm/nommu.c linux-libre-3.9-gnu/mm/nommu.c
--- linux-libre-3.9-rc8-gnu/mm/nommu.c	2013-04-21 17:38:45.000000000 -0400
+++ linux-libre-3.9-gnu/mm/nommu.c	2013-04-28 20:36:01.000000000 -0400
@@ -1838,6 +1838,16 @@ int remap_pfn_range(struct vm_area_struc
 }
 EXPORT_SYMBOL(remap_pfn_range);
 
+int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len)
+{
+	unsigned long pfn = start >> PAGE_SHIFT;
+	unsigned long vm_len = vma->vm_end - vma->vm_start;
+
+	pfn += vma->vm_pgoff;
+	return io_remap_pfn_range(vma, vma->vm_start, pfn, vm_len, vma->vm_page_prot);
+}
+EXPORT_SYMBOL(vm_iomap_memory);
+
 int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,
 			unsigned long pgoff)
 {
