this stuff again if you're not fully convinced about it; the above links could suggest this is only a Ubuntu issue, but it's not (I'm using Fedora for example).
I don't really like to say I "solved" the problem as I see the following as a workaround, but it actually works good. I just followed what I could find here and here. So, here is what you should do if you see that something is taking up too much CPU.
$ uname -a Linux pc-lillo 3.8.11-100.fc17.x86_64 #1 SMP Wed May 1 19:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Make sure the offender is indeed a kworker process. Use top, or ps aux | grep kworker if you prefer.
Find out the gpe (general purpose event) that is causing all of this:
Normally you should get a list of this kind:
$ grep . -r /sys/firmware/acpi/interrupts
You should see a gpe with a very high value. In my case the value of gpe1B was 162, which is ok; gpe06 had instead a value of (approximately) 170.000. This is definitely NOT ok: that's the proof the problem is with ACPI interrupts.
/sys/firmware/acpi/interrupts/sci: 162 /sys/firmware/acpi/interrupts/error: 0 /sys/firmware/acpi/interrupts/gpe00: 0 invalid /sys/firmware/acpi/interrupts/gpe01: 0 invalid /sys/firmware/acpi/interrupts/gpe02: 0 disabled /sys/firmware/acpi/interrupts/gpe03: 0 enabled /sys/firmware/acpi/interrupts/gpe04: 0 disabled ........ /sys/firmware/acpi/interrupts/gpe_all: 162 /sys/firmware/acpi/interrupts/ff_gbl_lock: 0 enabled /sys/firmware/acpi/interrupts/ff_pwr_btn: 0 enabled /sys/firmware/acpi/interrupts/ff_slp_btn: 0 invalid
Let's say the offender gpe is called gpe[XX] (replace the "[XX]" accordingly). Now:
Note that some commands will be executed even without administrator rights, but the trick will not work (or at least not completely). So it's good to keep the admin rights until the end.
$ su Password: # cp /sys/firmware/acpi/interrupts/gpe[XX] /pathtobackup
Now we should schedule a task through crontab. Such task should disable the offender gpe, and it must be performed every startup or reboot. To open crontab with vi:
If you want to use another editor (e.g., gedit), just specify it:
# crontab -e
Add the following line to the crontab file:
# env EDITOR=gedit crontab -e
@reboot echo "disable" > /sys/firmware/acpi/interrupts/gpe[XX]
To make it work even after suspend (optional):
Copy this script in 30_disable_gpe[XX]:
# touch /etc/pm/sleep.d/30_disable_gpe[XX] # chmod +x /etc/pm/sleep.d/30_disable_gpe[XX] # gedit /etc/pm/sleep.d/30_disable_gpe[XX]
Save, close, and we're done. Sweet.
#!/bin/bash case "$1" in thaw|resume) echo disable > /sys/firmware/acpi/interrupts/gpe[XX] 2>/dev/null ;; *) ;; esac exit $?
Note: no luck with the cron job? Have a look at Myk's comments below...