---------------------------
What: raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN
- When: November 2006
- Why: Deprecated in favour of the new ioctl-based rawiso interface, which is
- more efficient. You should really be using libraw1394 for raw1394
- access anyway.
- Who: Jody McIntyre <scjody@modernduck.com>
+ When: June 2007
+ Why: Deprecated in favour of the more efficient and robust rawiso interface.
+ Affected are applications which use the deprecated part of libraw1394
+ (raw1394_iso_write, raw1394_start_iso_write, raw1394_start_iso_rcv,
+ raw1394_stop_iso_rcv) or bypass libraw1394.
+ Who: Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de>
+
+ ---------------------------
+
+ What: dv1394 driver (CONFIG_IEEE1394_DV1394)
+ When: June 2007
+ Why: Replaced by raw1394 + userspace libraries, notably libiec61883. This
+ shift of application support has been indicated on www.linux1394.org
+ and developers' mailinglists for quite some time. Major applications
+ have been converted, with the exception of ffmpeg and hence xine.
+ Piped output of dvgrab2 is a partial equivalent to dv1394.
+ Who: Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de>
+
+ ---------------------------
+
+ What: ieee1394 core's unused exports (CONFIG_IEEE1394_EXPORT_FULL_API)
+ When: January 2007
+ Why: There are no projects known to use these exported symbols, except
+ dfg1394 (uses one symbol whose functionality is core-internal now).
+ Who: Stefan Richter <stefanr@s5r6.in-berlin.de>
+
+ ---------------------------
+
+ What: ieee1394's *_oui sysfs attributes (CONFIG_IEEE1394_OUI_DB)
+ When: January 2007
+ Files: drivers/ieee1394/: oui.db, oui2c.sh
+ Why: big size, little value
+ Who: Stefan Richter <stefanr@s5r6.in-berlin.de>
---------------------------
---------------------------
- What: sys_sysctl
- When: January 2007
- Why: The same information is available through /proc/sys and that is the
- interface user space prefers to use. And there do not appear to be
- any existing user in user space of sys_sysctl. The additional
- maintenance overhead of keeping a set of binary names gets
- in the way of doing a good job of maintaining this interface.
-
- Who: Eric Biederman <ebiederm@xmission.com>
-
- ---------------------------
-
What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
When: November 2005
Files: drivers/pcmcia/: pcmcia_ioctl.c
---------------------------
- What: ip_queue and ip6_queue (old ipv4-only and ipv6-only netfilter queue)
- When: December 2005
- Why: This interface has been obsoleted by the new layer3-independent
- "nfnetlink_queue". The Kernel interface is compatible, so the old
- ip[6]tables "QUEUE" targets still work and will transparently handle
- all packets into nfnetlink queue number 0. Userspace users will have
- to link against API-compatible library on top of libnfnetlink_queue
- instead of the current 'libipq'.
- Who: Harald Welte <laforge@netfilter.org>
-
- ---------------------------
-
What: remove EXPORT_SYMBOL(kernel_thread)
When: August 2006
Files: arch/*/kernel/*_ksyms.c
---------------------------
- What: i2c-ite and i2c-algo-ite drivers
- When: September 2006
- Why: These drivers never compiled since they were added to the kernel
- tree 5 years ago. This feature removal can be reevaluated if
- someone shows interest in the drivers, fixes them and takes over
- maintenance.
- http://marc.theaimsgroup.com/?l=linux-mips&m=115040510817448
- Who: Jean Delvare <khali@linux-fr.org>
-
- ---------------------------
-
What: Bridge netfilter deferred IPv4/IPv6 output hook calling
When: January 2007
Why: The deferred output hooks are a layering violation causing unusual
---------------------------
- What: frame diverter
- When: November 2006
- Why: The frame diverter is included in most distribution kernels, but is
- broken. It does not correctly handle many things:
- - IPV6
- - non-linear skb's
- - network device RCU on removal
- - input frames not correctly checked for protocol errors
- It also adds allocation overhead even if not enabled.
- It is not clear if anyone is still using it.
- Who: Stephen Hemminger <shemminger@osdl.org>
-
- ---------------------------
-
-
What: PHYSDEVPATH, PHYSDEVBUS, PHYSDEVDRIVER in the uevent environment
- When: Oktober 2008
+ When: October 2008
Why: The stacking of class devices makes these values misleading and
inconsistent.
Class devices should not carry any of these properties, and bus
---------------------------
- What: ftape
- When: 2.6.20
- Why: Orphaned for ages. SMP bugs long unfixed. Few users left
- in the world.
- Who: Jeff Garzik <jeff@garzik.org>
+ What: IPv4 only connection tracking/NAT/helpers
+ When: 2.6.22
+ Why: The new layer 3 independant connection tracking replaces the old
+ IPv4 only version. After some stabilization of the new code the
+ old one will be removed.
+ Who: Patrick McHardy <kaber@trash.net>
---------------------------
+
+What: ACPI hooks (X86_SPEEDSTEP_CENTRINO_ACPI) in speedstep-centrino driver
+When: December 2006
+Why: Speedstep-centrino driver with ACPI hooks and acpi-cpufreq driver are
+ functionally very much similar. They talk to ACPI in same way. Only
+ difference between them is the way they do frequency transitions.
+ One uses MSRs and the other one uses IO ports. Functionaliy of
+ speedstep_centrino with ACPI hooks is now merged into acpi-cpufreq.
+ That means one common driver will support all Intel Enhanced Speedstep
+ capable CPUs. That means less confusion over name of
+ speedstep-centrino driver (with that driver supposed to be used on
+ non-centrino platforms). That means less duplication of code and
+ less maintenance effort and no possibility of these two drivers
+ going out of sync.
+ Current users of speedstep_centrino with ACPI hooks are requested to
+ switch over to acpi-cpufreq driver. speedstep-centrino will continue
+ to work using older non-ACPI static table based scheme even after this
+ date.
+
+Who: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
+
+---------------------------
S: Maintained
9P FILE SYSTEM
- P: Eric Van Hensbergen
- M: ericvh@gmail.com
- P: Ron Minnich
- M: rminnich@lanl.gov
- P: Latchesar Ionkov
- M: lucho@ionkov.net
- L: v9fs-developer@lists.sourceforge.net
- W: http://v9fs.sf.net
- T: git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git
- S: Maintained
+ P: Eric Van Hensbergen
+ M: ericvh@gmail.com
+ P: Ron Minnich
+ M: rminnich@lanl.gov
+ P: Latchesar Ionkov
+ M: lucho@ionkov.net
+ L: v9fs-developer@lists.sourceforge.net
+ W: http://v9fs.sf.net
+ T: git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git
+ S: Maintained
A2232 SERIAL BOARD DRIVER
P: Enver Haase
S: Maintained for 2.4; PCI support for 2.6.
AMD GEODE PROCESSOR/CHIPSET SUPPORT
- P: Jordan Crouse
- M: info-linux@geode.amd.com
+ P: Jordan Crouse
+ M: info-linux@geode.amd.com
L: info-linux@geode.amd.com
W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html
S: Supported
M: spyro@f2s.com
S: Maintained
+ ARM/ATMEL AT91RM9200 ARM ARCHITECTURE
+ P: Andrew Victor
+ M: andrew@sanpeople.com
+ L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
+ W: http://maxim.org.za/at91_26.html
+ S: Maintained
+
ARM/CORGI MACHINE SUPPORT
P: Richard Purdie
M: rpurdie@rpsys.net
S: Maintained
+ ARM/HP JORNADA 7XX MACHINE SUPPORT
+ P: Kristoffer Ericson
+ M: kristoffer_e1@hotmail.com
+ W: www.jlime.com
+ S: Maintained
+
ARM/TOSA MACHINE SUPPORT
P: Dirk Opfer
M: dirk@opfer-online.de
W: http://linux-atm.sourceforge.net
S: Maintained
+ ATMEL MACB ETHERNET DRIVER
+ P: Atmel AVR32 Support Team
+ M: avr32@atmel.com
+ P: Haavard Skinnemoen
+ M: hskinnemoen@atmel.com
+ S: Supported
+
ATMEL WIRELESS DRIVER
P: Simon Kelley
M: simon@thekelleys.org.uk
BFS FILE SYSTEM
P: Tigran A. Aivazian
- M: tigran@veritas.com
+ M: tigran@aivazian.fsnet.co.uk
L: linux-kernel@vger.kernel.org
S: Maintained
S: Maintained
BONDING DRIVER
- P: Chad Tindel
- M: ctindel@users.sourceforge.net
- P: Jay Vosburgh
- M: fubar@us.ibm.com
- L: bonding-devel@lists.sourceforge.net
- W: http://sourceforge.net/projects/bonding/
- S: Supported
+ P: Chad Tindel
+ M: ctindel@users.sourceforge.net
+ P: Jay Vosburgh
+ M: fubar@us.ibm.com
+ L: bonding-devel@lists.sourceforge.net
+ W: http://sourceforge.net/projects/bonding/
+ S: Supported
BROADBAND PROCESSOR ARCHITECTURE
P: Arnd Bergmann
CIRRUS LOGIC GENERIC FBDEV DRIVER
P: Jeff Garzik
M: jgarzik@pobox.com
- L: linux-fbdev-devel@lists.sourceforge.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
S: Odd Fixes
CIRRUS LOGIC CS4280/CS461x SOUNDDRIVER
M: davej@codemonkey.org.uk
L: cpufreq@lists.linux.org.uk
W: http://www.codemonkey.org.uk/projects/cpufreq/
-T: git kernel.org/pub/scm/linux/kernel/davej/cpufreq.git
+T: git kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git
S: Maintained
CPUID/MSR DRIVER
S: Supported
CRAMFS FILESYSTEM
- W: http://sourceforge.net/projects/cramfs/
- S: Orphan
+ W: http://sourceforge.net/projects/cramfs/
+ S: Orphan
CRIS PORT
P: Mikael Starvik
CYBLAFB FRAMEBUFFER DRIVER
P: Knut Petersen
M: Knut_Petersen@t-online.de
- L: linux-fbdev-devel@lists.sourceforge.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
S: Maintained
CYCLADES 2X SYNC CARD DRIVER
S: Maintained
EMULEX LPFC FC SCSI DRIVER
- P: James Smart
- M: james.smart@emulex.com
- L: linux-scsi@vger.kernel.org
- W: http://sourceforge.net/projects/lpfcxxxx
- S: Supported
+ P: James Smart
+ M: james.smart@emulex.com
+ L: linux-scsi@vger.kernel.org
+ W: http://sourceforge.net/projects/lpfcxxxx
+ S: Supported
EPSON 1355 FRAMEBUFFER DRIVER
P: Christopher Hoover
S: Maintained
EXT2 FILE SYSTEM
- L: ext2-devel@lists.sourceforge.net
+ L: linux-ext4@vger.kernel.org
S: Maintained
EXT3 FILE SYSTEM
P: Stephen Tweedie, Andrew Morton
M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
- L: ext2-devel@lists.sourceforge.net
+ L: linux-ext4@vger.kernel.org
+ S: Maintained
+
+ EXT4 FILE SYSTEM
+ P: Stephen Tweedie, Andrew Morton
+ M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
+ L: linux-ext4@vger.kernel.org
S: Maintained
F71805F HARDWARE MONITORING DRIVER
FRAMEBUFFER LAYER
P: Antonino Daplas
M: adaplas@pol.net
- L: linux-fbdev-devel@lists.sourceforge.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
W: http://linux-fbdev.sourceforge.net/
S: Maintained
M: dhowells@redhat.com
S: Maintained
- FTAPE/QIC-117
- L: linux-tape@vger.kernel.org
- W: http://sourceforge.net/projects/ftape
- S: Orphan
-
FUSE: FILESYSTEM IN USERSPACE
P: Miklos Szeredi
M: miklos@szeredi.hu
P: Jean Delvare
M: khali@linux-fr.org
L: lm-sensors@lm-sensors.org
- W: http://www.lm-sensors.nu/
+ W: http://www.lm-sensors.org/
+ T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-hwmon/
S: Maintained
HARDWARE RANDOM NUMBER GENERATOR CORE
P: Jean Delvare
M: khali@linux-fr.org
L: i2c@lm-sensors.org
- W: http://www.lm-sensors.nu/
- T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
+ T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
S: Maintained
I2O
IMS TWINTURBO FRAMEBUFFER DRIVER
P: Paul Mundt
M: lethal@chaoticdreams.org
- L: linux-fbdev-devel@lists.sourceforge.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
S: Maintained
INFINIBAND SUBSYSTEM
S: Maintained
INTEL FRAMEBUFFER DRIVER (excluding 810 and 815)
- P: Sylvain Meyer
- M: sylvain.meyer@worldonline.fr
- L: linux-fbdev-devel@lists.sourceforge.net
- S: Maintained
+ P: Sylvain Meyer
+ M: sylvain.meyer@worldonline.fr
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
+ S: Maintained
INTEL 810/815 FRAMEBUFFER DRIVER
- P: Antonino Daplas
- M: adaplas@pol.net
- L: linux-fbdev-devel@lists.sourceforge.net
- S: Maintained
+ P: Antonino Daplas
+ M: adaplas@pol.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
+ S: Maintained
INTEL APIC/IOAPIC, LOWLEVEL X86 SMP SUPPORT
P: Ingo Molnar
INTEL IA32 MICROCODE UPDATE SUPPORT
P: Tigran Aivazian
- M: tigran@veritas.com
+ M: tigran@aivazian.fsnet.co.uk
S: Maintained
INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
JOURNALLING LAYER FOR BLOCK DEVICES (JBD)
P: Stephen Tweedie, Andrew Morton
M: sct@redhat.com, akpm@osdl.org
- L: ext2-devel@lists.sourceforge.net
+ L: linux-ext4@vger.kernel.org
+ S: Maintained
+
+ K8TEMP HARDWARE MONITORING DRIVER
+ P: Rudolf Marek
+ M: r.marek@assembler.cz
+ L: lm-sensors@lm-sensors.org
S: Maintained
KCONFIG
S: Maintained
LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
- P: Kumar Gala
- M: galak@kernel.crashing.org
- W: http://www.penguinppc.org/
- L: linuxppc-embedded@ozlabs.org
- S: Maintained
+ P: Kumar Gala
+ M: galak@kernel.crashing.org
+ W: http://www.penguinppc.org/
+ L: linuxppc-embedded@ozlabs.org
+ S: Maintained
LINUX FOR POWERPC PA SEMI PWRFICIENT
P: Olof Johansson
S: Supported
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
- P: Michael Kerrisk
- M: mtk-manpages@gmx.net
- W: ftp://ftp.kernel.org/pub/linux/docs/manpages
- S: Maintained
+ P: Michael Kerrisk
+ M: mtk-manpages@gmx.net
+ W: ftp://ftp.kernel.org/pub/linux/docs/manpages
+ S: Maintained
MARVELL MV643XX ETHERNET DRIVER
P: Dale Farnsworth
MATROX FRAMEBUFFER DRIVER
P: Petr Vandrovec
M: vandrove@vc.cvut.cz
- L: linux-fbdev-devel@lists.sourceforge.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
S: Maintained
MEGARAID SCSI DRIVERS
- P: Neela Syam Kolli
- M: Neela.Kolli@engenio.com
- S: linux-scsi@vger.kernel.org
- W: http://megaraid.lsilogic.com
- S: Maintained
+ P: Neela Syam Kolli
+ M: Neela.Kolli@engenio.com
+ S: linux-scsi@vger.kernel.org
+ W: http://megaraid.lsilogic.com
+ S: Maintained
MEMORY MANAGEMENT
L: linux-mm@kvack.org
L: linux-kernel@vger.kernel.org
S: Maintained
+ MOXA SMARTIO/INDUSTIO SERIAL CARD (MXSER 2.0)
+ P: Jiri Slaby
+ M: jirislaby@gmail.com
+ L: linux-kernel@vger.kernel.org
+ S: Maintained
+
MSI LAPTOP SUPPORT
P: Lennart Poettering
M: mzxreary@0pointer.de
W: http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html
S: Maintained
- MULTIMEDIA CARD (MMC) SUBSYSTEM
- S: Orphan
+ MULTIMEDIA CARD (MMC) AND SECURE DIGITAL (SD) SUBSYSTEM
+ P: Pierre Ossman
+ M: drzeus-mmc@drzeus.cx
+ L: linux-kernel@vger.kernel.org
+ S: Maintained
MULTISOUND SOUND DRIVER
P: Andrew Veliath
M: andrewtv@usa.net
S: Maintained
+ MULTITECH MULTIPORT CARD (ISICOM)
+ P: Jiri Slaby
+ M: jirislaby@gmail.com
+ L: linux-kernel@vger.kernel.org
+ S: Maintained
+
NATSEMI ETHERNET DRIVER (DP8381x)
P: Tim Hockin
M: thockin@hockin.org
P: James Morris
P: Harald Welte
P: Jozsef Kadlecsik
- M: coreteam@netfilter.org
+ P: Patrick McHardy
+ M: kaber@trash.net
+ L: netfilter-devel@lists.netfilter.org
+ L: netfilter@lists.netfilter.org
+ L: coreteam@netfilter.org
W: http://www.netfilter.org/
W: http://www.iptables.org/
- L: netfilter@lists.netfilter.org
- L: netfilter-devel@lists.netfilter.org
S: Supported
NETLABEL
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
S: Maintained
+ NETXEN (1/10) GbE SUPPORT
+ P: Amit S. Kale
+ M: amitkale@netxen.com
+ L: netdev@vger.kernel.org
+ W: http://www.netxen.com
+ S: Supported
+
IPVS
P: Wensong Zhang
M: wensong@linux-vs.org
S: Maintained
NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER
- P: Antonino Daplas
- M: adaplas@pol.net
- L: linux-fbdev-devel@lists.sourceforge.net
- S: Maintained
+ P: Antonino Daplas
+ M: adaplas@pol.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
+ S: Maintained
OPENCORES I2C BUS DRIVER
P: Peter Korsgaard
S: Supported
PCI HOTPLUG CORE
- P: Greg Kroah-Hartman
- M: gregkh@suse.de
+ P: Kristen Carlson Accardi
+ M: kristen.c.accardi@intel.com
S: Supported
PCI HOTPLUG COMPAQ DRIVER
W: http://www.pnd-pc.demon.co.uk/promise/
S: Maintained
+ PS3 PLATFORM SUPPORT
+ P: Geoff Levand
+ M: geoffrey.levand@am.sony.com
+ L: linuxppc-dev@ozlabs.org
+ L: cbe-oss-dev@ozlabs.org
+ S: Supported
+
PVRUSB2 VIDEO4LINUX DRIVER
P: Mike Isely
M: isely@pobox.com
RADEON FRAMEBUFFER DISPLAY DRIVER
P: Benjamin Herrenschmidt
M: benh@kernel.crashing.org
- L: linux-fbdev-devel@lists.sourceforge.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
S: Maintained
RAGE128 FRAMEBUFFER DISPLAY DRIVER
P: Paul Mackerras
M: paulus@samba.org
- L: linux-fbdev-devel@lists.sourceforge.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
S: Maintained
RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER
REAL TIME CLOCK (RTC) SUBSYSTEM
P: Alessandro Zummo
M: a.zummo@towertech.it
- L: linux-kernel@vger.kernel.org
+ L: rtc-linux@googlegroups.com
S: Maintained
REISERFS FILE SYSTEM
S: Orphan
S3 SAVAGE FRAMEBUFFER DRIVER
- P: Antonino Daplas
- M: adaplas@pol.net
- L: linux-fbdev-devel@lists.sourceforge.net
- S: Maintained
+ P: Antonino Daplas
+ M: adaplas@pol.net
+ L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
+ S: Maintained
S390
P: Martin Schwidefsky
S: Maintained
SCTP PROTOCOL
- P: Sridhar Samudrala
- M: sri@us.ibm.com
- L: lksctp-developers@lists.sourceforge.net
- S: Supported
+ P: Sridhar Samudrala
+ M: sri@us.ibm.com
+ L: lksctp-developers@lists.sourceforge.net
+ S: Supported
SCx200 CPU SUPPORT
P: Jim Cromie
S: Maintained
Telecom Clock Driver for MCPL0010
- P: Mark Gross
- M: mark.gross@intel.com
- S: Supported
+ P: Mark Gross
+ M: mark.gross@intel.com
+ S: Supported
TENSILICA XTENSA PORT (xtensa):
P: Chris Zankel
SUN3/3X
P: Sam Creasey
M: sammy@sammy.net
- L: sun3-list@redhat.com
W: http://sammy.net/sun3/
S: Maintained
S: Maintained
TI PARALLEL LINK CABLE DRIVER
- P: Romain Lievin
- M: roms@lpg.ticalc.org
- S: Maintained
+ P: Romain Lievin
+ M: roms@lpg.ticalc.org
+ S: Maintained
TIPC NETWORK LAYER
P: Per Liden
S: Maintained
TRIVIAL PATCHES
- P: Adrian Bunk
- M: trivial@kernel.org
- L: linux-kernel@vger.kernel.org
- W: http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
- T: git kernel.org:/pub/scm/linux/kernel/git/bunk/trivial.git
- S: Maintained
+ P: Adrian Bunk
+ M: trivial@kernel.org
+ L: linux-kernel@vger.kernel.org
+ W: http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
+ T: git kernel.org:/pub/scm/linux/kernel/git/bunk/trivial.git
+ S: Maintained
TMS380 TOKEN-RING NETWORK DRIVER
P: Adam Fritzler
W: http://www.linux-projects.org
S: Maintained
+ USB GADGET/PERIPHERAL SUBSYSTEM
+ P: David Brownell
+ M: dbrownell@users.sourceforge.net
+ L: linux-usb-devel@lists.sourceforge.net
+ W: http://www.linux-usb.org/gadget
+ S: Maintained
+
USB HID/HIDBP DRIVERS
P: Vojtech Pavlik
M: vojtech@suse.cz
L: linux-usb-devel@lists.sourceforge.net
S: Maintained
- USB "USBNET" DRIVER
+ USB "USBNET" DRIVER FRAMEWORK
P: David Brownell
M: dbrownell@users.sourceforge.net
L: linux-usb-devel@lists.sourceforge.net
+ W: http://www.linux-usb.org/usbnet
S: Maintained
USB W996[87]CF DRIVER
T: git git://oss.sgi.com:8090/xfs/xfs-2.6
S: Supported
+ XILINX UARTLITE SERIAL DRIVER
+ P: Peter Korsgaard
+ M: jacmet@sunsite.dk
+ L: linux-serial@vger.kernel.org
+ S: Maintained
+
X86 3-LEVEL PAGING (PAE) SUPPORT
P: Ingo Molnar
M: mingo@redhat.com
#include <linux/completion.h>
#include <linux/mutex.h>
-#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, "cpufreq-core", msg)
+#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, \
+ "cpufreq-core", msg)
/**
* The "cpufreq driver" - the arch- or hardware-dependent low
static DEFINE_SPINLOCK(cpufreq_driver_lock);
/* internal prototypes */
- static int __cpufreq_governor(struct cpufreq_policy *policy,
- unsigned int event);
- static void handle_update(void *data);
+ static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event);
+ static void handle_update(struct work_struct *work);
/**
* Two notifier lists: the "policy" list is involved in the
srcu_init_notifier_head(&cpufreq_transition_notifier_list);
return 0;
}
- core_initcall(init_cpufreq_transition_notifier_list);
+ pure_initcall(init_cpufreq_transition_notifier_list);
static LIST_HEAD(cpufreq_governor_list);
static DEFINE_MUTEX (cpufreq_governor_mutex);
spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
}
-void cpufreq_debug_printk(unsigned int type, const char *prefix, const char *fmt, ...)
+void cpufreq_debug_printk(unsigned int type, const char *prefix,
+ const char *fmt, ...)
{
char s[256];
va_list args;
WARN_ON(!prefix);
if (type & debug) {
spin_lock_irqsave(&disable_ratelimit_lock, flags);
- if (!disable_ratelimit && debug_ratelimit && !printk_ratelimit()) {
+ if (!disable_ratelimit && debug_ratelimit
+ && !printk_ratelimit()) {
spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
return;
}
module_param(debug, uint, 0644);
-MODULE_PARM_DESC(debug, "CPUfreq debugging: add 1 to debug core, 2 to debug drivers, and 4 to debug governors.");
+MODULE_PARM_DESC(debug, "CPUfreq debugging: add 1 to debug core,"
+ " 2 to debug drivers, and 4 to debug governors.");
module_param(debug_ratelimit, uint, 0644);
-MODULE_PARM_DESC(debug_ratelimit, "CPUfreq debugging: set to 0 to disable ratelimiting.");
+MODULE_PARM_DESC(debug_ratelimit, "CPUfreq debugging:"
+ " set to 0 to disable ratelimiting.");
#else /* !CONFIG_CPU_FREQ_DEBUG */
if (!l_p_j_ref_freq) {
l_p_j_ref = loops_per_jiffy;
l_p_j_ref_freq = ci->old;
- dprintk("saving %lu as reference value for loops_per_jiffy; freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
+ dprintk("saving %lu as reference value for loops_per_jiffy;"
+ "freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
}
if ((val == CPUFREQ_PRECHANGE && ci->old < ci->new) ||
(val == CPUFREQ_POSTCHANGE && ci->old > ci->new) ||
(val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
- loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq, ci->new);
- dprintk("scaling loops_per_jiffy to %lu for frequency %u kHz\n", loops_per_jiffy, ci->new);
+ loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
+ ci->new);
+ dprintk("scaling loops_per_jiffy to %lu"
+ "for frequency %u kHz\n", loops_per_jiffy, ci->new);
}
}
#else
-static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci) { return; }
+static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
+{
+ return;
+}
#endif
if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
*policy = CPUFREQ_POLICY_PERFORMANCE;
err = 0;
- } else if (!strnicmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) {
+ } else if (!strnicmp(str_governor, "powersave",
+ CPUFREQ_NAME_LEN)) {
*policy = CPUFREQ_POLICY_POWERSAVE;
err = 0;
}
t = __find_governor(str_governor);
if (t == NULL) {
- char *name = kasprintf(GFP_KERNEL, "cpufreq_%s", str_governor);
+ char *name = kasprintf(GFP_KERNEL, "cpufreq_%s",
+ str_governor);
if (name) {
int ret;
/**
- * cpufreq_per_cpu_attr_read() / show_##file_name() - print out cpufreq information
+ * cpufreq_per_cpu_attr_read() / show_##file_name() -
+ * print out cpufreq information
*
* Write out information from cpufreq_driver->policy[cpu]; object must be
* "unsigned int".
show_one(scaling_max_freq, max);
show_one(scaling_cur_freq, cur);
-static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy);
+static int __cpufreq_set_policy(struct cpufreq_policy *data,
+ struct cpufreq_policy *policy);
/**
* cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
/**
* show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
*/
-static ssize_t show_cpuinfo_cur_freq (struct cpufreq_policy * policy, char *buf)
+static ssize_t show_cpuinfo_cur_freq (struct cpufreq_policy * policy,
+ char *buf)
{
unsigned int cur_freq = cpufreq_get(policy->cpu);
if (!cur_freq)
/**
* show_scaling_governor - show the current policy for the specified CPU
*/
-static ssize_t show_scaling_governor (struct cpufreq_policy * policy, char *buf)
+static ssize_t show_scaling_governor (struct cpufreq_policy * policy,
+ char *buf)
{
if(policy->policy == CPUFREQ_POLICY_POWERSAVE)
return sprintf(buf, "powersave\n");
if (ret != 1)
return -EINVAL;
- if (cpufreq_parse_governor(str_governor, &new_policy.policy, &new_policy.governor))
+ if (cpufreq_parse_governor(str_governor, &new_policy.policy,
+ &new_policy.governor))
return -EINVAL;
lock_cpu_hotplug();
unlock_cpu_hotplug();
- return ret ? ret : count;
+ if (ret)
+ return ret;
+ else
+ return count;
}
/**
/**
* show_scaling_available_governors - show the available CPUfreq governors
*/
-static ssize_t show_scaling_available_governors (struct cpufreq_policy * policy,
+static ssize_t show_scaling_available_governors (struct cpufreq_policy *policy,
char *buf)
{
ssize_t i = 0;
policy = cpufreq_cpu_get(policy->cpu);
if (!policy)
return -EINVAL;
- ret = fattr->show ? fattr->show(policy,buf) : -EIO;
+ if (fattr->show)
+ ret = fattr->show(policy, buf);
+ else
+ ret = -EIO;
+
cpufreq_cpu_put(policy);
return ret;
}
policy = cpufreq_cpu_get(policy->cpu);
if (!policy)
return -EINVAL;
- ret = fattr->store ? fattr->store(policy,buf,count) : -EIO;
+ if (fattr->store)
+ ret = fattr->store(policy, buf, count);
+ else
+ ret = -EIO;
+
cpufreq_cpu_put(policy);
return ret;
}
mutex_init(&policy->lock);
mutex_lock(&policy->lock);
init_completion(&policy->kobj_unregister);
- INIT_WORK(&policy->update, handle_update, (void *)(long)cpu);
+ INIT_WORK(&policy->update, handle_update);
/* call driver. From then on the cpufreq must be able
* to accept all calls to ->verify and ->setpolicy for this CPU
}
- static void handle_update(void *data)
+ static void handle_update(struct work_struct *work)
{
- unsigned int cpu = (unsigned int)(long)data;
+ struct cpufreq_policy *policy =
+ container_of(work, struct cpufreq_policy, update);
+ unsigned int cpu = policy->cpu;
dprintk("handle_update for cpu %u called\n", cpu);
cpufreq_update_policy(cpu);
}
* We adjust to current frequency first, and need to clean up later. So either call
* to cpufreq_update_policy() or schedule handle_update()).
*/
-static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq, unsigned int new_freq)
+static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
+ unsigned int new_freq)
{
struct cpufreq_freqs freqs;
unsigned int cpufreq_quick_get(unsigned int cpu)
{
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
- unsigned int ret = 0;
+ unsigned int ret_freq = 0;
if (policy) {
mutex_lock(&policy->lock);
- ret = policy->cur;
+ ret_freq = policy->cur;
mutex_unlock(&policy->lock);
cpufreq_cpu_put(policy);
}
- return (ret);
+ return (ret_freq);
}
EXPORT_SYMBOL(cpufreq_quick_get);
unsigned int cpufreq_get(unsigned int cpu)
{
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
- unsigned int ret = 0;
+ unsigned int ret_freq = 0;
if (!policy)
return 0;
mutex_lock(&policy->lock);
- ret = cpufreq_driver->get(cpu);
+ ret_freq = cpufreq_driver->get(cpu);
- if (ret && policy->cur && !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
- /* verify no discrepancy between actual and saved value exists */
- if (unlikely(ret != policy->cur)) {
- cpufreq_out_of_sync(cpu, policy->cur, ret);
+ if (ret_freq && policy->cur &&
+ !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
+ /* verify no discrepancy between actual and
+ saved value exists */
+ if (unlikely(ret_freq != policy->cur)) {
+ cpufreq_out_of_sync(cpu, policy->cur, ret_freq);
schedule_work(&policy->update);
}
}
out:
cpufreq_cpu_put(policy);
- return (ret);
+ return (ret_freq);
}
EXPORT_SYMBOL(cpufreq_get);
static int cpufreq_suspend(struct sys_device * sysdev, pm_message_t pmsg)
{
int cpu = sysdev->id;
- unsigned int ret = 0;
+ int ret = 0;
unsigned int cur_freq = 0;
struct cpufreq_policy *cpu_policy;
static int cpufreq_resume(struct sys_device * sysdev)
{
int cpu = sysdev->id;
- unsigned int ret = 0;
+ int ret = 0;
struct cpufreq_policy *cpu_policy;
dprintk("resuming cpu %u\n", cpu);
}
EXPORT_SYMBOL_GPL(cpufreq_driver_target);
+int cpufreq_driver_getavg(struct cpufreq_policy *policy)
+{
+ int ret = 0;
+
+ policy = cpufreq_cpu_get(policy->cpu);
+ if (!policy)
+ return -EINVAL;
+
+ mutex_lock(&policy->lock);
+
+ if (cpu_online(policy->cpu) && cpufreq_driver->getavg)
+ ret = cpufreq_driver->getavg(policy->cpu);
+
+ mutex_unlock(&policy->lock);
+
+ cpufreq_cpu_put(policy);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(cpufreq_driver_getavg);
+
/*
* Locking: Must be called with the lock_cpu_hotplug() lock held
* when "event" is CPUFREQ_GOV_LIMITS
*/
-static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
+static int __cpufreq_governor(struct cpufreq_policy *policy,
+ unsigned int event)
{
int ret;
if (!try_module_get(policy->governor->owner))
return -EINVAL;
- dprintk("__cpufreq_governor for CPU %u, event %u\n", policy->cpu, event);
+ dprintk("__cpufreq_governor for CPU %u, event %u\n",
+ policy->cpu, event);
ret = policy->governor->governor(policy, event);
- /* we keep one module reference alive for each CPU governed by this CPU */
+ /* we keep one module reference alive for
+ each CPU governed by this CPU */
if ((event != CPUFREQ_GOV_START) || ret)
module_put(policy->governor->owner);
if ((event == CPUFREQ_GOV_STOP) && !ret)
/*
+ * data : current policy.
+ * policy : policy to be set.
* Locking: Must be called with the lock_cpu_hotplug() lock held
*/
-static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy)
+static int __cpufreq_set_policy(struct cpufreq_policy *data,
+ struct cpufreq_policy *policy)
{
int ret = 0;
dprintk("setting new policy for CPU %u: %u - %u kHz\n", policy->cpu,
policy->min, policy->max);
- memcpy(&policy->cpuinfo, &data->cpuinfo, sizeof(struct cpufreq_cpuinfo));
+ memcpy(&policy->cpuinfo, &data->cpuinfo,
+ sizeof(struct cpufreq_cpuinfo));
if (policy->min > data->min && policy->min > policy->max) {
ret = -EINVAL;
data->min = policy->min;
data->max = policy->max;
- dprintk("new min and max freqs are %u - %u kHz\n", data->min, data->max);
+ dprintk("new min and max freqs are %u - %u kHz\n",
+ data->min, data->max);
if (cpufreq_driver->setpolicy) {
data->policy = policy->policy;
data->governor = policy->governor;
if (__cpufreq_governor(data, CPUFREQ_GOV_START)) {
/* new governor failed, so re-start old one */
- dprintk("starting governor %s failed\n", data->governor->name);
+ dprintk("starting governor %s failed\n",
+ data->governor->name);
if (old_gov) {
data->governor = old_gov;
- __cpufreq_governor(data, CPUFREQ_GOV_START);
+ __cpufreq_governor(data,
+ CPUFREQ_GOV_START);
}
ret = -EINVAL;
goto error_out;
data->cur = policy.cur;
} else {
if (data->cur != policy.cur)
- cpufreq_out_of_sync(cpu, data->cur, policy.cur);
+ cpufreq_out_of_sync(cpu, data->cur,
+ policy.cur);
}
}
}
EXPORT_SYMBOL(cpufreq_update_policy);
- #ifdef CONFIG_HOTPLUG_CPU
static int cpufreq_cpu_callback(struct notifier_block *nfb,
unsigned long action, void *hcpu)
{
{
.notifier_call = cpufreq_cpu_callback,
};
- #endif /* CONFIG_HOTPLUG_CPU */
/*********************************************************************
* REGISTER / UNREGISTER CPUFREQ DRIVER *
/* if all ->init() calls failed, unregister */
if (ret) {
- dprintk("no CPU initialized for driver %s\n", driver_data->name);
- sysdev_driver_unregister(&cpu_sysdev_class, &cpufreq_sysdev_driver);
+ dprintk("no CPU initialized for driver %s\n",
+ driver_data->name);
+ sysdev_driver_unregister(&cpu_sysdev_class,
+ &cpufreq_sysdev_driver);
spin_lock_irqsave(&cpufreq_driver_lock, flags);
cpufreq_driver = NULL;
* latency of the processor. The governor will work on any processor with
* transition latency <= 10mS, using appropriate sampling
* rate.
- * For CPUs with transition latency > 10mS (mostly drivers with CPUFREQ_ETERNAL)
- * this governor will not work.
+ * For CPUs with transition latency > 10mS (mostly drivers
+ * with CPUFREQ_ETERNAL), this governor will not work.
* All times here are in uS.
*/
static unsigned int def_sampling_rate;
#define MIN_SAMPLING_RATE_RATIO (2)
/* for correct statistics, we need at least 10 ticks between each measure */
-#define MIN_STAT_SAMPLING_RATE (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
-#define MIN_SAMPLING_RATE (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
+#define MIN_STAT_SAMPLING_RATE \
+ (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
+#define MIN_SAMPLING_RATE \
+ (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
#define DEF_SAMPLING_DOWN_FACTOR (1)
#define MAX_SAMPLING_DOWN_FACTOR (10)
#define TRANSITION_LATENCY_LIMIT (10 * 1000)
- static void do_dbs_timer(void *data);
+ static void do_dbs_timer(struct work_struct *work);
struct cpu_dbs_info_s {
struct cpufreq_policy *cur_policy;
* is recursive for the same process. -Venki
*/
static DEFINE_MUTEX (dbs_mutex);
- static DECLARE_WORK (dbs_work, do_dbs_timer, NULL);
+ static DECLARE_DELAYED_WORK(dbs_work, do_dbs_timer);
struct dbs_tuners {
unsigned int sampling_rate;
static inline unsigned int get_cpu_idle_time(unsigned int cpu)
{
- return kstat_cpu(cpu).cpustat.idle +
+ unsigned int add_nice = 0, ret;
+
+ if (dbs_tuners_ins.ignore_nice)
+ add_nice = kstat_cpu(cpu).cpustat.nice;
+
+ ret = kstat_cpu(cpu).cpustat.idle +
kstat_cpu(cpu).cpustat.iowait +
- ( dbs_tuners_ins.ignore_nice ?
- kstat_cpu(cpu).cpustat.nice :
- 0);
+ add_nice;
+
+ return ret;
}
/************************** sysfs interface ************************/
}
}
- static void do_dbs_timer(void *data)
+ static void do_dbs_timer(struct work_struct *work)
{
int i;
lock_cpu_hotplug();
static inline void dbs_timer_init(void)
{
- INIT_WORK(&dbs_work, do_dbs_timer, NULL);
schedule_delayed_work(&dbs_work,
usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
return;
unsigned int cpu = policy->cpu;
struct cpu_dbs_info_s *this_dbs_info;
unsigned int j;
+ int rc;
this_dbs_info = &per_cpu(cpu_dbs_info, cpu);
break;
mutex_lock(&dbs_mutex);
+
+ rc = sysfs_create_group(&policy->kobj, &dbs_attr_group);
+ if (rc) {
+ mutex_unlock(&dbs_mutex);
+ return rc;
+ }
+
for_each_cpu_mask(j, policy->cpus) {
struct cpu_dbs_info_s *j_dbs_info;
j_dbs_info = &per_cpu(cpu_dbs_info, j);
this_dbs_info->enable = 1;
this_dbs_info->down_skip = 0;
this_dbs_info->requested_freq = policy->cur;
- sysfs_create_group(&policy->kobj, &dbs_attr_group);
+
dbs_enable++;
/*
* Start the timerschedule work, when this governor
static unsigned int def_sampling_rate;
#define MIN_SAMPLING_RATE_RATIO (2)
/* for correct statistics, we need at least 10 ticks between each measure */
-#define MIN_STAT_SAMPLING_RATE (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
-#define MIN_SAMPLING_RATE (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
+#define MIN_STAT_SAMPLING_RATE \
+ (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
+#define MIN_SAMPLING_RATE \
+ (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
#define TRANSITION_LATENCY_LIMIT (10 * 1000)
- static void do_dbs_timer(void *data);
+ static void do_dbs_timer(struct work_struct *work);
+
+ /* Sampling types */
+ enum dbs_sample {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE};
struct cpu_dbs_info_s {
cputime64_t prev_cpu_idle;
cputime64_t prev_cpu_wall;
struct cpufreq_policy *cur_policy;
- struct work_struct work;
+ struct delayed_work work;
+ enum dbs_sample sample_type;
unsigned int enable;
struct cpufreq_frequency_table *freq_table;
unsigned int freq_lo;
ret = sscanf(buf, "%u", &input);
mutex_lock(&dbs_mutex);
- if (ret != 1 || input > MAX_SAMPLING_RATE || input < MIN_SAMPLING_RATE) {
+ if (ret != 1 || input > MAX_SAMPLING_RATE
+ || input < MIN_SAMPLING_RATE) {
mutex_unlock(&dbs_mutex);
return -EINVAL;
}
* policy. To be safe, we focus 10 points under the threshold.
*/
if (load < (dbs_tuners_ins.up_threshold - 10)) {
- unsigned int freq_next = (policy->cur * load) /
+ unsigned int freq_next, freq_cur;
+
+ freq_cur = cpufreq_driver_getavg(policy);
+ if (!freq_cur)
+ freq_cur = policy->cur;
+
+ freq_next = (freq_cur * load) /
(dbs_tuners_ins.up_threshold - 10);
+
if (!dbs_tuners_ins.powersave_bias) {
__cpufreq_driver_target(policy, freq_next,
CPUFREQ_RELATION_L);
}
}
- /* Sampling types */
- enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE};
-
- static void do_dbs_timer(void *data)
+ static void do_dbs_timer(struct work_struct *work)
{
unsigned int cpu = smp_processor_id();
struct cpu_dbs_info_s *dbs_info = &per_cpu(cpu_dbs_info, cpu);
+ enum dbs_sample sample_type = dbs_info->sample_type;
/* We want all CPUs to do sampling nearly on same jiffy */
int delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
+
+ /* Permit rescheduling of this work item */
+ work_release(work);
+
delay -= jiffies % delay;
if (!dbs_info->enable)
return;
/* Common NORMAL_SAMPLE setup */
- INIT_WORK(&dbs_info->work, do_dbs_timer, (void *)DBS_NORMAL_SAMPLE);
+ dbs_info->sample_type = DBS_NORMAL_SAMPLE;
if (!dbs_tuners_ins.powersave_bias ||
- (unsigned long) data == DBS_NORMAL_SAMPLE) {
+ sample_type == DBS_NORMAL_SAMPLE) {
lock_cpu_hotplug();
dbs_check_cpu(dbs_info);
unlock_cpu_hotplug();
if (dbs_info->freq_lo) {
/* Setup timer for SUB_SAMPLE */
- INIT_WORK(&dbs_info->work, do_dbs_timer,
- (void *)DBS_SUB_SAMPLE);
+ dbs_info->sample_type = DBS_SUB_SAMPLE;
delay = dbs_info->freq_hi_jiffies;
}
} else {
delay -= jiffies % delay;
ondemand_powersave_bias_init();
- INIT_WORK(&dbs_info->work, do_dbs_timer, NULL);
+ INIT_DELAYED_WORK_NAR(&dbs_info->work, do_dbs_timer);
+ dbs_info->sample_type = DBS_NORMAL_SAMPLE;
queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, delay);
}
unsigned int cpu = policy->cpu;
struct cpu_dbs_info_s *this_dbs_info;
unsigned int j;
+ int rc;
this_dbs_info = &per_cpu(cpu_dbs_info, cpu);
if (dbs_enable == 1) {
kondemand_wq = create_workqueue("kondemand");
if (!kondemand_wq) {
- printk(KERN_ERR "Creation of kondemand failed\n");
+ printk(KERN_ERR
+ "Creation of kondemand failed\n");
dbs_enable--;
mutex_unlock(&dbs_mutex);
return -ENOSPC;
}
}
+
+ rc = sysfs_create_group(&policy->kobj, &dbs_attr_group);
+ if (rc) {
+ if (dbs_enable == 1)
+ destroy_workqueue(kondemand_wq);
+ dbs_enable--;
+ mutex_unlock(&dbs_mutex);
+ return rc;
+ }
+
for_each_cpu_mask(j, policy->cpus) {
struct cpu_dbs_info_s *j_dbs_info;
j_dbs_info = &per_cpu(cpu_dbs_info, j);
j_dbs_info->prev_cpu_wall = get_jiffies_64();
}
this_dbs_info->enable = 1;
- sysfs_create_group(&policy->kobj, &dbs_attr_group);
/*
* Start the timerschedule work, when this governor
* is used for first time
#ifndef __ASM_MSR_H
#define __ASM_MSR_H
+ #ifdef CONFIG_PARAVIRT
+ #include <asm/paravirt.h>
+ #else
+
/*
* Access to machine-specific registers (available on 586 and better only)
* Note: the rd* operations modify the parameters directly (without using
__asm__ __volatile__("rdpmc" \
: "=a" (low), "=d" (high) \
: "c" (counter))
+ #endif /* !CONFIG_PARAVIRT */
/* symbolic names for some interesting MSRs */
/* Intel defined MSRs. */
#define MSR_P6_PERFCTR0 0xc1
#define MSR_P6_PERFCTR1 0xc2
+#define MSR_FSB_FREQ 0xcd
+
#define MSR_IA32_BBL_CR_CTL 0x119
#define MSR_IA32_PERF_STATUS 0x198
#define MSR_IA32_PERF_CTL 0x199
+#define MSR_IA32_MPERF 0xE7
+#define MSR_IA32_APERF 0xE8
+
#define MSR_IA32_THERM_CONTROL 0x19a
#define MSR_IA32_THERM_INTERRUPT 0x19b
#define MSR_IA32_THERM_STATUS 0x19c
#define MSR_IA32_MC0_ADDR 0x402
#define MSR_IA32_MC0_MISC 0x403
+ #define MSR_IA32_PEBS_ENABLE 0x3f1
+ #define MSR_IA32_DS_AREA 0x600
+ #define MSR_IA32_PERF_CAPABILITIES 0x345
+
/* Pentium IV performance counter MSRs */
#define MSR_P4_BPU_PERFCTR0 0x300
#define MSR_P4_BPU_PERFCTR1 0x301
#define MSR_TMTA_LRTI_READOUT 0x80868018
#define MSR_TMTA_LRTI_VOLT_MHZ 0x8086801a
+ /* Intel Core-based CPU performance counters */
+ #define MSR_CORE_PERF_FIXED_CTR0 0x309
+ #define MSR_CORE_PERF_FIXED_CTR1 0x30a
+ #define MSR_CORE_PERF_FIXED_CTR2 0x30b
+ #define MSR_CORE_PERF_FIXED_CTR_CTRL 0x38d
+ #define MSR_CORE_PERF_GLOBAL_STATUS 0x38e
+ #define MSR_CORE_PERF_GLOBAL_CTRL 0x38f
+ #define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x390
+
#endif /* __ASM_MSR_H */
#define MSR_LSTAR 0xc0000082 /* long mode SYSCALL target */
#define MSR_CSTAR 0xc0000083 /* compatibility mode SYSCALL target */
#define MSR_SYSCALL_MASK 0xc0000084 /* EFLAGS mask for syscall */
- #define MSR_FS_BASE 0xc0000100 /* 64bit GS base */
- #define MSR_GS_BASE 0xc0000101 /* 64bit FS base */
+ #define MSR_FS_BASE 0xc0000100 /* 64bit FS base */
+ #define MSR_GS_BASE 0xc0000101 /* 64bit GS base */
#define MSR_KERNEL_GS_BASE 0xc0000102 /* SwapGS GS shadow (or USER_GS from kernel) */
/* EFER bits: */
#define _EFER_SCE 0 /* SYSCALL/SYSRET */
#define MSR_IA32_PERFCTR0 0xc1
#define MSR_IA32_PERFCTR1 0xc2
+#define MSR_FSB_FREQ 0xcd
#define MSR_MTRRcap 0x0fe
#define MSR_IA32_BBL_CR_CTL 0x119
#define MSR_IA32_LASTINTFROMIP 0x1dd
#define MSR_IA32_LASTINTTOIP 0x1de
+ #define MSR_IA32_PEBS_ENABLE 0x3f1
+ #define MSR_IA32_DS_AREA 0x600
+ #define MSR_IA32_PERF_CAPABILITIES 0x345
+
#define MSR_MTRRfix64K_00000 0x250
#define MSR_MTRRfix16K_80000 0x258
#define MSR_MTRRfix16K_A0000 0x259
#define MSR_IA32_PERF_STATUS 0x198
#define MSR_IA32_PERF_CTL 0x199
+#define MSR_IA32_MPERF 0xE7
+#define MSR_IA32_APERF 0xE8
+
#define MSR_IA32_THERM_CONTROL 0x19a
#define MSR_IA32_THERM_INTERRUPT 0x19b
#define MSR_IA32_THERM_STATUS 0x19c
#define MSR_P4_U2L_ESCR0 0x3b0
#define MSR_P4_U2L_ESCR1 0x3b1
+ /* Intel Core-based CPU performance counters */
+ #define MSR_CORE_PERF_FIXED_CTR0 0x309
+ #define MSR_CORE_PERF_FIXED_CTR1 0x30a
+ #define MSR_CORE_PERF_FIXED_CTR2 0x30b
+ #define MSR_CORE_PERF_FIXED_CTR_CTRL 0x38d
+ #define MSR_CORE_PERF_GLOBAL_STATUS 0x38e
+ #define MSR_CORE_PERF_GLOBAL_CTRL 0x38f
+ #define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x390
+
#endif