Comment 55 for bug 157691

Revision history for this message
Bjorn Helgaas (bjorn-helgaas) wrote : Re: [Bug 157691] Re: Hardy/Gutsy crashes when the lid is closed on a HP 6710b, HP 6510b and HP 2510p

On Monday 10 August 2009 11:52:32 am RayH wrote:
> The patch didn't apply properly automatically: it was rejected because
> the context was incorrect. I've tried adding it manually by using vi.
> We'll see what happens when I recompile the kernel but I'm not so
> hopeful.

Yep, that context changed a bit since 2.6.24. I can't really read
the old-style diffs (try "diff -u" for a newer, more readable
format), but I think you did it right. Let me know what happens.

> Here's the diff I ended up with: osl.c is the linux kernel src for
> Ubuntu as of 2.6.24-24 osl.c.new is what I created manually after
> applying your proposed patch.
>
> diff osl.c osl.c.new
> 183c183
> < acpi_status acpi_os_initialize1(void)
> ---
> > static void bind_to_cpu0(struct work_struct *work)
> 185,197c185,215
> < /*
> < * Initialize PCI configuration space access, as we'll need to access
> < * it while walking the namespace (bus 0 and root bridges w/ _BBNs).
> < */
> < if (!raw_pci_ops) {
> < printk(KERN_ERR PREFIX
> < "Access to PCI configuration space unavailable\n");
> < return AE_NULL_ENTRY;
> < }
> < kacpid_wq = create_singlethread_workqueue("kacpid");
> < kacpi_notify_wq = create_singlethread_workqueue("kacpi_notify");
> < BUG_ON(!kacpid_wq);
> < BUG_ON(!kacpi_notify_wq);
> ---
> > set_cpus_allowed(current, cpumask_of_cpu(0));
> > kfree(work);
> > }
> >
> > static void bind_workqueue(struct workqueue_struct *wq)
> > {
> > struct work_struct *work;
> >
> > work = kzalloc(sizeof(struct work_struct), GFP_KERNEL);
> > INIT_WORK(work, bind_to_cpu0);
> > queue_work(wq, work);
> > }
> >
> > acpi_status acpi_os_initialize1(void)
> > {
> > /*
> > * On some machines, a software-initiated SMI causes corruption unless
> > * the SMI runs on CPU 0. An SMI can be initiated by any AML, but
> > * typically it's done in GPE-related methods that are run via
> > * workqueues, so we can avoid the known corruption cases by binding
> > * the workqueues to CPU 0.
> > */
> > kacpid_wq = create_singlethread_workqueue("kacpid");
> > bind_workqueue(kacpid_wq);
> > kacpi_notify_wq = create_singlethread_workqueue("kacpi_notify");
> > bind_workqueue(kacpi_notify_wq);
> > kacpi_hotplug_wq = create_singlethread_workqueue("kacpi_hotplug");
> > bind_workqueue(kacpi_hotplug_wq);
> > BUG_ON(!kacpid_wq);
> > BUG_ON(!kacpi_notify_wq);
> > BUG_ON(!kacpi_hotplug_wq);
>