[kernel/f18] Add missing 3.11 patches from F19

Justin M. Forbes jforbes at fedoraproject.org
Tue Oct 8 14:28:36 UTC 2013


commit 20a0130a427715bcccba0b1e7f2fa7d2b786b9d0
Author: Justin M. Forbes <jforbes at redhat.com>
Date:   Tue Oct 8 09:28:27 2013 -0500

    Add missing 3.11 patches from F19

 ...-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch |   59 ++++++++++++++
 bonding-driver-promisc.patch                       |   73 ++++++++++++++++++
 kernel.spec                                        |   35 +++++++++
 nowatchdog-on-virt.patch                           |   67 ++++++++++++++++
 ntp-Make-periodic-RTC-update-more-reliable.patch   |   44 +++++++++++
 rt2800-add-support-for-rf3070.patch                |   80 ++++++++++++++++++++
 ...x-invalid-value-passed-to-pci_unmap_sigle.patch |   61 +++++++++++++++
 7 files changed, 419 insertions(+), 0 deletions(-)
---
diff --git a/Revert-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch b/Revert-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch
new file mode 100644
index 0000000..4e48620
--- /dev/null
+++ b/Revert-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch
@@ -0,0 +1,59 @@
+This reverts commit 9483f40d8d01918b399b4e24d0c1111db0afffeb.
+
+Some devices stop to connect with above commit, see:
+https://bugzilla.kernel.org/show_bug.cgi?id=61621
+
+Since there is no clear benefit of having MSI enabled, just revert
+change to fix the problem.
+
+Cc: stable at vger.kernel.org # 3.11+
+Signed-off-by: Stanislaw Gruszka <sgruszka at redhat.com>
+---
+ drivers/net/wireless/rt2x00/rt2x00pci.c | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c
+index 76d95de..dc49e52 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
++++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
+@@ -105,13 +105,11 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
+ 		goto exit_release_regions;
+ 	}
+ 
+-	pci_enable_msi(pci_dev);
+-
+ 	hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);
+ 	if (!hw) {
+ 		rt2x00_probe_err("Failed to allocate hardware\n");
+ 		retval = -ENOMEM;
+-		goto exit_disable_msi;
++		goto exit_release_regions;
+ 	}
+ 
+ 	pci_set_drvdata(pci_dev, hw);
+@@ -152,9 +150,6 @@ exit_free_reg:
+ exit_free_device:
+ 	ieee80211_free_hw(hw);
+ 
+-exit_disable_msi:
+-	pci_disable_msi(pci_dev);
+-
+ exit_release_regions:
+ 	pci_release_regions(pci_dev);
+ 
+@@ -179,8 +174,6 @@ void rt2x00pci_remove(struct pci_dev *pci_dev)
+ 	rt2x00pci_free_reg(rt2x00dev);
+ 	ieee80211_free_hw(hw);
+ 
+-	pci_disable_msi(pci_dev);
+-
+ 	/*
+ 	 * Free the PCI device data.
+ 	 */
+-- 
+1.8.3.1
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
+the body of a message to majordomo at vger.kernel.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
\ No newline at end of file
diff --git a/bonding-driver-promisc.patch b/bonding-driver-promisc.patch
new file mode 100644
index 0000000..38315c9
--- /dev/null
+++ b/bonding-driver-promisc.patch
@@ -0,0 +1,73 @@
+commit 5a0068deb611109c5ba77358be533f763f395ee4
+Author: Neil Horman <nhorman at tuxdriver.com>
+Date:   Fri Sep 27 12:22:15 2013 -0400
+
+    bonding: Fix broken promiscuity reference counting issue
+    
+    Recently grabbed this report:
+    https://bugzilla.redhat.com/show_bug.cgi?id=1005567
+    
+    Of an issue in which the bonding driver, with an attached vlan encountered the
+    following errors when bond0 was taken down and back up:
+    
+    dummy1: promiscuity touches roof, set promiscuity failed. promiscuity feature of
+    device might be broken.
+    
+    The error occurs because, during __bond_release_one, if we release our last
+    slave, we take on a random mac address and issue a NETDEV_CHANGEADDR
+    notification.  With an attached vlan, the vlan may see that the vlan and bond
+    mac address were in sync, but no longer are.  This triggers a call to dev_uc_add
+    and dev_set_rx_mode, which enables IFF_PROMISC on the bond device.  Then, when
+    we complete __bond_release_one, we use the current state of the bond flags to
+    determine if we should decrement the promiscuity of the releasing slave.  But
+    since the bond changed promiscuity state during the release operation, we
+    incorrectly decrement the slave promisc count when it wasn't in promiscuous mode
+    to begin with, causing the above error
+    
+    Fix is pretty simple, just cache the bonding flags at the start of the function
+    and use those when determining the need to set promiscuity.
+    
+    This is also needed for the ALLMULTI flag
+    
+    CC: Jay Vosburgh <fubar at us.ibm.com>
+    CC: Andy Gospodarek <andy at greyhouse.net>
+    CC: Mark Wu <wudxw at linux.vnet.ibm.com>
+    CC: "David S. Miller" <davem at davemloft.net>
+    Reported-by: Mark Wu <wudxw at linux.vnet.ibm.com>
+    
+    Signed-off-by: David S. Miller <davem at davemloft.net>
+
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index 55bbb8b..e883bfe 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -1724,6 +1724,7 @@ static int __bond_release_one(struct net_device *bond_dev,
+ 	struct bonding *bond = netdev_priv(bond_dev);
+ 	struct slave *slave, *oldcurrent;
+ 	struct sockaddr addr;
++	int old_flags = bond_dev->flags;
+ 	netdev_features_t old_features = bond_dev->features;
+ 
+ 	/* slave is not a slave or master is not master of this slave */
+@@ -1855,12 +1856,18 @@ static int __bond_release_one(struct net_device *bond_dev,
+ 	 * bond_change_active_slave(..., NULL)
+ 	 */
+ 	if (!USES_PRIMARY(bond->params.mode)) {
+-		/* unset promiscuity level from slave */
+-		if (bond_dev->flags & IFF_PROMISC)
++		/* unset promiscuity level from slave
++		 * NOTE: The NETDEV_CHANGEADDR call above may change the value
++		 * of the IFF_PROMISC flag in the bond_dev, but we need the
++		 * value of that flag before that change, as that was the value
++		 * when this slave was attached, so we cache at the start of the
++		 * function and use it here. Same goes for ALLMULTI below
++		 */
++		if (old_flags & IFF_PROMISC)
+ 			dev_set_promiscuity(slave_dev, -1);
+ 
+ 		/* unset allmulti level from slave */
+-		if (bond_dev->flags & IFF_ALLMULTI)
++		if (old_flags & IFF_ALLMULTI)
+ 			dev_set_allmulti(slave_dev, -1);
+ 
+ 		bond_hw_addr_flush(bond_dev, slave_dev);
diff --git a/kernel.spec b/kernel.spec
index 10da034..4bc5fd3 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -698,6 +698,7 @@ Patch14000: hibernate-freeze-filesystems.patch
 
 Patch14010: lis3-improve-handling-of-null-rate.patch
 
+Patch15000: nowatchdog-on-virt.patch
 
 Patch20000: 0001-efifb-Skip-DMI-checks-if-the-bootloader-knows-what-i.patch
 Patch20001: 0002-x86-EFI-Calculate-the-EFI-framebuffer-size-instead-o.patch
@@ -747,10 +748,25 @@ Patch25104: ansi_cprng-Fix-off-by-one-error-in-non-block-size-request.patch
 #rhbz 971893
 Patch25106: bonding-driver-alb-learning.patch
 
+#rhbz 985522
+Patch25107: ntp-Make-periodic-RTC-update-more-reliable.patch
+
+#rhbz 1010431
+Patch25108: Revert-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch
+
+#rhbz 1008323
+Patch25120: skge-fix-invalid-value-passed-to-pci_unmap_sigle.patch
+
 #rhbz 902012
 Patch25114: elevator-Fix-a-race-in-elevator-switching-and-md.patch
 Patch25115: elevator-acquire-q-sysfs_lock-in-elevator_change.patch
 
+#rhbz 974072
+Patch25117: rt2800-add-support-for-rf3070.patch
+
+#rhbz 1005567
+Patch25118: bonding-driver-promisc.patch
+
 #CVE-2013-4387 rhbz 1011927 1015166
 Patch25121: ipv6-udp-packets-following-an-UFO-enqueued-packet-ne.patch
 
@@ -1406,6 +1422,9 @@ ApplyPatch disable-i8042-check-on-apple-mac.patch
 
 ApplyPatch lis3-improve-handling-of-null-rate.patch
 
+# Disable watchdog on virtual machines.
+ApplyPatch nowatchdog-on-virt.patch
+
 #ApplyPatch 0001-efifb-Skip-DMI-checks-if-the-bootloader-knows-what-i.patch
 #ApplyPatch 0002-x86-EFI-Calculate-the-EFI-framebuffer-size-instead-o.patch
 
@@ -1439,13 +1458,28 @@ ApplyPatch net-sctp-fix-ipv6-ipsec-encryption-bug-in-sctp_v6_xmit.patch
 #CVE-2013-4345 rhbz 1007690 1009136
 ApplyPatch ansi_cprng-Fix-off-by-one-error-in-non-block-size-request.patch
 
+#rhbz 985522
+ApplyPatch ntp-Make-periodic-RTC-update-more-reliable.patch
+
+#rhbz 1010431
+ApplyPatch Revert-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch
+
 #rhbz 971893
 ApplyPatch bonding-driver-alb-learning.patch
 
+#rhbz 1008323
+ApplyPatch skge-fix-invalid-value-passed-to-pci_unmap_sigle.patch
+
 #rhbz 902012
 ApplyPatch elevator-Fix-a-race-in-elevator-switching-and-md.patch
 ApplyPatch elevator-acquire-q-sysfs_lock-in-elevator_change.patch
 
+#rhbz 974072
+ApplyPatch rt2800-add-support-for-rf3070.patch
+
+#rhbz 1005567
+ApplyPatch bonding-driver-promisc.patch
+
 #CVE-2013-4387 rhbz 1011927 1015166
 ApplyPatch ipv6-udp-packets-following-an-UFO-enqueued-packet-ne.patch
 
@@ -2298,6 +2332,7 @@ fi
 %changelog
 * Tue Oct 08 2013 Justin M. Forbes <jforbes at fedoraproject.org>
 - Linux v3.11.4
+- Add missing 3.11 patches from F19
 
 * Tue Oct 08 2013 Josh Boyer <jwboyer at fedoraproject.org>
 - Quiet irq remapping stack trace (rhbz 982153)
diff --git a/nowatchdog-on-virt.patch b/nowatchdog-on-virt.patch
new file mode 100644
index 0000000..87ab11a
--- /dev/null
+++ b/nowatchdog-on-virt.patch
@@ -0,0 +1,67 @@
+Disable watchdog on virtual machines.
+
+For various reasons, VMs seem to trigger the soft lockup detector a lot,
+in cases where it's just not possible for a lockup to occur.
+(Example: https://bugzilla.redhat.com/show_bug.cgi?id=971139)
+
+In some cases it seems that the host just never scheduled the app running
+the VM for a very long time (Could be the host was under heavy load).
+
+Just disable the detector on VMs.
+
+Signed-off-by: Dave Jones <davej at redhat.com>
+
+diff --git a/kernel/watchdog.c b/kernel/watchdog.c
+index 1241d8c..b2dc4e4 100644
+--- a/kernel/watchdog.c
++++ b/kernel/watchdog.c
+@@ -24,6 +24,7 @@
+ #include <linux/sysctl.h>
+ #include <linux/smpboot.h>
+ #include <linux/sched/rt.h>
++#include <linux/dmi.h>
+ 
+ #include <asm/irq_regs.h>
+ #include <linux/kvm_para.h>
+@@ -96,6 +97,32 @@ static int __init nosoftlockup_setup(char *str)
+ __setup("nosoftlockup", nosoftlockup_setup);
+ /*  */
+ 
++static int disable_watchdog(const struct dmi_system_id *d)
++{
++	printk(KERN_INFO "watchdog: disabled (inside virtual machine)\n");
++	watchdog_user_enabled = 0;
++	return 0;
++}
++
++static const struct dmi_system_id watchdog_virt_dmi_table[] = {
++	{
++		.callback = disable_watchdog,
++		.ident = "VMware",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "VMware, Inc."),
++		},
++	},
++	{
++		.callback = disable_watchdog,
++		.ident = "Bochs",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "Bochs Bochs"),
++		},
++	},
++	{}
++};
++
++
+ /*
+  * Hard-lockup warnings should be triggered after just a few seconds. Soft-
+  * lockups can have false positives under extreme conditions. So we generally
+@@ -551,6 +578,8 @@ int proc_dowatchdog(struct ctl_table *table, int write,
+ 
+ void __init lockup_detector_init(void)
+ {
++	dmi_check_system(watchdog_virt_dmi_table);
++
+ 	set_sample_period();
+ 
+ #ifdef CONFIG_NO_HZ_FULL
diff --git a/ntp-Make-periodic-RTC-update-more-reliable.patch b/ntp-Make-periodic-RTC-update-more-reliable.patch
new file mode 100644
index 0000000..59179e7
--- /dev/null
+++ b/ntp-Make-periodic-RTC-update-more-reliable.patch
@@ -0,0 +1,44 @@
+From a97ad0c4b447a132a322cedc3a5f7fa4cab4b304 Mon Sep 17 00:00:00 2001
+From: Miroslav Lichvar <mlichvar at redhat.com>
+Date: Thu, 1 Aug 2013 19:31:35 +0200
+Subject: [PATCH] ntp: Make periodic RTC update more reliable
+
+The current code requires that the scheduled update of the RTC happens
+in the closest tick to the half of the second. This seems to be
+difficult to achieve reliably. The scheduled work may be missing the
+target time by a tick or two and be constantly rescheduled every second.
+
+Relax the limit to 10 ticks. As a typical RTC drifts in the 11-minute
+update interval by several milliseconds, this shouldn't affect the
+overall accuracy of the RTC much.
+
+Signed-off-by: Miroslav Lichvar <mlichvar at redhat.com>
+Signed-off-by: John Stultz <john.stultz at linaro.org>
+---
+ kernel/time/ntp.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
+index 8f5b3b9..ab1fa7c 100644
+--- a/kernel/time/ntp.c
++++ b/kernel/time/ntp.c
+@@ -475,6 +475,7 @@ static void sync_cmos_clock(struct work_struct *work)
+ 	 * called as close as possible to 500 ms before the new second starts.
+ 	 * This code is run on a timer.  If the clock is set, that timer
+ 	 * may not expire at the correct time.  Thus, we adjust...
++	 * We want the clock to be within a couple of ticks from the target.
+ 	 */
+ 	if (!ntp_synced()) {
+ 		/*
+@@ -485,7 +486,7 @@ static void sync_cmos_clock(struct work_struct *work)
+ 	}
+ 
+ 	getnstimeofday(&now);
+-	if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) {
++	if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec * 5) {
+ 		struct timespec adjust = now;
+ 
+ 		fail = -ENODEV;
+-- 
+1.7.9.5
+
diff --git a/rt2800-add-support-for-rf3070.patch b/rt2800-add-support-for-rf3070.patch
new file mode 100644
index 0000000..24c16cb
--- /dev/null
+++ b/rt2800-add-support-for-rf3070.patch
@@ -0,0 +1,80 @@
+diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
+index d78c495..2132830 100644
+--- a/drivers/net/wireless/rt2x00/rt2800.h
++++ b/drivers/net/wireless/rt2x00/rt2800.h
+@@ -65,6 +65,7 @@
+ #define RF3021				0x0007
+ #define RF3022				0x0008
+ #define RF3052				0x0009
++#define RF3070				0x3070
+ #define RF2853				0x000a
+ #define RF3320				0x000b
+ #define RF3322				0x000c
+diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
+index 1b41c8e..2958265 100644
+--- a/drivers/net/wireless/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+@@ -2597,6 +2597,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
+ 	case RF3322:
+ 		rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
+ 		break;
++	case RF3070:
+ 	case RF5360:
+ 	case RF5370:
+ 	case RF5372:
+@@ -2611,7 +2612,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
+ 		rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
+ 	}
+ 
+-	if (rt2x00_rf(rt2x00dev, RF3290) ||
++	if (rt2x00_rf(rt2x00dev, RF3070) ||
++	    rt2x00_rf(rt2x00dev, RF3290) ||
+ 	    rt2x00_rf(rt2x00dev, RF3322) ||
+ 	    rt2x00_rf(rt2x00dev, RF5360) ||
+ 	    rt2x00_rf(rt2x00dev, RF5370) ||
+@@ -3219,6 +3221,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
+ 		rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
+ 		rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
+ 		break;
++	case RF3070:
+ 	case RF3290:
+ 	case RF5360:
+ 	case RF5370:
+@@ -5731,6 +5734,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
+ 	case RF3021:
+ 	case RF3022:
+ 	case RF3052:
++	case RF3070:
+ 	case RF3290:
+ 	case RF3320:
+ 	case RF3322:
+@@ -6186,6 +6190,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+ 		   rt2x00_rf(rt2x00dev, RF2020) ||
+ 		   rt2x00_rf(rt2x00dev, RF3021) ||
+ 		   rt2x00_rf(rt2x00dev, RF3022) ||
++		   rt2x00_rf(rt2x00dev, RF3070) ||
+ 		   rt2x00_rf(rt2x00dev, RF3290) ||
+ 		   rt2x00_rf(rt2x00dev, RF3320) ||
+ 		   rt2x00_rf(rt2x00dev, RF3322) ||
+@@ -6219,10 +6224,11 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+ 	/*
+ 	 * Initialize HT information.
+ 	 */
+-	if (!rt2x00_rf(rt2x00dev, RF2020))
++	if (!rt2x00_rf(rt2x00dev, RF2020)) {
+ 		spec->ht.ht_supported = true;
+-	else
++ 	} else {
+ 		spec->ht.ht_supported = false;
++	}
+ 
+ 	spec->ht.cap =
+ 	    IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+@@ -6290,6 +6296,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+ 	case RF3022:
+ 	case RF3320:
+ 	case RF3052:
++	case RF3070:
+ 	case RF3290:
+ 	case RF5360:
+ 	case RF5370:
diff --git a/skge-fix-invalid-value-passed-to-pci_unmap_sigle.patch b/skge-fix-invalid-value-passed-to-pci_unmap_sigle.patch
new file mode 100644
index 0000000..908e0c7
--- /dev/null
+++ b/skge-fix-invalid-value-passed-to-pci_unmap_sigle.patch
@@ -0,0 +1,61 @@
+From 3361dc9538832a2a9150a8c722374ca844bf8dc8 Mon Sep 17 00:00:00 2001
+From: Mikulas Patocka <mpatocka at redhat.com>
+Date: Fri, 20 Sep 2013 17:53:22 +0000
+Subject: skge: fix invalid value passed to pci_unmap_sigle
+
+In my patch c194992cbe71c20bb3623a566af8d11b0bfaa721 ("skge: fix
+broken driver") I didn't fix the skge bug correctly. The value of the
+new mapping (not old) was passed to pci_unmap_single.
+
+If we enable CONFIG_DMA_API_DEBUG, it results in this warning:
+WARNING: CPU: 0 PID: 0 at lib/dma-debug.c:986 check_sync+0x4c4/0x580()
+skge 0000:02:07.0: DMA-API: device driver tries to sync DMA memory it has
+not allocated [device address=0x000000023a0096c0] [size=1536 bytes]
+
+This patch makes the skge driver pass the correct value to
+pci_unmap_single and fixes the warning. It copies the old descriptor to
+on-stack variable "ee" and unmaps it if mapping of the new descriptor
+succeeded.
+
+This patch should be backported to 3.11-stable.
+
+Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
+Reported-by: Francois Romieu <romieu at fr.zoreil.com>
+Tested-by: Mikulas Patocka <mpatocka at redhat.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c
+index 1a9c4f6..ecc7f7b 100644
+--- a/drivers/net/ethernet/marvell/skge.c
++++ b/drivers/net/ethernet/marvell/skge.c
+@@ -3086,13 +3086,16 @@ static struct sk_buff *skge_rx_get(struct net_device *dev,
+ 					       PCI_DMA_FROMDEVICE);
+ 		skge_rx_reuse(e, skge->rx_buf_size);
+ 	} else {
++		struct skge_element ee;
+ 		struct sk_buff *nskb;
+ 
+ 		nskb = netdev_alloc_skb_ip_align(dev, skge->rx_buf_size);
+ 		if (!nskb)
+ 			goto resubmit;
+ 
+-		skb = e->skb;
++		ee = *e;
++
++		skb = ee.skb;
+ 		prefetch(skb->data);
+ 
+ 		if (skge_rx_setup(skge, e, nskb, skge->rx_buf_size) < 0) {
+@@ -3101,8 +3104,8 @@ static struct sk_buff *skge_rx_get(struct net_device *dev,
+ 		}
+ 
+ 		pci_unmap_single(skge->hw->pdev,
+-				 dma_unmap_addr(e, mapaddr),
+-				 dma_unmap_len(e, maplen),
++				 dma_unmap_addr(&ee, mapaddr),
++				 dma_unmap_len(&ee, maplen),
+ 				 PCI_DMA_FROMDEVICE);
+ 	}
+ 
+--
+cgit v0.9.2


More information about the scm-commits mailing list