[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