Linux v3.9-7391-g20b4fb4
This commit is contained in:
parent
07dc3e04ce
commit
097cca6962
@ -1,219 +0,0 @@
|
|||||||
From 8125696991194aacb1173b6e8196d19098b44e17 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
||||||
Date: Thu, 28 Feb 2013 09:55:25 +0000
|
|
||||||
Subject: cfg80211/mac80211: disconnect on suspend
|
|
||||||
|
|
||||||
If possible that after suspend, cfg80211 will receive request to
|
|
||||||
disconnect what require action on interface that was removed during
|
|
||||||
suspend.
|
|
||||||
|
|
||||||
Problem can manifest itself by various warnings similar to below one:
|
|
||||||
|
|
||||||
WARNING: at net/mac80211/driver-ops.h:12 ieee80211_bss_info_change_notify+0x2f9/0x300 [mac80211]()
|
|
||||||
wlan0: Failed check-sdata-in-driver check, flags: 0x4
|
|
||||||
Call Trace:
|
|
||||||
[<c043e0b3>] warn_slowpath_fmt+0x33/0x40
|
|
||||||
[<f83707c9>] ieee80211_bss_info_change_notify+0x2f9/0x300 [mac80211]
|
|
||||||
[<f83a660a>] ieee80211_recalc_ps_vif+0x2a/0x30 [mac80211]
|
|
||||||
[<f83a6706>] ieee80211_set_disassoc+0xf6/0x500 [mac80211]
|
|
||||||
[<f83a9441>] ieee80211_mgd_deauth+0x1f1/0x280 [mac80211]
|
|
||||||
[<f8381b36>] ieee80211_deauth+0x16/0x20 [mac80211]
|
|
||||||
[<f8261e70>] cfg80211_mlme_down+0x70/0xc0 [cfg80211]
|
|
||||||
[<f8264de1>] __cfg80211_disconnect+0x1b1/0x1d0 [cfg80211]
|
|
||||||
|
|
||||||
To fix the problem disconnect from any associated network before
|
|
||||||
suspend. User space is responsible to establish connection again
|
|
||||||
after resume. This basically need to be done by user space anyway,
|
|
||||||
because associated stations can go away during suspend (for example
|
|
||||||
NetworkManager disconnects on suspend and connect on resume by default).
|
|
||||||
|
|
||||||
Patch also handle situation when driver refuse to suspend with wowlan
|
|
||||||
configured and try to suspend again without it.
|
|
||||||
|
|
||||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
||||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
||||||
---
|
|
||||||
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c
|
|
||||||
index d0275f3..4d105c7 100644
|
|
||||||
--- a/net/mac80211/pm.c
|
|
||||||
+++ b/net/mac80211/pm.c
|
|
||||||
@@ -93,7 +93,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
|
||||||
return err;
|
|
||||||
} else if (err > 0) {
|
|
||||||
WARN_ON(err != 1);
|
|
||||||
- local->wowlan = false;
|
|
||||||
+ return err;
|
|
||||||
} else {
|
|
||||||
list_for_each_entry(sdata, &local->interfaces, list)
|
|
||||||
if (ieee80211_sdata_running(sdata))
|
|
||||||
diff --git a/net/wireless/core.c b/net/wireless/core.c
|
|
||||||
index ea4155f..f382cae 100644
|
|
||||||
--- a/net/wireless/core.c
|
|
||||||
+++ b/net/wireless/core.c
|
|
||||||
@@ -814,6 +814,46 @@ void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
|
|
||||||
rdev->num_running_monitor_ifaces += num;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void cfg80211_leave(struct cfg80211_registered_device *rdev,
|
|
||||||
+ struct wireless_dev *wdev)
|
|
||||||
+{
|
|
||||||
+ struct net_device *dev = wdev->netdev;
|
|
||||||
+
|
|
||||||
+ switch (wdev->iftype) {
|
|
||||||
+ case NL80211_IFTYPE_ADHOC:
|
|
||||||
+ cfg80211_leave_ibss(rdev, dev, true);
|
|
||||||
+ break;
|
|
||||||
+ case NL80211_IFTYPE_P2P_CLIENT:
|
|
||||||
+ case NL80211_IFTYPE_STATION:
|
|
||||||
+ mutex_lock(&rdev->sched_scan_mtx);
|
|
||||||
+ __cfg80211_stop_sched_scan(rdev, false);
|
|
||||||
+ mutex_unlock(&rdev->sched_scan_mtx);
|
|
||||||
+
|
|
||||||
+ wdev_lock(wdev);
|
|
||||||
+#ifdef CONFIG_CFG80211_WEXT
|
|
||||||
+ kfree(wdev->wext.ie);
|
|
||||||
+ wdev->wext.ie = NULL;
|
|
||||||
+ wdev->wext.ie_len = 0;
|
|
||||||
+ wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
|
|
||||||
+#endif
|
|
||||||
+ __cfg80211_disconnect(rdev, dev,
|
|
||||||
+ WLAN_REASON_DEAUTH_LEAVING, true);
|
|
||||||
+ cfg80211_mlme_down(rdev, dev);
|
|
||||||
+ wdev_unlock(wdev);
|
|
||||||
+ break;
|
|
||||||
+ case NL80211_IFTYPE_MESH_POINT:
|
|
||||||
+ cfg80211_leave_mesh(rdev, dev);
|
|
||||||
+ break;
|
|
||||||
+ case NL80211_IFTYPE_AP:
|
|
||||||
+ cfg80211_stop_ap(rdev, dev);
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ wdev->beacon_interval = 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
|
|
||||||
unsigned long state,
|
|
||||||
void *ndev)
|
|
||||||
@@ -882,38 +922,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
|
|
||||||
dev->priv_flags |= IFF_DONT_BRIDGE;
|
|
||||||
break;
|
|
||||||
case NETDEV_GOING_DOWN:
|
|
||||||
- switch (wdev->iftype) {
|
|
||||||
- case NL80211_IFTYPE_ADHOC:
|
|
||||||
- cfg80211_leave_ibss(rdev, dev, true);
|
|
||||||
- break;
|
|
||||||
- case NL80211_IFTYPE_P2P_CLIENT:
|
|
||||||
- case NL80211_IFTYPE_STATION:
|
|
||||||
- mutex_lock(&rdev->sched_scan_mtx);
|
|
||||||
- __cfg80211_stop_sched_scan(rdev, false);
|
|
||||||
- mutex_unlock(&rdev->sched_scan_mtx);
|
|
||||||
-
|
|
||||||
- wdev_lock(wdev);
|
|
||||||
-#ifdef CONFIG_CFG80211_WEXT
|
|
||||||
- kfree(wdev->wext.ie);
|
|
||||||
- wdev->wext.ie = NULL;
|
|
||||||
- wdev->wext.ie_len = 0;
|
|
||||||
- wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
|
|
||||||
-#endif
|
|
||||||
- __cfg80211_disconnect(rdev, dev,
|
|
||||||
- WLAN_REASON_DEAUTH_LEAVING, true);
|
|
||||||
- cfg80211_mlme_down(rdev, dev);
|
|
||||||
- wdev_unlock(wdev);
|
|
||||||
- break;
|
|
||||||
- case NL80211_IFTYPE_MESH_POINT:
|
|
||||||
- cfg80211_leave_mesh(rdev, dev);
|
|
||||||
- break;
|
|
||||||
- case NL80211_IFTYPE_AP:
|
|
||||||
- cfg80211_stop_ap(rdev, dev);
|
|
||||||
- break;
|
|
||||||
- default:
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- wdev->beacon_interval = 0;
|
|
||||||
+ cfg80211_leave(rdev, wdev);
|
|
||||||
break;
|
|
||||||
case NETDEV_DOWN:
|
|
||||||
cfg80211_update_iface_num(rdev, wdev->iftype, -1);
|
|
||||||
diff --git a/net/wireless/core.h b/net/wireless/core.h
|
|
||||||
index 9a2be8d..d5d06fd 100644
|
|
||||||
--- a/net/wireless/core.h
|
|
||||||
+++ b/net/wireless/core.h
|
|
||||||
@@ -503,6 +503,9 @@ int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev,
|
|
||||||
void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
|
|
||||||
enum nl80211_iftype iftype, int num);
|
|
||||||
|
|
||||||
+void cfg80211_leave(struct cfg80211_registered_device *rdev,
|
|
||||||
+ struct wireless_dev *wdev);
|
|
||||||
+
|
|
||||||
void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
|
|
||||||
struct wireless_dev *wdev);
|
|
||||||
|
|
||||||
diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
|
|
||||||
index 8c8b26f..d77e1c1 100644
|
|
||||||
--- a/net/wireless/rdev-ops.h
|
|
||||||
+++ b/net/wireless/rdev-ops.h
|
|
||||||
@@ -6,11 +6,12 @@
|
|
||||||
#include "core.h"
|
|
||||||
#include "trace.h"
|
|
||||||
|
|
||||||
-static inline int rdev_suspend(struct cfg80211_registered_device *rdev)
|
|
||||||
+static inline int rdev_suspend(struct cfg80211_registered_device *rdev,
|
|
||||||
+ struct cfg80211_wowlan *wowlan)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
- trace_rdev_suspend(&rdev->wiphy, rdev->wowlan);
|
|
||||||
- ret = rdev->ops->suspend(&rdev->wiphy, rdev->wowlan);
|
|
||||||
+ trace_rdev_suspend(&rdev->wiphy, wowlan);
|
|
||||||
+ ret = rdev->ops->suspend(&rdev->wiphy, wowlan);
|
|
||||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c
|
|
||||||
index 238ee49..8f28b9f 100644
|
|
||||||
--- a/net/wireless/sysfs.c
|
|
||||||
+++ b/net/wireless/sysfs.c
|
|
||||||
@@ -83,6 +83,14 @@ static int wiphy_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void cfg80211_leave_all(struct cfg80211_registered_device *rdev)
|
|
||||||
+{
|
|
||||||
+ struct wireless_dev *wdev;
|
|
||||||
+
|
|
||||||
+ list_for_each_entry(wdev, &rdev->wdev_list, list)
|
|
||||||
+ cfg80211_leave(rdev, wdev);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int wiphy_suspend(struct device *dev, pm_message_t state)
|
|
||||||
{
|
|
||||||
struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
|
|
||||||
@@ -90,12 +98,19 @@ static int wiphy_suspend(struct device *dev, pm_message_t state)
|
|
||||||
|
|
||||||
rdev->suspend_at = get_seconds();
|
|
||||||
|
|
||||||
- if (rdev->ops->suspend) {
|
|
||||||
- rtnl_lock();
|
|
||||||
- if (rdev->wiphy.registered)
|
|
||||||
- ret = rdev_suspend(rdev);
|
|
||||||
- rtnl_unlock();
|
|
||||||
+ rtnl_lock();
|
|
||||||
+ if (rdev->wiphy.registered) {
|
|
||||||
+ if (!rdev->wowlan)
|
|
||||||
+ cfg80211_leave_all(rdev);
|
|
||||||
+ if (rdev->ops->suspend)
|
|
||||||
+ ret = rdev_suspend(rdev, rdev->wowlan);
|
|
||||||
+ if (ret == 1) {
|
|
||||||
+ /* Driver refuse to configure wowlan */
|
|
||||||
+ cfg80211_leave_all(rdev);
|
|
||||||
+ ret = rdev_suspend(rdev, NULL);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
+ rtnl_unlock();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
cgit v0.9.1
|
|
@ -656,6 +656,9 @@ CONFIG_NET=y
|
|||||||
|
|
||||||
CONFIG_NET_DMA=y
|
CONFIG_NET_DMA=y
|
||||||
|
|
||||||
|
CONFIG_NETLINK_MMAP=y
|
||||||
|
CONFIG_NETLINK_DIAG=m
|
||||||
|
|
||||||
CONFIG_TCP_CONG_ADVANCED=y
|
CONFIG_TCP_CONG_ADVANCED=y
|
||||||
CONFIG_TCP_CONG_BIC=m
|
CONFIG_TCP_CONG_BIC=m
|
||||||
CONFIG_TCP_CONG_CUBIC=y
|
CONFIG_TCP_CONG_CUBIC=y
|
||||||
@ -1041,6 +1044,7 @@ CONFIG_IP_DCCP_CCID3=y
|
|||||||
#
|
#
|
||||||
CONFIG_TIPC=m
|
CONFIG_TIPC=m
|
||||||
CONFIG_TIPC_PORTS=8192
|
CONFIG_TIPC_PORTS=8192
|
||||||
|
# CONFIG_TIPC_MEDIA_IB is not set
|
||||||
# CONFIG_TIPC_ADVANCED is not set
|
# CONFIG_TIPC_ADVANCED is not set
|
||||||
# CONFIG_TIPC_DEBUG is not set
|
# CONFIG_TIPC_DEBUG is not set
|
||||||
|
|
||||||
@ -1111,6 +1115,8 @@ CONFIG_DNS_RESOLVER=m
|
|||||||
CONFIG_BATMAN_ADV=m
|
CONFIG_BATMAN_ADV=m
|
||||||
CONFIG_BATMAN_ADV_BLA=y
|
CONFIG_BATMAN_ADV_BLA=y
|
||||||
CONFIG_BATMAN_ADV_DAT=y
|
CONFIG_BATMAN_ADV_DAT=y
|
||||||
|
CONFIG_BATMAN_ADV_NC=y
|
||||||
|
|
||||||
# CONFIG_BATMAN_ADV_DEBUG is not set
|
# CONFIG_BATMAN_ADV_DEBUG is not set
|
||||||
CONFIG_OPENVSWITCH=m
|
CONFIG_OPENVSWITCH=m
|
||||||
CONFIG_VSOCKETS=m
|
CONFIG_VSOCKETS=m
|
||||||
@ -1137,6 +1143,7 @@ CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
|
|||||||
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
|
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
|
||||||
CONFIG_NET_TEAM_MODE_LOADBALANCE=m
|
CONFIG_NET_TEAM_MODE_LOADBALANCE=m
|
||||||
CONFIG_NET_TEAM_MODE_BROADCAST=m
|
CONFIG_NET_TEAM_MODE_BROADCAST=m
|
||||||
|
CONFIG_NET_TEAM_MODE_RANDOM=m
|
||||||
CONFIG_DUMMY=m
|
CONFIG_DUMMY=m
|
||||||
CONFIG_BONDING=m
|
CONFIG_BONDING=m
|
||||||
CONFIG_MACVLAN=m
|
CONFIG_MACVLAN=m
|
||||||
@ -1336,6 +1343,7 @@ CONFIG_YELLOWFIN=m
|
|||||||
CONFIG_NET_VENDOR_QLOGIC=y
|
CONFIG_NET_VENDOR_QLOGIC=y
|
||||||
CONFIG_QLA3XXX=m
|
CONFIG_QLA3XXX=m
|
||||||
CONFIG_QLCNIC=m
|
CONFIG_QLCNIC=m
|
||||||
|
CONFIG_QLCNIC_SRIOV=y
|
||||||
CONFIG_QLGE=m
|
CONFIG_QLGE=m
|
||||||
CONFIG_NETXEN_NIC=m
|
CONFIG_NETXEN_NIC=m
|
||||||
|
|
||||||
@ -1526,6 +1534,7 @@ CONFIG_ATH6KL=m
|
|||||||
CONFIG_ATH6KL_DEBUG=y
|
CONFIG_ATH6KL_DEBUG=y
|
||||||
CONFIG_ATH6KL_SDIO=m
|
CONFIG_ATH6KL_SDIO=m
|
||||||
CONFIG_ATH6KL_USB=m
|
CONFIG_ATH6KL_USB=m
|
||||||
|
# CONFIG_ATH6KL_TRACING is not set
|
||||||
CONFIG_AR5523=m
|
CONFIG_AR5523=m
|
||||||
CONFIG_ATH9K=m
|
CONFIG_ATH9K=m
|
||||||
CONFIG_ATH9K_PCI=y
|
CONFIG_ATH9K_PCI=y
|
||||||
@ -1630,6 +1639,7 @@ CONFIG_RT2800USB=m
|
|||||||
CONFIG_RT2800USB_RT33XX=y
|
CONFIG_RT2800USB_RT33XX=y
|
||||||
CONFIG_RT2800USB_RT35XX=y
|
CONFIG_RT2800USB_RT35XX=y
|
||||||
CONFIG_RT2800USB_RT53XX=y
|
CONFIG_RT2800USB_RT53XX=y
|
||||||
|
CONFIG_RT2800USB_RT55XX=y
|
||||||
CONFIG_RT2800USB_UNKNOWN=y
|
CONFIG_RT2800USB_UNKNOWN=y
|
||||||
CONFIG_RT2800PCI=m
|
CONFIG_RT2800PCI=m
|
||||||
CONFIG_RT2800PCI_RT3290=y
|
CONFIG_RT2800PCI_RT3290=y
|
||||||
@ -1666,6 +1676,7 @@ CONFIG_RTL8192SE=m
|
|||||||
CONFIG_RTL8192CU=m
|
CONFIG_RTL8192CU=m
|
||||||
CONFIG_RTL8192DE=m
|
CONFIG_RTL8192DE=m
|
||||||
CONFIG_RTL8723AE=m
|
CONFIG_RTL8723AE=m
|
||||||
|
CONFIG_RTL8188EE=m
|
||||||
|
|
||||||
CONFIG_MWIFIEX=m
|
CONFIG_MWIFIEX=m
|
||||||
CONFIG_MWIFIEX_SDIO=m
|
CONFIG_MWIFIEX_SDIO=m
|
||||||
@ -1961,6 +1972,7 @@ CONFIG_INPUT_POLLDEV=m
|
|||||||
CONFIG_INPUT_SPARSEKMAP=m
|
CONFIG_INPUT_SPARSEKMAP=m
|
||||||
# CONFIG_INPUT_ADXL34X is not set
|
# CONFIG_INPUT_ADXL34X is not set
|
||||||
# CONFIG_INPUT_BMA150 is not set
|
# CONFIG_INPUT_BMA150 is not set
|
||||||
|
# CONFIG_INPUT_IMS_PCU is not set
|
||||||
CONFIG_INPUT_CMA3000=m
|
CONFIG_INPUT_CMA3000=m
|
||||||
CONFIG_INPUT_CMA3000_I2C=m
|
CONFIG_INPUT_CMA3000_I2C=m
|
||||||
|
|
||||||
@ -1979,6 +1991,7 @@ CONFIG_SERIO_RAW=m
|
|||||||
CONFIG_SERIO_ALTERA_PS2=m
|
CONFIG_SERIO_ALTERA_PS2=m
|
||||||
# CONFIG_SERIO_PS2MULT is not set
|
# CONFIG_SERIO_PS2MULT is not set
|
||||||
CONFIG_SERIO_ARC_PS2=m
|
CONFIG_SERIO_ARC_PS2=m
|
||||||
|
# CONFIG_SERIO_APBPS2 is not set
|
||||||
|
|
||||||
# CONFIG_SERIO_CT82C710 is not set
|
# CONFIG_SERIO_CT82C710 is not set
|
||||||
# CONFIG_SERIO_PARKBD is not set
|
# CONFIG_SERIO_PARKBD is not set
|
||||||
|
@ -37,6 +37,7 @@ CONFIG_X86_PM_TIMER=y
|
|||||||
CONFIG_EFI=y
|
CONFIG_EFI=y
|
||||||
CONFIG_EFI_STUB=y
|
CONFIG_EFI_STUB=y
|
||||||
CONFIG_EFI_VARS=y
|
CONFIG_EFI_VARS=y
|
||||||
|
CONFIG_EFIVAR_FS=y
|
||||||
CONFIG_EFI_VARS_PSTORE=y
|
CONFIG_EFI_VARS_PSTORE=y
|
||||||
CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y
|
CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y
|
||||||
CONFIG_EFI_PCDP=y
|
CONFIG_EFI_PCDP=y
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,132 +0,0 @@
|
|||||||
This backtrace was recently reported on a 3.9 kernel:
|
|
||||||
|
|
||||||
Actual results: from syslog /var/log/messsages:
|
|
||||||
kernel: [17539.340285] ------------[ cut here ]------------
|
|
||||||
kernel: [17539.341012] WARNING: at lib/dma-debug.c:937 check_unmap+0x493/0x960()
|
|
||||||
kernel: [17539.341012] Hardware name: MS-7125
|
|
||||||
kernel: [17539.341012] forcedeth 0000:00:0a.0: DMA-API: device driver failed to
|
|
||||||
check map error[device address=0x0000000013c88000] [size=544 bytes] [mapped as
|
|
||||||
page]
|
|
||||||
kernel: [17539.341012] Modules linked in: fuse ebtable_nat ipt_MASQUERADE
|
|
||||||
nf_conntrack_netbios_ns nf_conntrack_broadcast ip6table_nat nf_nat_ipv6
|
|
||||||
ip6table_mangle ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 iptable_nat
|
|
||||||
nf_nat_ipv4 nf_nat iptable_mangle nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack
|
|
||||||
nf_conntrack bnep bluetooth rfkill ebtable_filter ebtables ip6table_filter
|
|
||||||
ip6_tables snd_hda_codec_hdmi snd_cmipci snd_mpu401_uart snd_hda_intel
|
|
||||||
snd_intel8x0 snd_opl3_lib snd_ac97_codec gameport snd_hda_codec snd_rawmidi
|
|
||||||
ac97_bus snd_hwdep snd_seq snd_seq_device snd_pcm snd_page_alloc snd_timer snd
|
|
||||||
k8temp soundcore serio_raw i2c_nforce2 forcedeth ata_generic pata_acpi nouveau
|
|
||||||
video mxm_wmi wmi i2c_algo_bit drm_kms_helper ttm drm i2c_core sata_sil pata_amd
|
|
||||||
sata_nv uinput
|
|
||||||
kernel: [17539.341012] Pid: 17340, comm: sshd Not tainted
|
|
||||||
3.9.0-0.rc4.git0.1.fc19.i686.PAE #1
|
|
||||||
kernel: [17539.341012] Call Trace:
|
|
||||||
kernel: [17539.341012] [<c045573c>] warn_slowpath_common+0x6c/0xa0
|
|
||||||
kernel: [17539.341012] [<c0701953>] ? check_unmap+0x493/0x960
|
|
||||||
kernel: [17539.341012] [<c0701953>] ? check_unmap+0x493/0x960
|
|
||||||
kernel: [17539.341012] [<c04557a3>] warn_slowpath_fmt+0x33/0x40
|
|
||||||
kernel: [17539.341012] [<c0701953>] check_unmap+0x493/0x960
|
|
||||||
kernel: [17539.341012] [<c049238f>] ? sched_clock_cpu+0xdf/0x150
|
|
||||||
kernel: [17539.341012] [<c0701e87>] debug_dma_unmap_page+0x67/0x70
|
|
||||||
kernel: [17539.341012] [<f7eae8f2>] nv_unmap_txskb.isra.32+0x92/0x100
|
|
||||||
|
|
||||||
Its pretty plainly the result of an skb fragment getting unmapped without having
|
|
||||||
its initial mapping operation checked for errors. This patch corrects that.
|
|
||||||
|
|
||||||
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
CC: "David S. Miller" <davem@davemloft.net>
|
|
||||||
---
|
|
||||||
drivers/net/ethernet/nvidia/forcedeth.c | 41 ++++++++++++++++++++++++++++++++-
|
|
||||||
1 file changed, 40 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/net/ethernet/nvidia/forcedeth.c b/drivers/net/ethernet/nvidia/forcedeth.c
|
|
||||||
index b62262c..5ae1247 100644
|
|
||||||
--- a/drivers/net/ethernet/nvidia/forcedeth.c
|
|
||||||
+++ b/drivers/net/ethernet/nvidia/forcedeth.c
|
|
||||||
@@ -2200,6 +2200,7 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
||||||
struct ring_desc *start_tx;
|
|
||||||
struct ring_desc *prev_tx;
|
|
||||||
struct nv_skb_map *prev_tx_ctx;
|
|
||||||
+ struct nv_skb_map *tmp_tx_ctx = NULL, *start_tx_ctx = NULL;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* add fragments to entries count */
|
|
||||||
@@ -2261,12 +2262,31 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
||||||
do {
|
|
||||||
prev_tx = put_tx;
|
|
||||||
prev_tx_ctx = np->put_tx_ctx;
|
|
||||||
+ if (!start_tx_ctx)
|
|
||||||
+ start_tx_ctx = tmp_tx_ctx = np->put_tx_ctx;
|
|
||||||
+
|
|
||||||
bcnt = (frag_size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : frag_size;
|
|
||||||
np->put_tx_ctx->dma = skb_frag_dma_map(
|
|
||||||
&np->pci_dev->dev,
|
|
||||||
frag, offset,
|
|
||||||
bcnt,
|
|
||||||
DMA_TO_DEVICE);
|
|
||||||
+ if (dma_mapping_error(&np->pci_dev->dev, np->put_tx_ctx->dma)) {
|
|
||||||
+
|
|
||||||
+ /* Unwind the mapped fragments */
|
|
||||||
+ do {
|
|
||||||
+ nv_unmap_txskb(np, start_tx_ctx);
|
|
||||||
+ if (unlikely(tmp_tx_ctx++ == np->last_tx_ctx))
|
|
||||||
+ tmp_tx_ctx = np->first_tx_ctx;
|
|
||||||
+ } while (tmp_tx_ctx != np->put_tx_ctx);
|
|
||||||
+ kfree_skb(skb);
|
|
||||||
+ np->put_tx_ctx = start_tx_ctx;
|
|
||||||
+ u64_stats_update_begin(&np->swstats_tx_syncp);
|
|
||||||
+ np->stat_tx_dropped++;
|
|
||||||
+ u64_stats_update_end(&np->swstats_tx_syncp);
|
|
||||||
+ return NETDEV_TX_OK;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
np->put_tx_ctx->dma_len = bcnt;
|
|
||||||
np->put_tx_ctx->dma_single = 0;
|
|
||||||
put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma);
|
|
||||||
@@ -2327,7 +2347,8 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
|
|
||||||
struct ring_desc_ex *start_tx;
|
|
||||||
struct ring_desc_ex *prev_tx;
|
|
||||||
struct nv_skb_map *prev_tx_ctx;
|
|
||||||
- struct nv_skb_map *start_tx_ctx;
|
|
||||||
+ struct nv_skb_map *start_tx_ctx = NULL;
|
|
||||||
+ struct nv_skb_map *tmp_tx_ctx = NULL;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* add fragments to entries count */
|
|
||||||
@@ -2392,11 +2413,29 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
|
|
||||||
prev_tx = put_tx;
|
|
||||||
prev_tx_ctx = np->put_tx_ctx;
|
|
||||||
bcnt = (frag_size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : frag_size;
|
|
||||||
+ if (!start_tx_ctx)
|
|
||||||
+ start_tx_ctx = tmp_tx_ctx = np->put_tx_ctx;
|
|
||||||
np->put_tx_ctx->dma = skb_frag_dma_map(
|
|
||||||
&np->pci_dev->dev,
|
|
||||||
frag, offset,
|
|
||||||
bcnt,
|
|
||||||
DMA_TO_DEVICE);
|
|
||||||
+
|
|
||||||
+ if (dma_mapping_error(&np->pci_dev->dev, np->put_tx_ctx->dma)) {
|
|
||||||
+
|
|
||||||
+ /* Unwind the mapped fragments */
|
|
||||||
+ do {
|
|
||||||
+ nv_unmap_txskb(np, start_tx_ctx);
|
|
||||||
+ if (unlikely(tmp_tx_ctx++ == np->last_tx_ctx))
|
|
||||||
+ tmp_tx_ctx = np->first_tx_ctx;
|
|
||||||
+ } while (tmp_tx_ctx != np->put_tx_ctx);
|
|
||||||
+ kfree_skb(skb);
|
|
||||||
+ np->put_tx_ctx = start_tx_ctx;
|
|
||||||
+ u64_stats_update_begin(&np->swstats_tx_syncp);
|
|
||||||
+ np->stat_tx_dropped++;
|
|
||||||
+ u64_stats_update_end(&np->swstats_tx_syncp);
|
|
||||||
+ return NETDEV_TX_OK;
|
|
||||||
+ }
|
|
||||||
np->put_tx_ctx->dma_len = bcnt;
|
|
||||||
np->put_tx_ctx->dma_single = 0;
|
|
||||||
put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma));
|
|
||||||
--
|
|
||||||
1.7.11.7
|
|
||||||
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe netdev" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
@ -1,51 +0,0 @@
|
|||||||
If on iwl_dump_nic_event_log() error occurs before that function
|
|
||||||
initialize buf, we process uninitiated pointer in
|
|
||||||
iwl_dbgfs_log_event_read() and can hit "BUG at mm/slub.c:3409"
|
|
||||||
|
|
||||||
Resolves:
|
|
||||||
https://bugzilla.redhat.com/show_bug.cgi?id=951241
|
|
||||||
|
|
||||||
Reported-by: ian.odette@eprize.com
|
|
||||||
Cc: stable@vger.kernel.org
|
|
||||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
||||||
---
|
|
||||||
Patch is only compile tested, but I'm sure it fixes the problem.
|
|
||||||
|
|
||||||
drivers/net/wireless/iwlwifi/dvm/debugfs.c | 16 ++++++++--------
|
|
||||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c
|
|
||||||
index 7b8178b..cb6dd58 100644
|
|
||||||
--- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c
|
|
||||||
+++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c
|
|
||||||
@@ -2237,15 +2237,15 @@ static ssize_t iwl_dbgfs_log_event_read(struct file *file,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct iwl_priv *priv = file->private_data;
|
|
||||||
- char *buf;
|
|
||||||
- int pos = 0;
|
|
||||||
- ssize_t ret = -ENOMEM;
|
|
||||||
+ char *buf = NULL;
|
|
||||||
+ ssize_t ret;
|
|
||||||
|
|
||||||
- ret = pos = iwl_dump_nic_event_log(priv, true, &buf, true);
|
|
||||||
- if (buf) {
|
|
||||||
- ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
|
||||||
- kfree(buf);
|
|
||||||
- }
|
|
||||||
+ ret = iwl_dump_nic_event_log(priv, true, &buf, true);
|
|
||||||
+ if (ret < 0)
|
|
||||||
+ goto err;
|
|
||||||
+ ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
|
|
||||||
+err:
|
|
||||||
+ kfree(buf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
1.7.11.7
|
|
||||||
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
31
kernel.spec
31
kernel.spec
@ -95,7 +95,7 @@ Summary: The Linux kernel
|
|||||||
# The rc snapshot level
|
# The rc snapshot level
|
||||||
%define rcrev 0
|
%define rcrev 0
|
||||||
# The git snapshot level
|
# The git snapshot level
|
||||||
%define gitrev 10
|
%define gitrev 11
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
%define rpmversion 3.%{upstream_sublevel}.0
|
%define rpmversion 3.%{upstream_sublevel}.0
|
||||||
%endif
|
%endif
|
||||||
@ -728,10 +728,6 @@ Patch21247: ath9k_rx_dma_stop_check.patch
|
|||||||
#rhbz 903192
|
#rhbz 903192
|
||||||
Patch21261: 0001-kmsg-Honor-dmesg_restrict-sysctl-on-dev-kmsg.patch
|
Patch21261: 0001-kmsg-Honor-dmesg_restrict-sysctl-on-dev-kmsg.patch
|
||||||
|
|
||||||
#rhbz 856863 892599
|
|
||||||
Patch21273: cfg80211-mac80211-disconnect-on-suspend.patch
|
|
||||||
Patch21274: mac80211_fixes_for_ieee80211_do_stop_while_suspend_v3.9.patch
|
|
||||||
|
|
||||||
#rhbz 859282
|
#rhbz 859282
|
||||||
Patch21275: VMX-x86-handle-host-TSC-calibration-failure.patch
|
Patch21275: VMX-x86-handle-host-TSC-calibration-failure.patch
|
||||||
|
|
||||||
@ -743,15 +739,6 @@ Patch22001: selinux-apply-different-permission-to-ptrace-child.patch
|
|||||||
#rhbz 927469
|
#rhbz 927469
|
||||||
Patch23006: fix-child-thread-introspection.patch
|
Patch23006: fix-child-thread-introspection.patch
|
||||||
|
|
||||||
#rhbz 928024
|
|
||||||
Patch23008: forcedeth-dma-error-check.patch
|
|
||||||
|
|
||||||
#rhbz 919176
|
|
||||||
Patch25010: wireless-regulatory-fix-channel-disabling-race-condition.patch
|
|
||||||
|
|
||||||
#rhbz 951241
|
|
||||||
Patch25011: iwlwifi-fix-freeing-uninitialized-pointer.patch
|
|
||||||
|
|
||||||
Patch25014: blkcg-fix-scheduling-while-atomic-in-blk_queue_bypass_start.patch
|
Patch25014: blkcg-fix-scheduling-while-atomic-in-blk_queue_bypass_start.patch
|
||||||
|
|
||||||
# END OF PATCH DEFINITIONS
|
# END OF PATCH DEFINITIONS
|
||||||
@ -1436,25 +1423,12 @@ ApplyPatch ath9k_rx_dma_stop_check.patch
|
|||||||
#rhbz 903192
|
#rhbz 903192
|
||||||
ApplyPatch 0001-kmsg-Honor-dmesg_restrict-sysctl-on-dev-kmsg.patch
|
ApplyPatch 0001-kmsg-Honor-dmesg_restrict-sysctl-on-dev-kmsg.patch
|
||||||
|
|
||||||
#rhbz 856863 892599
|
|
||||||
ApplyPatch cfg80211-mac80211-disconnect-on-suspend.patch
|
|
||||||
ApplyPatch mac80211_fixes_for_ieee80211_do_stop_while_suspend_v3.9.patch
|
|
||||||
|
|
||||||
#rhbz 859282
|
#rhbz 859282
|
||||||
ApplyPatch VMX-x86-handle-host-TSC-calibration-failure.patch
|
ApplyPatch VMX-x86-handle-host-TSC-calibration-failure.patch
|
||||||
|
|
||||||
#rhbz 927469
|
#rhbz 927469
|
||||||
ApplyPatch fix-child-thread-introspection.patch
|
ApplyPatch fix-child-thread-introspection.patch
|
||||||
|
|
||||||
#rhbz 928024
|
|
||||||
ApplyPatch forcedeth-dma-error-check.patch
|
|
||||||
|
|
||||||
#rhbz 919176
|
|
||||||
ApplyPatch wireless-regulatory-fix-channel-disabling-race-condition.patch
|
|
||||||
|
|
||||||
#rhbz 951241
|
|
||||||
ApplyPatch iwlwifi-fix-freeing-uninitialized-pointer.patch
|
|
||||||
|
|
||||||
ApplyPatch blkcg-fix-scheduling-while-atomic-in-blk_queue_bypass_start.patch
|
ApplyPatch blkcg-fix-scheduling-while-atomic-in-blk_queue_bypass_start.patch
|
||||||
|
|
||||||
# END OF PATCH APPLICATIONS
|
# END OF PATCH APPLICATIONS
|
||||||
@ -2290,6 +2264,9 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu May 02 2013 Josh Boyer <jwboyer@redhat.com> - 3.10.0-0.rc0.git11.1
|
||||||
|
- Linux v3.9-7391-g20b4fb4
|
||||||
|
|
||||||
* Wed May 01 2013 Josh Boyer <jwboyer@redhat.com> - 3.10.0-0.rc0.git10.1
|
* Wed May 01 2013 Josh Boyer <jwboyer@redhat.com> - 3.10.0-0.rc0.git10.1
|
||||||
- Linux v3.9-5308-g8a72f38
|
- Linux v3.9-5308-g8a72f38
|
||||||
|
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
|
|
||||||
index baaa860..7a3d675 100644
|
|
||||||
--- a/net/mac80211/iface.c
|
|
||||||
+++ b/net/mac80211/iface.c
|
|
||||||
@@ -748,8 +748,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
||||||
sdata->dev->addr_len);
|
|
||||||
spin_unlock_bh(&local->filter_lock);
|
|
||||||
netif_addr_unlock_bh(sdata->dev);
|
|
||||||
-
|
|
||||||
- ieee80211_configure_filter(local);
|
|
||||||
+ /* configure filter latter (if not suspended) */
|
|
||||||
}
|
|
||||||
|
|
||||||
del_timer_sync(&local->dynamic_ps_timer);
|
|
||||||
@@ -814,10 +813,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
||||||
}
|
|
||||||
|
|
||||||
ieee80211_adjust_monitor_flags(sdata, -1);
|
|
||||||
- ieee80211_configure_filter(local);
|
|
||||||
- mutex_lock(&local->mtx);
|
|
||||||
- ieee80211_recalc_idle(local);
|
|
||||||
- mutex_unlock(&local->mtx);
|
|
||||||
+ /* tell driver latter (if not suspended) */
|
|
||||||
break;
|
|
||||||
case NL80211_IFTYPE_P2P_DEVICE:
|
|
||||||
/* relies on synchronize_rcu() below */
|
|
||||||
@@ -848,28 +844,31 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
||||||
|
|
||||||
drv_remove_interface_debugfs(local, sdata);
|
|
||||||
|
|
||||||
- if (going_down)
|
|
||||||
+ if (going_down && !local->suspended)
|
|
||||||
drv_remove_interface(local, sdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
sdata->bss = NULL;
|
|
||||||
|
|
||||||
- ieee80211_recalc_ps(local, -1);
|
|
||||||
-
|
|
||||||
- if (local->open_count == 0) {
|
|
||||||
- if (local->ops->napi_poll)
|
|
||||||
- napi_disable(&local->napi);
|
|
||||||
- ieee80211_clear_tx_pending(local);
|
|
||||||
- ieee80211_stop_device(local);
|
|
||||||
-
|
|
||||||
- /* no reconfiguring after stop! */
|
|
||||||
- hw_reconf_flags = 0;
|
|
||||||
+ if (!local->suspended) {
|
|
||||||
+ if (local->open_count == 0) {
|
|
||||||
+ if (local->ops->napi_poll)
|
|
||||||
+ napi_disable(&local->napi);
|
|
||||||
+ ieee80211_clear_tx_pending(local);
|
|
||||||
+ ieee80211_stop_device(local);
|
|
||||||
+ } else {
|
|
||||||
+ ieee80211_configure_filter(local);
|
|
||||||
+ ieee80211_recalc_ps(local, -1);
|
|
||||||
+
|
|
||||||
+ mutex_lock(&local->mtx);
|
|
||||||
+ ieee80211_recalc_idle(local);
|
|
||||||
+ mutex_unlock(&local->mtx);
|
|
||||||
+
|
|
||||||
+ if (hw_reconf_flags)
|
|
||||||
+ ieee80211_hw_config(local, hw_reconf_flags);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* do after stop to avoid reconfiguring when we stop anyway */
|
|
||||||
- if (hw_reconf_flags)
|
|
||||||
- ieee80211_hw_config(local, hw_reconf_flags);
|
|
||||||
-
|
|
||||||
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
||||||
for (i = 0; i < IEEE80211_MAX_QUEUES; i++) {
|
|
||||||
skb_queue_walk_safe(&local->pending[i], skb, tmp) {
|
|
2
sources
2
sources
@ -1,2 +1,2 @@
|
|||||||
4348c9b6b2eb3144d601e87c19d5d909 linux-3.9.tar.xz
|
4348c9b6b2eb3144d601e87c19d5d909 linux-3.9.tar.xz
|
||||||
1a396dd43ce26c6d811b5b474626be9a patch-3.9-git10.xz
|
a79517eb8c6db4d0080bff9f4140ba8d patch-3.9-git11.xz
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
From: Johannes Berg <johannes.berg@intel.com>
|
|
||||||
|
|
||||||
When a full scan 2.4 and 5 GHz scan is scheduled, but then the 2.4 GHz
|
|
||||||
part of the scan disables a 5.2 GHz channel due to, e.g. receiving
|
|
||||||
country or frequency information, that 5.2 GHz channel might already
|
|
||||||
be in the list of channels to scan next. Then, when the driver checks
|
|
||||||
if it should do a passive scan, that will return false and attempt an
|
|
||||||
active scan. This is not only wrong but can also lead to the iwlwifi
|
|
||||||
device firmware crashing since it checks regulatory as well.
|
|
||||||
|
|
||||||
Fix this by not setting the channel flags to just disabled but rather
|
|
||||||
OR'ing in the disabled flag. That way, even if the race happens, the
|
|
||||||
channel will be scanned passively which is still (mostly) correct.
|
|
||||||
|
|
||||||
Cc: stable@vger.kernel.org
|
|
||||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
||||||
---
|
|
||||||
net/wireless/reg.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
|
|
||||||
index 93ab840..507c28e 100644
|
|
||||||
--- a/net/wireless/reg.c
|
|
||||||
+++ b/net/wireless/reg.c
|
|
||||||
@@ -855,7 +855,7 @@ static void handle_channel(struct wiphy *wiphy,
|
|
||||||
return;
|
|
||||||
|
|
||||||
REG_DBG_PRINT("Disabling freq %d MHz\n", chan->center_freq);
|
|
||||||
- chan->flags = IEEE80211_CHAN_DISABLED;
|
|
||||||
+ chan->flags |= IEEE80211_CHAN_DISABLED;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
1.8.0
|
|
||||||
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
Loading…
Reference in New Issue
Block a user