From c721e1e59b79052704065709553e9623fea3d2d7 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 10 Mar 2010 16:15:36 -0800 Subject: [PATCH] .32 patches --- ...orrect-packet-type-when-transmitting.patch | 76 ++++++++++++++ ...e-rifs-search-for-ar91xx-based-chips.patch | 58 +++++++++++ ...con-timer-restart-after-a-card-reset.patch | 53 ++++++++++ ...rate-control-fallback-rate-selection.patch | 82 +++++++++++++++ ...y-wake-queues-in-wireless_core_start.patch | 64 ++++++++++++ ...filter-xt_recent-fix-buffer-overflow.patch | 38 +++++++ .../netfilter-xt_recent-fix-false-match.patch | 30 ++++++ ...t3x2n-always-stretch-ultradma-timing.patch | 58 +++++++++++ ...don-t-use-possibly-stale-sched_class.patch | 63 ++++++++++++ ...d-fix-sched_mv_power_savings-for-smt.patch | 39 ++++++++ ...ler-regression-in-find_busiest_queue.patch | 99 +++++++++++++++++++ ...rt-scm_rights-on-unix-domain-sockets.patch | 34 +++++++ queue-2.6.32/series | 13 +++ ...ditional-pci-id-for-sunxvr500-driver.patch | 31 ++++++ 14 files changed, 738 insertions(+) create mode 100644 queue-2.6.32/ath5k-use-correct-packet-type-when-transmitting.patch create mode 100644 queue-2.6.32/ath9k-disable-rifs-search-for-ar91xx-based-chips.patch create mode 100644 queue-2.6.32/ath9k-fix-beacon-timer-restart-after-a-card-reset.patch create mode 100644 queue-2.6.32/ath9k-fix-rate-control-fallback-rate-selection.patch create mode 100644 queue-2.6.32/b43-b43legacy-wake-queues-in-wireless_core_start.patch create mode 100644 queue-2.6.32/netfilter-xt_recent-fix-buffer-overflow.patch create mode 100644 queue-2.6.32/netfilter-xt_recent-fix-false-match.patch create mode 100644 queue-2.6.32/pata_hpt3x2n-always-stretch-ultradma-timing.patch create mode 100644 queue-2.6.32/sched-don-t-use-possibly-stale-sched_class.patch create mode 100644 queue-2.6.32/sched-fix-sched_mv_power_savings-for-smt.patch create mode 100644 queue-2.6.32/sched-fix-smt-scheduler-regression-in-find_busiest_queue.patch create mode 100644 queue-2.6.32/scm-only-support-scm_rights-on-unix-domain-sockets.patch create mode 100644 queue-2.6.32/sunxvr500-additional-pci-id-for-sunxvr500-driver.patch diff --git a/queue-2.6.32/ath5k-use-correct-packet-type-when-transmitting.patch b/queue-2.6.32/ath5k-use-correct-packet-type-when-transmitting.patch new file mode 100644 index 00000000000..a1d9917d9ed --- /dev/null +++ b/queue-2.6.32/ath5k-use-correct-packet-type-when-transmitting.patch @@ -0,0 +1,76 @@ +From 2ac2927a953a01c83df255118922cce1523d1a18 Mon Sep 17 00:00:00 2001 +From: Bob Copeland +Date: Tue, 9 Feb 2010 13:06:54 -0500 +Subject: ath5k: use correct packet type when transmitting + +From: Bob Copeland + +commit 2ac2927a953a01c83df255118922cce1523d1a18 upstream. + +The hardware needs to know what type of frames are being +sent in order to fill in various fields, for example the +timestamp in probe responses (before this patch, it was +always 0). Set it correctly when initializing the TX +descriptor. + +Signed-off-by: Bob Copeland +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/ath/ath5k/ath5k.h | 1 - + drivers/net/wireless/ath/ath5k/base.c | 26 +++++++++++++++++++++++++- + 2 files changed, 25 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath5k/ath5k.h ++++ b/drivers/net/wireless/ath/ath5k/ath5k.h +@@ -546,7 +546,6 @@ struct ath5k_txq_info { + /* + * Transmit packet types. + * used on tx control descriptor +- * TODO: Use them inside base.c corectly + */ + enum ath5k_pkt_type { + AR5K_PKT_TYPE_NORMAL = 0, +--- a/drivers/net/wireless/ath/ath5k/base.c ++++ b/drivers/net/wireless/ath/ath5k/base.c +@@ -1220,6 +1220,29 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc + return 0; + } + ++static enum ath5k_pkt_type get_hw_packet_type(struct sk_buff *skb) ++{ ++ struct ieee80211_hdr *hdr; ++ enum ath5k_pkt_type htype; ++ __le16 fc; ++ ++ hdr = (struct ieee80211_hdr *)skb->data; ++ fc = hdr->frame_control; ++ ++ if (ieee80211_is_beacon(fc)) ++ htype = AR5K_PKT_TYPE_BEACON; ++ else if (ieee80211_is_probe_resp(fc)) ++ htype = AR5K_PKT_TYPE_PROBE_RESP; ++ else if (ieee80211_is_atim(fc)) ++ htype = AR5K_PKT_TYPE_ATIM; ++ else if (ieee80211_is_pspoll(fc)) ++ htype = AR5K_PKT_TYPE_PSPOLL; ++ else ++ htype = AR5K_PKT_TYPE_NORMAL; ++ ++ return htype; ++} ++ + static int + ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf, + struct ath5k_txq *txq) +@@ -1274,7 +1297,8 @@ ath5k_txbuf_setup(struct ath5k_softc *sc + sc->vif, pktlen, info)); + } + ret = ah->ah_setup_tx_desc(ah, ds, pktlen, +- ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL, ++ ieee80211_get_hdrlen_from_skb(skb), ++ get_hw_packet_type(skb), + (sc->power_level * 2), + hw_rate, + info->control.rates[0].count, keyidx, ah->ah_tx_ant, flags, diff --git a/queue-2.6.32/ath9k-disable-rifs-search-for-ar91xx-based-chips.patch b/queue-2.6.32/ath9k-disable-rifs-search-for-ar91xx-based-chips.patch new file mode 100644 index 00000000000..581acfd12a0 --- /dev/null +++ b/queue-2.6.32/ath9k-disable-rifs-search-for-ar91xx-based-chips.patch @@ -0,0 +1,58 @@ +From 7bfbae10dc10a5c94a780d117a57e875d77e8e5a Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Wed, 24 Feb 2010 04:43:05 +0100 +Subject: ath9k: disable RIFS search for AR91xx based chips + +From: Felix Fietkau + +commit 7bfbae10dc10a5c94a780d117a57e875d77e8e5a upstream. + +While ath9k does not support RIFS yet, the ability to receive RIFS +frames is currently enabled for most chipsets in the initvals. +This is causing baseband related issues on AR9160 and AR9130 based +chipsets, which can lock up under certain conditions. + +This patch fixes these issues by overriding the initvals, effectively +disabling RIFS for all affected chipsets. + +Signed-off-by: Felix Fietkau +Acked-by: Luis R. Rodriguez +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/ath/ath9k/hw.c | 10 ++++++++++ + drivers/net/wireless/ath/ath9k/phy.h | 3 +++ + 2 files changed, 13 insertions(+) + +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -1295,6 +1295,16 @@ static void ath9k_hw_override_ini(struct + * Necessary to avoid issues on AR5416 2.0 + */ + REG_WRITE(ah, 0x9800 + (651 << 2), 0x11); ++ ++ /* ++ * Disable RIFS search on some chips to avoid baseband ++ * hang issues. ++ */ ++ if (AR_SREV_9100(ah) || AR_SREV_9160(ah)) { ++ val = REG_READ(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS); ++ val &= ~AR_PHY_RIFS_INIT_DELAY; ++ REG_WRITE(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS, val); ++ } + } + + static u32 ath9k_hw_def_ini_fixup(struct ath_hw *ah, +--- a/drivers/net/wireless/ath/ath9k/phy.h ++++ b/drivers/net/wireless/ath/ath9k/phy.h +@@ -368,6 +368,9 @@ bool ath9k_hw_init_rf(struct ath_hw *ah, + + #define AR_PHY_HEAVY_CLIP_ENABLE 0x99E0 + ++#define AR_PHY_HEAVY_CLIP_FACTOR_RIFS 0x99EC ++#define AR_PHY_RIFS_INIT_DELAY 0x03ff0000 ++ + #define AR_PHY_M_SLEEP 0x99f0 + #define AR_PHY_REFCLKDLY 0x99f4 + #define AR_PHY_REFCLKPD 0x99f8 diff --git a/queue-2.6.32/ath9k-fix-beacon-timer-restart-after-a-card-reset.patch b/queue-2.6.32/ath9k-fix-beacon-timer-restart-after-a-card-reset.patch new file mode 100644 index 00000000000..ae1084cf72f --- /dev/null +++ b/queue-2.6.32/ath9k-fix-beacon-timer-restart-after-a-card-reset.patch @@ -0,0 +1,53 @@ +From d8728ee919282c7b01b65cd479ec1e2a9c5d3ba8 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 19 Feb 2010 18:21:42 +0100 +Subject: ath9k: fix beacon timer restart after a card reset + +From: Felix Fietkau + +commit d8728ee919282c7b01b65cd479ec1e2a9c5d3ba8 upstream. + +In AP mode, ath_beacon_config_ap only restarts the timer if a TSF +restart is requested. Apparently this was added, because this function +unconditionally sets the flag for TSF reset. + +The problem with this is, that ath9k_hw_reset() clobbers the timer +registers (specified in the initvals), thus effectively disabling the +SWBA interrupt whenever a card reset without TSF reset is issued +(happens in a few places in the code). + +This patch fixes ath_beacon_config_ap to only issue the TSF reset flag +when necessary, but reinitialize the timer unconditionally. Tests show, +that this is enough to keep the SWBA interrupt going after a call to +ath_reset() + +Signed-off-by: Felix Fietkau +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/ath/ath9k/beacon.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath9k/beacon.c ++++ b/drivers/net/wireless/ath/ath9k/beacon.c +@@ -512,16 +512,13 @@ static void ath_beacon_config_ap(struct + { + u32 nexttbtt, intval; + +- /* Configure the timers only when the TSF has to be reset */ +- +- if (!(sc->sc_flags & SC_OP_TSF_RESET)) +- return; +- + /* NB: the beacon interval is kept internally in TU's */ + intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; + intval /= ATH_BCBUF; /* for staggered beacons */ + nexttbtt = intval; +- intval |= ATH9K_BEACON_RESET_TSF; ++ ++ if (sc->sc_flags & SC_OP_TSF_RESET) ++ intval |= ATH9K_BEACON_RESET_TSF; + + /* + * In AP mode we enable the beacon timers and SWBA interrupts to diff --git a/queue-2.6.32/ath9k-fix-rate-control-fallback-rate-selection.patch b/queue-2.6.32/ath9k-fix-rate-control-fallback-rate-selection.patch new file mode 100644 index 00000000000..c91e883bf7d --- /dev/null +++ b/queue-2.6.32/ath9k-fix-rate-control-fallback-rate-selection.patch @@ -0,0 +1,82 @@ +From 5c0ba62fd4b2dce08055a89600f1d834f9f0fe9e Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +Date: Fri, 19 Feb 2010 01:46:36 +0100 +Subject: ath9k: fix rate control fallback rate selection + +From: Felix Fietkau + +commit 5c0ba62fd4b2dce08055a89600f1d834f9f0fe9e upstream. + +When selecting the tx fallback rate, rc.c used a separate variable +'nrix' for storing the next rate index, however it did not use that as +reference for further rate index lowering. Because of that, it ended up +reusing the same rate for multiple multi-rate retry stages, thus +decreasing delivery probability under changing link conditions. + +This patch removes the separate (unnecessary) variable and fixes +fallback the way it was intended to work. +This should result in increased throughput and better link stability. + +Signed-off-by: Felix Fietkau +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/ath/ath9k/rc.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +--- a/drivers/net/wireless/ath/ath9k/rc.c ++++ b/drivers/net/wireless/ath/ath9k/rc.c +@@ -757,7 +757,7 @@ static void ath_get_rate(void *priv, str + struct ieee80211_tx_rate *rates = tx_info->control.rates; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + __le16 fc = hdr->frame_control; +- u8 try_per_rate, i = 0, rix, nrix; ++ u8 try_per_rate, i = 0, rix; + int is_probe = 0; + + if (rate_control_send_low(sta, priv_sta, txrc)) +@@ -777,26 +777,25 @@ static void ath_get_rate(void *priv, str + + rate_table = sc->cur_rate_table; + rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe); +- nrix = rix; + + if (is_probe) { + /* set one try for probe rates. For the + * probes don't enable rts */ + ath_rc_rate_set_series(rate_table, &rates[i++], txrc, +- 1, nrix, 0); ++ 1, rix, 0); + + /* Get the next tried/allowed rate. No RTS for the next series + * after the probe rate + */ +- ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix); ++ ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix); + ath_rc_rate_set_series(rate_table, &rates[i++], txrc, +- try_per_rate, nrix, 0); ++ try_per_rate, rix, 0); + + tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE; + } else { + /* Set the choosen rate. No RTS for first series entry. */ + ath_rc_rate_set_series(rate_table, &rates[i++], txrc, +- try_per_rate, nrix, 0); ++ try_per_rate, rix, 0); + } + + /* Fill in the other rates for multirate retry */ +@@ -805,10 +804,10 @@ static void ath_get_rate(void *priv, str + if (i + 1 == 4) + try_per_rate = 4; + +- ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix); ++ ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix); + /* All other rates in the series have RTS enabled */ + ath_rc_rate_set_series(rate_table, &rates[i], txrc, +- try_per_rate, nrix, 1); ++ try_per_rate, rix, 1); + } + + /* diff --git a/queue-2.6.32/b43-b43legacy-wake-queues-in-wireless_core_start.patch b/queue-2.6.32/b43-b43legacy-wake-queues-in-wireless_core_start.patch new file mode 100644 index 00000000000..07b29a98ca0 --- /dev/null +++ b/queue-2.6.32/b43-b43legacy-wake-queues-in-wireless_core_start.patch @@ -0,0 +1,64 @@ +From 0866b03c7d7dee8a34ffa527ecda426c0f405518 Mon Sep 17 00:00:00 2001 +From: Larry Finger +Date: Wed, 3 Feb 2010 13:33:44 -0600 +Subject: b43/b43legacy: Wake queues in wireless_core_start + +From: Larry Finger + +commit 0866b03c7d7dee8a34ffa527ecda426c0f405518 upstream. + +If b43 or b43legacy are deauthenticated or disconnected, there is a +possibility that a reconnection is tried with the queues stopped in +mac80211. To prevent this, start the queues before setting +STAT_INITIALIZED. + +In b43, a similar change has been in place (twice) in the +wireless_core_init() routine. Remove the duplicate and add similar +code to b43legacy. + +Signed-off-by: Larry Finger +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/b43/main.c | 3 +-- + drivers/net/wireless/b43legacy/main.c | 2 ++ + 2 files changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/b43/main.c ++++ b/drivers/net/wireless/b43/main.c +@@ -3967,6 +3967,7 @@ static int b43_wireless_core_start(struc + } + + /* We are ready to run. */ ++ ieee80211_wake_queues(dev->wl->hw); + b43_set_status(dev, B43_STAT_STARTED); + + /* Start data flow (TX/RX). */ +@@ -4376,8 +4377,6 @@ static int b43_wireless_core_init(struct + + ieee80211_wake_queues(dev->wl->hw); + +- ieee80211_wake_queues(dev->wl->hw); +- + b43_set_status(dev, B43_STAT_INITIALIZED); + + out: +--- a/drivers/net/wireless/b43legacy/main.c ++++ b/drivers/net/wireless/b43legacy/main.c +@@ -2921,6 +2921,7 @@ static int b43legacy_wireless_core_start + goto out; + } + /* We are ready to run. */ ++ ieee80211_wake_queues(dev->wl->hw); + b43legacy_set_status(dev, B43legacy_STAT_STARTED); + + /* Start data flow (TX/RX) */ +@@ -3341,6 +3342,7 @@ static int b43legacy_wireless_core_init( + b43legacy_security_init(dev); + b43legacy_rng_init(wl); + ++ ieee80211_wake_queues(dev->wl->hw); + b43legacy_set_status(dev, B43legacy_STAT_INITIALIZED); + + b43legacy_leds_init(dev); diff --git a/queue-2.6.32/netfilter-xt_recent-fix-buffer-overflow.patch b/queue-2.6.32/netfilter-xt_recent-fix-buffer-overflow.patch new file mode 100644 index 00000000000..68a504b4ad1 --- /dev/null +++ b/queue-2.6.32/netfilter-xt_recent-fix-buffer-overflow.patch @@ -0,0 +1,38 @@ +From 2c08522e5d2f0af2d6f05be558946dcbf8173683 Mon Sep 17 00:00:00 2001 +From: Tim Gardner +Date: Tue, 23 Feb 2010 14:55:21 +0100 +Subject: netfilter: xt_recent: fix buffer overflow + +From: Tim Gardner + +commit 2c08522e5d2f0af2d6f05be558946dcbf8173683 upstream. + +e->index overflows e->stamps[] every ip_pkt_list_tot packets. + +Consider the case when ip_pkt_list_tot==1; the first packet received is stored +in e->stamps[0] and e->index is initialized to 1. The next received packet +timestamp is then stored at e->stamps[1] in recent_entry_update(), +a buffer overflow because the maximum e->stamps[] index is 0. + +Signed-off-by: Tim Gardner +Signed-off-by: Patrick McHardy +Signed-off-by: Greg Kroah-Hartman + +--- + net/netfilter/xt_recent.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/netfilter/xt_recent.c ++++ b/net/netfilter/xt_recent.c +@@ -173,10 +173,10 @@ recent_entry_init(struct recent_table *t + + static void recent_entry_update(struct recent_table *t, struct recent_entry *e) + { ++ e->index %= ip_pkt_list_tot; + e->stamps[e->index++] = jiffies; + if (e->index > e->nstamps) + e->nstamps = e->index; +- e->index %= ip_pkt_list_tot; + list_move_tail(&e->lru_list, &t->lru_list); + } + diff --git a/queue-2.6.32/netfilter-xt_recent-fix-false-match.patch b/queue-2.6.32/netfilter-xt_recent-fix-false-match.patch new file mode 100644 index 00000000000..a957f86b3c7 --- /dev/null +++ b/queue-2.6.32/netfilter-xt_recent-fix-false-match.patch @@ -0,0 +1,30 @@ +From 8ccb92ad41cb311e52ad1b1fe77992c7f47a3b63 Mon Sep 17 00:00:00 2001 +From: Tim Gardner +Date: Tue, 23 Feb 2010 14:59:12 +0100 +Subject: netfilter: xt_recent: fix false match + +From: Tim Gardner + +commit 8ccb92ad41cb311e52ad1b1fe77992c7f47a3b63 upstream. + +A rule with a zero hit_count will always match. + +Signed-off-by: Tim Gardner +Signed-off-by: Patrick McHardy +Signed-off-by: Greg Kroah-Hartman + +--- + net/netfilter/xt_recent.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/netfilter/xt_recent.c ++++ b/net/netfilter/xt_recent.c +@@ -260,7 +260,7 @@ recent_mt(const struct sk_buff *skb, con + for (i = 0; i < e->nstamps; i++) { + if (info->seconds && time_after(time, e->stamps[i])) + continue; +- if (++hits >= info->hit_count) { ++ if (info->hit_count && ++hits >= info->hit_count) { + ret = !ret; + break; + } diff --git a/queue-2.6.32/pata_hpt3x2n-always-stretch-ultradma-timing.patch b/queue-2.6.32/pata_hpt3x2n-always-stretch-ultradma-timing.patch new file mode 100644 index 00000000000..69e46439507 --- /dev/null +++ b/queue-2.6.32/pata_hpt3x2n-always-stretch-ultradma-timing.patch @@ -0,0 +1,58 @@ +From 60661933995bc7a09686c901439e17c2a4ea7d5d Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Mon, 7 Dec 2009 23:25:52 +0400 +Subject: pata_hpt3x2n: always stretch UltraDMA timing + +From: Sergei Shtylyov + +commit 60661933995bc7a09686c901439e17c2a4ea7d5d upstream. + +The UltraDMA Tss timing must be stretched with ATA clock of 66 MHz, but the +driver only does this when PCI clock is 66 MHz, whereas it always programs +DPLL clock (which is used as the ATA clock) to 66 MHz. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: Jeff Garzik +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ata/pata_hpt3x2n.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +--- a/drivers/ata/pata_hpt3x2n.c ++++ b/drivers/ata/pata_hpt3x2n.c +@@ -25,7 +25,7 @@ + #include + + #define DRV_NAME "pata_hpt3x2n" +-#define DRV_VERSION "0.3.8" ++#define DRV_VERSION "0.3.9" + + enum { + HPT_PCI_FAST = (1 << 31), +@@ -547,16 +547,16 @@ static int hpt3x2n_init_one(struct pci_d + pci_mhz); + /* Set our private data up. We only need a few flags so we use + it directly */ +- if (pci_mhz > 60) { ++ if (pci_mhz > 60) + hpriv = (void *)(PCI66 | USE_DPLL); +- /* +- * On HPT371N, if ATA clock is 66 MHz we must set bit 2 in +- * the MISC. register to stretch the UltraDMA Tss timing. +- * NOTE: This register is only writeable via I/O space. +- */ +- if (dev->device == PCI_DEVICE_ID_TTI_HPT371) +- outb(inb(iobase + 0x9c) | 0x04, iobase + 0x9c); +- } ++ ++ /* ++ * On HPT371N, if ATA clock is 66 MHz we must set bit 2 in ++ * the MISC. register to stretch the UltraDMA Tss timing. ++ * NOTE: This register is only writeable via I/O space. ++ */ ++ if (dev->device == PCI_DEVICE_ID_TTI_HPT371) ++ outb(inb(iobase + 0x9c) | 0x04, iobase + 0x9c); + + /* Now kick off ATA set up */ + return ata_pci_sff_init_one(dev, ppi, &hpt3x2n_sht, hpriv); diff --git a/queue-2.6.32/sched-don-t-use-possibly-stale-sched_class.patch b/queue-2.6.32/sched-don-t-use-possibly-stale-sched_class.patch new file mode 100644 index 00000000000..416ec2dd7ac --- /dev/null +++ b/queue-2.6.32/sched-don-t-use-possibly-stale-sched_class.patch @@ -0,0 +1,63 @@ +From 83ab0aa0d5623d823444db82c3b3c34d7ec364ae Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 17 Feb 2010 09:05:48 +0100 +Subject: sched: Don't use possibly stale sched_class + +From: Thomas Gleixner + +commit 83ab0aa0d5623d823444db82c3b3c34d7ec364ae upstream. + +setscheduler() saves task->sched_class outside of the rq->lock held +region for a check after the setscheduler changes have become +effective. That might result in checking a stale value. + +rtmutex_setprio() has the same problem, though it is protected by +p->pi_lock against setscheduler(), but for correctness sake (and to +avoid bad examples) it needs to be fixed as well. + +Retrieve task->sched_class inside of the rq->lock held region. + +Signed-off-by: Thomas Gleixner +Acked-by: Peter Zijlstra +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/sched.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/kernel/sched.c ++++ b/kernel/sched.c +@@ -6009,7 +6009,7 @@ void rt_mutex_setprio(struct task_struct + unsigned long flags; + int oldprio, on_rq, running; + struct rq *rq; +- const struct sched_class *prev_class = p->sched_class; ++ const struct sched_class *prev_class; + + BUG_ON(prio < 0 || prio > MAX_PRIO); + +@@ -6017,6 +6017,7 @@ void rt_mutex_setprio(struct task_struct + update_rq_clock(rq); + + oldprio = p->prio; ++ prev_class = p->sched_class; + on_rq = p->se.on_rq; + running = task_current(rq, p); + if (on_rq) +@@ -6244,7 +6245,7 @@ static int __sched_setscheduler(struct t + { + int retval, oldprio, oldpolicy = -1, on_rq, running; + unsigned long flags; +- const struct sched_class *prev_class = p->sched_class; ++ const struct sched_class *prev_class; + struct rq *rq; + int reset_on_fork; + +@@ -6358,6 +6359,7 @@ recheck: + p->sched_reset_on_fork = reset_on_fork; + + oldprio = p->prio; ++ prev_class = p->sched_class; + __setscheduler(rq, p, policy, param->sched_priority); + + if (running) diff --git a/queue-2.6.32/sched-fix-sched_mv_power_savings-for-smt.patch b/queue-2.6.32/sched-fix-sched_mv_power_savings-for-smt.patch new file mode 100644 index 00000000000..c147f2d68a4 --- /dev/null +++ b/queue-2.6.32/sched-fix-sched_mv_power_savings-for-smt.patch @@ -0,0 +1,39 @@ +From 28f5318167adf23b16c844b9c2253f355cb21796 Mon Sep 17 00:00:00 2001 +From: Vaidyanathan Srinivasan +Date: Mon, 8 Feb 2010 15:35:55 +0530 +Subject: sched: Fix sched_mv_power_savings for !SMT + +From: Vaidyanathan Srinivasan + +commit 28f5318167adf23b16c844b9c2253f355cb21796 upstream. + +Fix for sched_mc_powersavigs for pre-Nehalem platforms. +Child sched domain should clear SD_PREFER_SIBLING if parent will have +SD_POWERSAVINGS_BALANCE because they are contradicting. + +Sets the flags correctly based on sched_mc_power_savings. + +Signed-off-by: Vaidyanathan Srinivasan +Signed-off-by: Peter Zijlstra +LKML-Reference: <20100208100555.GD2931@dirshya.in.ibm.com> +Signed-off-by: Thomas Gleixner +Signed-off-by: Greg Kroah-Hartman + +--- + include/linux/sched.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -864,7 +864,10 @@ static inline int sd_balance_for_mc_powe + if (sched_smt_power_savings) + return SD_POWERSAVINGS_BALANCE; + +- return SD_PREFER_SIBLING; ++ if (!sched_mc_power_savings) ++ return SD_PREFER_SIBLING; ++ ++ return 0; + } + + static inline int sd_balance_for_package_power(void) diff --git a/queue-2.6.32/sched-fix-smt-scheduler-regression-in-find_busiest_queue.patch b/queue-2.6.32/sched-fix-smt-scheduler-regression-in-find_busiest_queue.patch new file mode 100644 index 00000000000..d06bcf62a32 --- /dev/null +++ b/queue-2.6.32/sched-fix-smt-scheduler-regression-in-find_busiest_queue.patch @@ -0,0 +1,99 @@ +From 9000f05c6d1607f79c0deacf42b09693be673f4c Mon Sep 17 00:00:00 2001 +From: Suresh Siddha +Date: Fri, 12 Feb 2010 17:14:22 -0800 +Subject: sched: Fix SMT scheduler regression in find_busiest_queue() + +From: Suresh Siddha + +commit 9000f05c6d1607f79c0deacf42b09693be673f4c upstream. + +Fix a SMT scheduler performance regression that is leading to a scenario +where SMT threads in one core are completely idle while both the SMT threads +in another core (on the same socket) are busy. + +This is caused by this commit (with the problematic code highlighted) + + commit bdb94aa5dbd8b55e75f5a50b61312fe589e2c2d1 + Author: Peter Zijlstra + Date: Tue Sep 1 10:34:38 2009 +0200 + + sched: Try to deal with low capacity + + @@ -4203,15 +4223,18 @@ find_busiest_queue() + ... + for_each_cpu(i, sched_group_cpus(group)) { + + unsigned long power = power_of(i); + + ... + + - wl = weighted_cpuload(i); + + wl = weighted_cpuload(i) * SCHED_LOAD_SCALE; + + wl /= power; + + - if (rq->nr_running == 1 && wl > imbalance) + + if (capacity && rq->nr_running == 1 && wl > imbalance) + continue; + +On a SMT system, power of the HT logical cpu will be 589 and +the scheduler load imbalance (for scenarios like the one mentioned above) +can be approximately 1024 (SCHED_LOAD_SCALE). The above change of scaling +the weighted load with the power will result in "wl > imbalance" and +ultimately resulting in find_busiest_queue() return NULL, causing +load_balance() to think that the load is well balanced. But infact +one of the tasks can be moved to the idle core for optimal performance. + +We don't need to use the weighted load (wl) scaled by the cpu power to +compare with imabalance. In that condition, we already know there is only a +single task "rq->nr_running == 1" and the comparison between imbalance, +wl is to make sure that we select the correct priority thread which matches +imbalance. So we really need to compare the imabalnce with the original +weighted load of the cpu and not the scaled load. + +But in other conditions where we want the most hammered(busiest) cpu, we can +use scaled load to ensure that we consider the cpu power in addition to the +actual load on that cpu, so that we can move the load away from the +guy that is getting most hammered with respect to the actual capacity, +as compared with the rest of the cpu's in that busiest group. + +Fix it. + +Reported-by: Ma Ling +Initial-Analysis-by: Zhang, Yanmin +Signed-off-by: Suresh Siddha +Signed-off-by: Peter Zijlstra +LKML-Reference: <1266023662.2808.118.camel@sbs-t61.sc.intel.com> +Signed-off-by: Thomas Gleixner +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/sched.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +--- a/kernel/sched.c ++++ b/kernel/sched.c +@@ -4098,12 +4098,23 @@ find_busiest_queue(struct sched_group *g + continue; + + rq = cpu_rq(i); +- wl = weighted_cpuload(i) * SCHED_LOAD_SCALE; +- wl /= power; ++ wl = weighted_cpuload(i); + ++ /* ++ * When comparing with imbalance, use weighted_cpuload() ++ * which is not scaled with the cpu power. ++ */ + if (capacity && rq->nr_running == 1 && wl > imbalance) + continue; + ++ /* ++ * For the load comparisons with the other cpu's, consider ++ * the weighted_cpuload() scaled with the cpu power, so that ++ * the load can be moved away from the cpu that is potentially ++ * running at a lower capacity. ++ */ ++ wl = (wl * SCHED_LOAD_SCALE) / power; ++ + if (wl > max_load) { + max_load = wl; + busiest = rq; diff --git a/queue-2.6.32/scm-only-support-scm_rights-on-unix-domain-sockets.patch b/queue-2.6.32/scm-only-support-scm_rights-on-unix-domain-sockets.patch new file mode 100644 index 00000000000..9415ff14d5f --- /dev/null +++ b/queue-2.6.32/scm-only-support-scm_rights-on-unix-domain-sockets.patch @@ -0,0 +1,34 @@ +From 76dadd76c265a0cdb5a76aa4eef03fcc9639b388 Mon Sep 17 00:00:00 2001 +From: Eric W. Biederman +Date: Sun, 28 Feb 2010 01:20:36 +0000 +Subject: scm: Only support SCM_RIGHTS on unix domain sockets. + +From: Eric W. Biederman + +commit 76dadd76c265a0cdb5a76aa4eef03fcc9639b388 upstream. + +We use scm_send and scm_recv on both unix domain and +netlink sockets, but only unix domain sockets support +everything required for file descriptor passing, +so error if someone attempts to pass file descriptors +over netlink sockets. + +Signed-off-by: Eric W. Biederman +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + net/core/scm.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/net/core/scm.c ++++ b/net/core/scm.c +@@ -156,6 +156,8 @@ int __scm_send(struct socket *sock, stru + switch (cmsg->cmsg_type) + { + case SCM_RIGHTS: ++ if (!sock->ops || sock->ops->family != PF_UNIX) ++ goto error; + err=scm_fp_copy(cmsg, &p->fp); + if (err<0) + goto error; diff --git a/queue-2.6.32/series b/queue-2.6.32/series index 6aaf65f260f..051b536cf0c 100644 --- a/queue-2.6.32/series +++ b/queue-2.6.32/series @@ -93,3 +93,16 @@ p54pci-handle-dma-mapping-errors.patch gpiolib-actually-set-output-state-in-wm831x_gpio_direction_output.patch hwmon-tmp421-fix-temperature-conversions.patch hwmon-tmp421-restore-missing-inputs.patch +pata_hpt3x2n-always-stretch-ultradma-timing.patch +scm-only-support-scm_rights-on-unix-domain-sockets.patch +ath9k-fix-beacon-timer-restart-after-a-card-reset.patch +ath9k-fix-rate-control-fallback-rate-selection.patch +ath9k-disable-rifs-search-for-ar91xx-based-chips.patch +ath5k-use-correct-packet-type-when-transmitting.patch +b43-b43legacy-wake-queues-in-wireless_core_start.patch +netfilter-xt_recent-fix-buffer-overflow.patch +netfilter-xt_recent-fix-false-match.patch +sunxvr500-additional-pci-id-for-sunxvr500-driver.patch +sched-fix-sched_mv_power_savings-for-smt.patch +sched-fix-smt-scheduler-regression-in-find_busiest_queue.patch +sched-don-t-use-possibly-stale-sched_class.patch diff --git a/queue-2.6.32/sunxvr500-additional-pci-id-for-sunxvr500-driver.patch b/queue-2.6.32/sunxvr500-additional-pci-id-for-sunxvr500-driver.patch new file mode 100644 index 00000000000..45123a0f294 --- /dev/null +++ b/queue-2.6.32/sunxvr500-additional-pci-id-for-sunxvr500-driver.patch @@ -0,0 +1,31 @@ +From 275143e9b237dd7e0b6d01660fd9b8acd9922fa7 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Fri, 26 Feb 2010 04:37:09 -0800 +Subject: sunxvr500: Additional PCI id for sunxvr500 driver + +From: Ben Hutchings + +commit 275143e9b237dd7e0b6d01660fd9b8acd9922fa7 upstream. + +Intergraph bought 3D Labs and some XVR-500 chips have Intergraph's +vendor id. + +Reported-by: Jurij Smakov +Signed-off-by: Ben Hutchings +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/video/sunxvr500.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/video/sunxvr500.c ++++ b/drivers/video/sunxvr500.c +@@ -400,6 +400,7 @@ static void __devexit e3d_pci_unregister + + static struct pci_device_id e3d_pci_table[] = { + { PCI_DEVICE(PCI_VENDOR_ID_3DLABS, 0x7a0), }, ++ { PCI_DEVICE(0x1091, 0x7a0), }, + { PCI_DEVICE(PCI_VENDOR_ID_3DLABS, 0x7a2), }, + { .vendor = PCI_VENDOR_ID_3DLABS, + .device = PCI_ANY_ID, -- 2.47.3