]> git.pld-linux.org Git - packages/kernel.git/blame - kernel-small_fixes.patch
- reinitialize ipmi watchdog if BMC was reset
[packages/kernel.git] / kernel-small_fixes.patch
CommitLineData
08aa9d92 1--- linux-2.6.32/drivers/infiniband/Kconfig~ 2009-12-05 00:26:03.663774916 +0100
2+++ linux-2.6.32/drivers/infiniband/Kconfig 2009-12-05 00:26:05.914179759 +0100
3@@ -37,7 +37,6 @@
4 config INFINIBAND_ADDR_TRANS
5 bool
6 depends on INET
7- depends on !(INFINIBAND = y && IPV6 = m)
8 default y
9
10 source "drivers/infiniband/hw/mthca/Kconfig"
11--- linux-2.6.33/scripts/mod/modpost.c~ 2010-02-24 19:52:17.000000000 +0100
12+++ linux-2.6.33/scripts/mod/modpost.c 2010-03-07 14:26:47.242168558 +0100
13@@ -15,7 +15,8 @@
14 #include <stdio.h>
15 #include <ctype.h>
16 #include "modpost.h"
17-#include "../../include/generated/autoconf.h"
18+// PLD architectures don't use CONFIG_SYMBOL_PREFIX
19+//#include "../../include/generated/autoconf.h"
20 #include "../../include/linux/license.h"
21
22 /* Some toolchains use a `_' prefix for all user symbols. */
23
24commit 87b09f1f25cd1e01d7c50bf423c7fe33027d7511
25Author: stephen hemminger <shemminger@vyatta.com>
26Date: Fri Feb 12 06:58:00 2010 +0000
27
28 sky2: dont enable PME legacy mode
29
30 This bit is not changed by vendor driver, and should be left alone.
31 The documentation implies this a debug bit.
32 0 = WAKE# only asserted when VMAIN not available
33 1 = WAKE# is depend on wake events and independent of VMAIN.
34
35 Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
36 Signed-off-by: David S. Miller <davem@davemloft.net>
37
38diff --git b/drivers/net/sky2.c a/drivers/net/sky2.c
39index 2494842..edf37aa 100644
40--- b/drivers/net/sky2.c
41+++ a/drivers/net/sky2.c
42@@ -733,6 +733,7 @@ static void sky2_wol_init(struct sky2_port *sky2)
43 unsigned port = sky2->port;
44 enum flow_control save_mode;
45 u16 ctrl;
46+ u32 reg1;
47
48 /* Bring hardware out of reset */
49 sky2_write16(hw, B0_CTST, CS_RST_CLR);
50@@ -786,6 +787,11 @@ static void sky2_wol_init(struct sky2_port *sky2)
51 /* Disable PiG firmware */
52 sky2_write16(hw, B0_CTST, Y2_HW_WOL_OFF);
53
54+ /* Turn on legacy PCI-Express PME mode */
55+ reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
56+ reg1 |= PCI_Y2_PME_LEGACY;
57+ sky2_pci_write32(hw, PCI_DEV_REG1, reg1);
58+
59 /* block receiver */
60 sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
61 }
23929ec1 62On Sat, 2 Jul 2011, Andi Kleen wrote:
2c2cf492 63
23929ec1
JR
64> > The problem is that blk_peek_request() calls scsi_prep_fn(), which
65> > does this:
66> >
67> > struct scsi_device *sdev = q->queuedata;
68> > int ret = BLKPREP_KILL;
69> >
70> > if (req->cmd_type == REQ_TYPE_BLOCK_PC)
71> > ret = scsi_setup_blk_pc_cmnd(sdev, req);
72> > return scsi_prep_return(q, req, ret);
73> >
74> > It doesn't check to see if sdev is NULL, nor does
75> > scsi_setup_blk_pc_cmnd(). That accounts for this error:
76>
77> I actually added a NULL check in scsi_setup_blk_pc_cmnd early on,
78> but that just caused RCU CPU stalls afterwards and then eventually
79> a hung system.
80
81The RCU problem is likely to be a separate issue. It might even be a
82result of the use-after-free problem with the elevator.
83
84At any rate, it's clear that the crash in the refcounting log you
85posted occurred because scsi_setup_blk_pc_cmnd() called
86scsi_prep_state_check(), which tried to dereference the NULL pointer.
87
88Would you like to try this patch to see if it fixes the problem? As I
89said before, I'm not certain it's the best thing to do, but it worked
90on my system.
91
92Alan Stern
93
94
95
96
97Index: usb-3.0/drivers/scsi/scsi_lib.c
98===================================================================
99--- usb-3.0.orig/drivers/scsi/scsi_lib.c
100+++ usb-3.0/drivers/scsi/scsi_lib.c
101@@ -1247,6 +1247,8 @@ int scsi_prep_fn(struct request_queue *q
102 struct scsi_device *sdev = q->queuedata;
103 int ret = BLKPREP_KILL;
104
105+ if (!sdev)
106+ return ret;
107 if (req->cmd_type == REQ_TYPE_BLOCK_PC)
108 ret = scsi_setup_blk_pc_cmnd(sdev, req);
109 return scsi_prep_return(q, req, ret);
110Index: usb-3.0/drivers/scsi/scsi_sysfs.c
111===================================================================
112--- usb-3.0.orig/drivers/scsi/scsi_sysfs.c
113+++ usb-3.0/drivers/scsi/scsi_sysfs.c
114@@ -322,6 +322,8 @@ static void scsi_device_dev_release_user
115 kfree(evt);
116 }
117
118+ /* Freeing the queue signals to block that we're done */
119+ scsi_free_queue(sdev->request_queue);
120 blk_put_queue(sdev->request_queue);
121 /* NULL queue means the device can't be used */
122 sdev->request_queue = NULL;
123@@ -936,8 +938,6 @@ void __scsi_remove_device(struct scsi_de
124 /* cause the request function to reject all I/O requests */
125 sdev->request_queue->queuedata = NULL;
126
127- /* Freeing the queue signals to block that we're done */
128- scsi_free_queue(sdev->request_queue);
129 put_device(dev);
130 }
131
132
133
23929ec1
JR
134--
135To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
136the body of a message to majordomo@vger.kernel.org
137More majordomo info at http://vger.kernel.org/majordomo-info.html
138Please read the FAQ at http://www.tux.org/lkml/
2136e199
AM
139--- linux-3.0/scripts/kconfig/lxdialog/check-lxdialog.sh~ 2011-07-22 04:17:23.000000000 +0200
140+++ linux-3.0/scripts/kconfig/lxdialog/check-lxdialog.sh 2011-08-25 21:26:04.799150642 +0200
141@@ -9,6 +9,12 @@
142 $cc -print-file-name=lib${lib}.${ext} | grep -q /
143 if [ $? -eq 0 ]; then
144 echo "-l${lib}"
145+ for libt in tinfow tinfo ; do
146+ $cc -print-file-name=lib${libt}.${ext} | grep -q /
147+ if [ $? -eq 0 ]; then
148+ echo "-l${libt}"
149+ fi
150+ done
151 exit
152 fi
153 done
44c0f99c 154
e0470645 155
c8aa6c21 156
5a5cc62f
AM
157commit 745718132c3c7cac98a622b610e239dcd5217f71
158Author: Hannes Reinecke <hare@suse.de>
159Date: Wed Nov 9 08:39:24 2011 +0100
160
161 [SCSI] Silencing 'killing requests for dead queue'
162
163 When we tear down a device we try to flush all outstanding
164 commands in scsi_free_queue(). However the check in
165 scsi_request_fn() is imperfect as it only signals that
166 we _might start_ aborting commands, not that we've actually
167 aborted some.
168 So move the printk inside the scsi_kill_request function,
169 this will also give us a hint about which commands are aborted.
170
171 Signed-off-by: Hannes Reinecke <hare@suse.de>
172 Signed-off-by: James Bottomley <JBottomley@Parallels.com>
173
174diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
175index 06bc265..f85cfa6 100644
176--- a/drivers/scsi/scsi_lib.c
177+++ b/drivers/scsi/scsi_lib.c
178@@ -1409,6 +1409,8 @@ static void scsi_kill_request(struct request *req, struct request_queue *q)
179
180 blk_start_request(req);
181
182+ scmd_printk(KERN_INFO, cmd, "killing request\n");
183+
184 sdev = cmd->device;
185 starget = scsi_target(sdev);
186 shost = sdev->host;
187@@ -1490,7 +1492,6 @@ static void scsi_request_fn(struct request_queue *q)
188 struct request *req;
189
190 if (!sdev) {
191- printk("scsi: killing requests for dead queue\n");
192 while ((req = blk_peek_request(q)) != NULL)
193 scsi_kill_request(req, q);
194 return;
b508a2a9
AM
195>From 4467601416e23740fc940c31b1fffacbcb69b4a0 Mon Sep 17 00:00:00 2001
196From: Corey Minyard <cminyard@mvista.com>
197Date: Mon, 21 Nov 2011 14:26:20 -0600
198Subject: [PATCH] ipmi_watchdog: Restore settings when BMC reset
199
200If the BMC gets reset, it will return 0x80 response errors. In this case,
201it is probably a good idea to restore the IPMI settings.
202---
203 drivers/char/ipmi/ipmi_watchdog.c | 41 ++++++++++++++++++++++++++++++++++--
204 1 files changed, 38 insertions(+), 3 deletions(-)
205
206diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c
207index c2917ffa..34767a6 100644
208--- a/drivers/char/ipmi/ipmi_watchdog.c
209+++ b/drivers/char/ipmi/ipmi_watchdog.c
210@@ -139,6 +139,8 @@
211 #define IPMI_WDOG_SET_TIMER 0x24
212 #define IPMI_WDOG_GET_TIMER 0x25
213
214+#define IPMI_WDOG_TIMER_NOT_INIT_RESP 0x80
215+
216 /* These are here until the real ones get into the watchdog.h interface. */
217 #ifndef WDIOC_GETTIMEOUT
218 #define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int)
219@@ -596,6 +598,7 @@ static int ipmi_heartbeat(void)
220 struct kernel_ipmi_msg msg;
221 int rv;
222 struct ipmi_system_interface_addr addr;
223+ int timeout_retries = 0;
224
225 if (ipmi_ignore_heartbeat)
226 return 0;
227@@ -616,6 +619,7 @@ static int ipmi_heartbeat(void)
228
229 mutex_lock(&heartbeat_lock);
230
231+restart:
232 atomic_set(&heartbeat_tofree, 2);
233
234 /*
235@@ -653,7 +657,33 @@ static int ipmi_heartbeat(void)
236 /* Wait for the heartbeat to be sent. */
237 wait_for_completion(&heartbeat_wait);
238
239- if (heartbeat_recv_msg.msg.data[0] != 0) {
240+ if (heartbeat_recv_msg.msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) {
241+ timeout_retries++;
242+ if (timeout_retries > 3) {
243+ printk(KERN_ERR PFX ": Unable to restore the IPMI"
244+ " watchdog's settings, giving up.\n");
245+ rv = -EIO;
246+ goto out_unlock;
247+ }
248+
249+ /*
250+ * The timer was not initialized, that means the BMC was
251+ * probably reset and lost the watchdog information. Attempt
252+ * to restore the timer's info. Note that we still hold
253+ * the heartbeat lock, to keep a heartbeat from happening
254+ * in this process, so must say no heartbeat to avoid a
255+ * deadlock on this mutex.
256+ */
257+ rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
258+ if (rv) {
259+ printk(KERN_ERR PFX ": Unable to send the command to"
260+ " set the watchdog's settings, giving up.\n");
261+ goto out_unlock;
262+ }
263+
264+ /* We might need a new heartbeat, so do it now */
265+ goto restart;
266+ } else if (heartbeat_recv_msg.msg.data[0] != 0) {
267 /*
268 * Got an error in the heartbeat response. It was already
269 * reported in ipmi_wdog_msg_handler, but we should return
270@@ -662,6 +692,7 @@ static int ipmi_heartbeat(void)
271 rv = -EINVAL;
272 }
273
274+out_unlock:
275 mutex_unlock(&heartbeat_lock);
276
277 return rv;
278@@ -922,11 +953,15 @@ static struct miscdevice ipmi_wdog_miscdev = {
279 static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg,
280 void *handler_data)
281 {
282- if (msg->msg.data[0] != 0) {
283+ if (msg->msg.cmd == IPMI_WDOG_RESET_TIMER &&
284+ msg->msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP)
285+ printk(KERN_INFO PFX "response: The IPMI controller appears"
286+ " to have been reset, will attempt to reinitialize"
287+ " the watchdog timer\n");
288+ else if (msg->msg.data[0] != 0)
289 printk(KERN_ERR PFX "response: Error %x on cmd %x\n",
290 msg->msg.data[0],
291 msg->msg.cmd);
292- }
293
294 ipmi_free_recv_msg(msg);
295 }
296--
2971.7.4.1
298
This page took 0.059545 seconds and 4 git commands to generate.