]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 29 Oct 2012 17:09:13 +0000 (10:09 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 29 Oct 2012 17:09:13 +0000 (10:09 -0700)
added patches:
cfg80211-mac80211-avoid-state-mishmash-on-deauth.patch
efi-defer-freeing-boot-services-memory-until-after-acpi-init.patch
x86-efi-turn-off-efi_enabled-after-setup-on-mixed-fw-kernel.patch

queue-3.6/cfg80211-mac80211-avoid-state-mishmash-on-deauth.patch [new file with mode: 0644]
queue-3.6/efi-defer-freeing-boot-services-memory-until-after-acpi-init.patch [new file with mode: 0644]
queue-3.6/series
queue-3.6/x86-efi-turn-off-efi_enabled-after-setup-on-mixed-fw-kernel.patch [new file with mode: 0644]

diff --git a/queue-3.6/cfg80211-mac80211-avoid-state-mishmash-on-deauth.patch b/queue-3.6/cfg80211-mac80211-avoid-state-mishmash-on-deauth.patch
new file mode 100644 (file)
index 0000000..ef05cc6
--- /dev/null
@@ -0,0 +1,87 @@
+From 6863255bd0e48bc41ae5a066d5c771801e92735a Mon Sep 17 00:00:00 2001
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+Date: Mon, 15 Oct 2012 14:52:41 +0200
+Subject: cfg80211/mac80211: avoid state mishmash on deauth
+
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+
+commit 6863255bd0e48bc41ae5a066d5c771801e92735a upstream.
+
+Avoid situation when we are on associate state in mac80211 and
+on disassociate state in cfg80211. This can results on crash
+during modules unload (like showed on this thread:
+http://marc.info/?t=134373976300001&r=1&w=2) and possibly other
+problems.
+
+Reported-by: Pedro Francisco <pedrogfrancisco@gmail.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/net/cfg80211.h |    1 +
+ net/mac80211/mlme.c    |    5 +++--
+ net/wireless/mlme.c    |   12 +++---------
+ 3 files changed, 7 insertions(+), 11 deletions(-)
+
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -1217,6 +1217,7 @@ struct cfg80211_deauth_request {
+       const u8 *ie;
+       size_t ie_len;
+       u16 reason_code;
++      bool local_state_change;
+ };
+ /**
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -3467,6 +3467,7 @@ int ieee80211_mgd_deauth(struct ieee8021
+ {
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       u8 frame_buf[DEAUTH_DISASSOC_LEN];
++      bool tx = !req->local_state_change;
+       mutex_lock(&ifmgd->mtx);
+@@ -3483,11 +3484,11 @@ int ieee80211_mgd_deauth(struct ieee8021
+       if (ifmgd->associated &&
+           ether_addr_equal(ifmgd->associated->bssid, req->bssid))
+               ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
+-                                     req->reason_code, true, frame_buf);
++                                     req->reason_code, tx, frame_buf);
+       else
+               ieee80211_send_deauth_disassoc(sdata, req->bssid,
+                                              IEEE80211_STYPE_DEAUTH,
+-                                             req->reason_code, true,
++                                             req->reason_code, tx,
+                                              frame_buf);
+       mutex_unlock(&ifmgd->mtx);
+--- a/net/wireless/mlme.c
++++ b/net/wireless/mlme.c
+@@ -457,20 +457,14 @@ int __cfg80211_mlme_deauth(struct cfg802
+               .reason_code = reason,
+               .ie = ie,
+               .ie_len = ie_len,
++              .local_state_change = local_state_change,
+       };
+       ASSERT_WDEV_LOCK(wdev);
+-      if (local_state_change) {
+-              if (wdev->current_bss &&
+-                  ether_addr_equal(wdev->current_bss->pub.bssid, bssid)) {
+-                      cfg80211_unhold_bss(wdev->current_bss);
+-                      cfg80211_put_bss(&wdev->current_bss->pub);
+-                      wdev->current_bss = NULL;
+-              }
+-
++      if (local_state_change && (!wdev->current_bss ||
++          !ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
+               return 0;
+-      }
+       return rdev->ops->deauth(&rdev->wiphy, dev, &req);
+ }
diff --git a/queue-3.6/efi-defer-freeing-boot-services-memory-until-after-acpi-init.patch b/queue-3.6/efi-defer-freeing-boot-services-memory-until-after-acpi-init.patch
new file mode 100644 (file)
index 0000000..37b0097
--- /dev/null
@@ -0,0 +1,122 @@
+From 785107923a83d8456bbd8564e288a24d84109a46 Mon Sep 17 00:00:00 2001
+From: Josh Triplett <josh@joshtriplett.org>
+Date: Fri, 28 Sep 2012 17:55:44 -0700
+Subject: efi: Defer freeing boot services memory until after ACPI init
+
+From: Josh Triplett <josh@joshtriplett.org>
+
+commit 785107923a83d8456bbd8564e288a24d84109a46 upstream.
+
+Some new ACPI 5.0 tables reference resources stored in boot services
+memory, so keep that memory around until we have ACPI and can extract
+data from it.
+
+Signed-off-by: Josh Triplett <josh@joshtriplett.org>
+Link: http://lkml.kernel.org/r/baaa6d44bdc4eb0c58e5d1b4ccd2c729f854ac55.1348876882.git.josh@joshtriplett.org
+Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
+Cc: Matt Fleming <matt@console-pimps.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/platform/efi/efi.c |   31 ++++++++++++++++++-------------
+ include/linux/efi.h         |    5 +++++
+ init/main.c                 |    3 +++
+ 3 files changed, 26 insertions(+), 13 deletions(-)
+
+--- a/arch/x86/platform/efi/efi.c
++++ b/arch/x86/platform/efi/efi.c
+@@ -419,10 +419,21 @@ void __init efi_reserve_boot_services(vo
+       }
+ }
+-static void __init efi_free_boot_services(void)
++static void __init efi_unmap_memmap(void)
++{
++      if (memmap.map) {
++              early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
++              memmap.map = NULL;
++      }
++}
++
++void __init efi_free_boot_services(void)
+ {
+       void *p;
++      if (!efi_native)
++              return;
++
+       for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
+               efi_memory_desc_t *md = p;
+               unsigned long long start = md->phys_addr;
+@@ -438,6 +449,8 @@ static void __init efi_free_boot_service
+               free_bootmem_late(start, size);
+       }
++
++      efi_unmap_memmap();
+ }
+ static int __init efi_systab_init(void *phys)
+@@ -787,8 +800,10 @@ void __init efi_enter_virtual_mode(void)
+        * non-native EFI
+        */
+-      if (!efi_native)
+-              goto out;
++      if (!efi_native) {
++              efi_unmap_memmap();
++              return;
++      }
+       /* Merge contiguous regions of the same type and attribute */
+       for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
+@@ -878,13 +893,6 @@ void __init efi_enter_virtual_mode(void)
+       }
+       /*
+-       * Thankfully, it does seem that no runtime services other than
+-       * SetVirtualAddressMap() will touch boot services code, so we can
+-       * get rid of it all at this point
+-       */
+-      efi_free_boot_services();
+-
+-      /*
+        * Now that EFI is in virtual mode, update the function
+        * pointers in the runtime service table to the new virtual addresses.
+        *
+@@ -907,9 +915,6 @@ void __init efi_enter_virtual_mode(void)
+       if (__supported_pte_mask & _PAGE_NX)
+               runtime_code_page_mkexec();
+-out:
+-      early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
+-      memmap.map = NULL;
+       kfree(new_memmap);
+ }
+--- a/include/linux/efi.h
++++ b/include/linux/efi.h
+@@ -496,6 +496,11 @@ extern void efi_map_pal_code (void);
+ extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
+ extern void efi_gettimeofday (struct timespec *ts);
+ extern void efi_enter_virtual_mode (void);    /* switch EFI to virtual mode, if possible */
++#ifdef CONFIG_X86
++extern void efi_free_boot_services(void);
++#else
++static inline void efi_free_boot_services(void) {}
++#endif
+ extern u64 efi_get_iobase (void);
+ extern u32 efi_mem_type (unsigned long phys_addr);
+ extern u64 efi_mem_attributes (unsigned long phys_addr);
+--- a/init/main.c
++++ b/init/main.c
+@@ -631,6 +631,9 @@ asmlinkage void __init start_kernel(void
+       acpi_early_init(); /* before LAPIC and SMP init */
+       sfi_init_late();
++      if (efi_enabled)
++              efi_free_boot_services();
++
+       ftrace_init();
+       /* Do the rest non-__init'ed, we're now alive */
index fdfcedc75bad097a5e466e6384559baca2ae6eaa..b7eb09c520fc7862c1365d0f5801e2635e646a43 100644 (file)
@@ -94,3 +94,6 @@ cpufreq-powernow-k8-remove-usage-of-smp_processor_id-in-preemptible-code.patch
 revert-ath9k_hw-updated-ar9003-tx-gain-table-for-5ghz.patch
 x86-mm-find_early_table_space-based-on-ranges-that-are-actually-being-mapped.patch
 x86-mm-undo-incorrect-revert-in-arch-x86-mm-init.c.patch
+cfg80211-mac80211-avoid-state-mishmash-on-deauth.patch
+efi-defer-freeing-boot-services-memory-until-after-acpi-init.patch
+x86-efi-turn-off-efi_enabled-after-setup-on-mixed-fw-kernel.patch
diff --git a/queue-3.6/x86-efi-turn-off-efi_enabled-after-setup-on-mixed-fw-kernel.patch b/queue-3.6/x86-efi-turn-off-efi_enabled-after-setup-on-mixed-fw-kernel.patch
new file mode 100644 (file)
index 0000000..726f1a5
--- /dev/null
@@ -0,0 +1,140 @@
+From 5189c2a7c7769ee9d037d76c1a7b8550ccf3481c Mon Sep 17 00:00:00 2001
+From: Olof Johansson <olof@lixom.net>
+Date: Wed, 24 Oct 2012 10:00:44 -0700
+Subject: x86: efi: Turn off efi_enabled after setup on mixed fw/kernel
+
+From: Olof Johansson <olof@lixom.net>
+
+commit 5189c2a7c7769ee9d037d76c1a7b8550ccf3481c upstream.
+
+When 32-bit EFI is used with 64-bit kernel (or vice versa), turn off
+efi_enabled once setup is done. Beyond setup, it is normally used to
+determine if runtime services are available and we will have none.
+
+This will resolve issues stemming from efivars modprobe panicking on a
+32/64-bit setup, as well as some reboot issues on similar setups.
+
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45991
+
+Reported-by: Marko Kohtala <marko.kohtala@gmail.com>
+Reported-by: Maxim Kammerer <mk@dee.su>
+Signed-off-by: Olof Johansson <olof@lixom.net>
+Acked-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
+Cc: Matthew Garrett <mjg@redhat.com>
+Signed-off-by: Matt Fleming <matt.fleming@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/efi.h  |    1 +
+ arch/x86/kernel/setup.c     |   12 ++++++++++++
+ arch/x86/platform/efi/efi.c |   18 ++++++++++--------
+ 3 files changed, 23 insertions(+), 8 deletions(-)
+
+--- a/arch/x86/include/asm/efi.h
++++ b/arch/x86/include/asm/efi.h
+@@ -98,6 +98,7 @@ extern void efi_set_executable(efi_memor
+ extern int efi_memblock_x86_reserve_range(void);
+ extern void efi_call_phys_prelog(void);
+ extern void efi_call_phys_epilog(void);
++extern void efi_unmap_memmap(void);
+ #ifndef CONFIG_EFI
+ /*
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -1047,6 +1047,18 @@ void __init setup_arch(char **cmdline_p)
+       mcheck_init();
+       arch_init_ideal_nops();
++
++#ifdef CONFIG_EFI
++      /* Once setup is done above, disable efi_enabled on mismatched
++       * firmware/kernel archtectures since there is no support for
++       * runtime services.
++       */
++      if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) {
++              pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
++              efi_unmap_memmap();
++              efi_enabled = 0;
++      }
++#endif
+ }
+ #ifdef CONFIG_X86_32
+--- a/arch/x86/platform/efi/efi.c
++++ b/arch/x86/platform/efi/efi.c
+@@ -69,11 +69,15 @@ EXPORT_SYMBOL(efi);
+ struct efi_memory_map memmap;
+ bool efi_64bit;
+-static bool efi_native;
+ static struct efi efi_phys __initdata;
+ static efi_system_table_t efi_systab __initdata;
++static inline bool efi_is_native(void)
++{
++      return IS_ENABLED(CONFIG_X86_64) == efi_64bit;
++}
++
+ static int __init setup_noefi(char *arg)
+ {
+       efi_enabled = 0;
+@@ -419,7 +423,7 @@ void __init efi_reserve_boot_services(vo
+       }
+ }
+-static void __init efi_unmap_memmap(void)
++void __init efi_unmap_memmap(void)
+ {
+       if (memmap.map) {
+               early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
+@@ -431,7 +435,7 @@ void __init efi_free_boot_services(void)
+ {
+       void *p;
+-      if (!efi_native)
++      if (!efi_is_native())
+               return;
+       for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
+@@ -683,12 +687,10 @@ void __init efi_init(void)
+               return;
+       }
+       efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
+-      efi_native = !efi_64bit;
+ #else
+       efi_phys.systab = (efi_system_table_t *)
+                         (boot_params.efi_info.efi_systab |
+                         ((__u64)boot_params.efi_info.efi_systab_hi<<32));
+-      efi_native = efi_64bit;
+ #endif
+       if (efi_systab_init(efi_phys.systab)) {
+@@ -722,7 +724,7 @@ void __init efi_init(void)
+        * that doesn't match the kernel 32/64-bit mode.
+        */
+-      if (!efi_native)
++      if (!efi_is_native())
+               pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
+       else if (efi_runtime_init()) {
+               efi_enabled = 0;
+@@ -734,7 +736,7 @@ void __init efi_init(void)
+               return;
+       }
+ #ifdef CONFIG_X86_32
+-      if (efi_native) {
++      if (efi_is_native()) {
+               x86_platform.get_wallclock = efi_get_time;
+               x86_platform.set_wallclock = efi_set_rtc_mmss;
+       }
+@@ -800,7 +802,7 @@ void __init efi_enter_virtual_mode(void)
+        * non-native EFI
+        */
+-      if (!efi_native) {
++      if (!efi_is_native()) {
+               efi_unmap_memmap();
+               return;
+       }