mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 03:06:10 +00:00
Merge commit 'origin/master' into next
This commit is contained in:
commit
4b337c5f24
1229 changed files with 141539 additions and 15499 deletions
|
@ -106,7 +106,7 @@
|
|||
number of errors are printk'ed including a full stack trace.
|
||||
</para>
|
||||
<para>
|
||||
The statistics are available via debugfs/debug_objects/stats.
|
||||
The statistics are available via /sys/kernel/debug/debug_objects/stats.
|
||||
They provide information about the number of warnings and the
|
||||
number of successful fixups along with information about the
|
||||
usage of the internal tracking objects and the state of the
|
||||
|
|
|
@ -246,7 +246,8 @@ void print_ioacct(struct taskstats *t)
|
|||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int c, rc, rep_len, aggr_len, len2, cmd_type;
|
||||
int c, rc, rep_len, aggr_len, len2;
|
||||
int cmd_type = TASKSTATS_CMD_ATTR_UNSPEC;
|
||||
__u16 id;
|
||||
__u32 mypid;
|
||||
|
||||
|
|
|
@ -229,10 +229,10 @@ kernel. It is the use of atomic counters to implement reference
|
|||
counting, and it works such that once the counter falls to zero it can
|
||||
be guaranteed that no other entity can be accessing the object:
|
||||
|
||||
static void obj_list_add(struct obj *obj)
|
||||
static void obj_list_add(struct obj *obj, struct list_head *head)
|
||||
{
|
||||
obj->active = 1;
|
||||
list_add(&obj->list);
|
||||
list_add(&obj->list, head);
|
||||
}
|
||||
|
||||
static void obj_list_del(struct obj *obj)
|
||||
|
|
|
@ -117,7 +117,7 @@ Using the pktcdvd debugfs interface
|
|||
|
||||
To read pktcdvd device infos in human readable form, do:
|
||||
|
||||
# cat /debug/pktcdvd/pktcdvd[0-7]/info
|
||||
# cat /sys/kernel/debug/pktcdvd/pktcdvd[0-7]/info
|
||||
|
||||
For a description of the debugfs interface look into the file:
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ actual frequency must be determined using the following rules:
|
|||
- if relation==CPUFREQ_REL_H, try to select a new_freq lower than or equal
|
||||
target_freq. ("H for highest, but no higher than")
|
||||
|
||||
Here again the frequency table helper might assist you - see section 3
|
||||
Here again the frequency table helper might assist you - see section 2
|
||||
for details.
|
||||
|
||||
|
||||
|
|
|
@ -119,10 +119,6 @@ want the kernel to look at the CPU usage and to make decisions on
|
|||
what to do about the frequency. Typically this is set to values of
|
||||
around '10000' or more. It's default value is (cmp. with users-guide.txt):
|
||||
transition_latency * 1000
|
||||
The lowest value you can set is:
|
||||
transition_latency * 100 or it may get restricted to a value where it
|
||||
makes not sense for the kernel anymore to poll that often which depends
|
||||
on your HZ config variable (HZ=1000: max=20000us, HZ=250: max=5000).
|
||||
Be aware that transition latency is in ns and sampling_rate is in us, so you
|
||||
get the same sysfs value by default.
|
||||
Sampling rate should always get adjusted considering the transition latency
|
||||
|
@ -131,14 +127,20 @@ in the bash (as said, 1000 is default), do:
|
|||
echo `$(($(cat cpuinfo_transition_latency) * 750 / 1000)) \
|
||||
>ondemand/sampling_rate
|
||||
|
||||
show_sampling_rate_(min|max): THIS INTERFACE IS DEPRECATED, DON'T USE IT.
|
||||
You can use wider ranges now and the general
|
||||
cpuinfo_transition_latency variable (cmp. with user-guide.txt) can be
|
||||
used to obtain exactly the same info:
|
||||
show_sampling_rate_min = transtition_latency * 500 / 1000
|
||||
show_sampling_rate_max = transtition_latency * 500000 / 1000
|
||||
(divided by 1000 is to illustrate that sampling rate is in us and
|
||||
transition latency is exported ns).
|
||||
show_sampling_rate_min:
|
||||
The sampling rate is limited by the HW transition latency:
|
||||
transition_latency * 100
|
||||
Or by kernel restrictions:
|
||||
If CONFIG_NO_HZ is set, the limit is 10ms fixed.
|
||||
If CONFIG_NO_HZ is not set or no_hz=off boot parameter is used, the
|
||||
limits depend on the CONFIG_HZ option:
|
||||
HZ=1000: min=20000us (20ms)
|
||||
HZ=250: min=80000us (80ms)
|
||||
HZ=100: min=200000us (200ms)
|
||||
The highest value of kernel and HW latency restrictions is shown and
|
||||
used as the minimum sampling rate.
|
||||
|
||||
show_sampling_rate_max: THIS INTERFACE IS DEPRECATED, DON'T USE IT.
|
||||
|
||||
up_threshold: defines what the average CPU usage between the samplings
|
||||
of 'sampling_rate' needs to be for the kernel to make a decision on
|
||||
|
|
|
@ -31,7 +31,6 @@ Contents:
|
|||
|
||||
3. How to change the CPU cpufreq policy and/or speed
|
||||
3.1 Preferred interface: sysfs
|
||||
3.2 Deprecated interfaces
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -162,3 +162,35 @@ device_remove_file(dev,&dev_attr_power);
|
|||
|
||||
The file name will be 'power' with a mode of 0644 (-rw-r--r--).
|
||||
|
||||
Word of warning: While the kernel allows device_create_file() and
|
||||
device_remove_file() to be called on a device at any time, userspace has
|
||||
strict expectations on when attributes get created. When a new device is
|
||||
registered in the kernel, a uevent is generated to notify userspace (like
|
||||
udev) that a new device is available. If attributes are added after the
|
||||
device is registered, then userspace won't get notified and userspace will
|
||||
not know about the new attributes.
|
||||
|
||||
This is important for device driver that need to publish additional
|
||||
attributes for a device at driver probe time. If the device driver simply
|
||||
calls device_create_file() on the device structure passed to it, then
|
||||
userspace will never be notified of the new attributes. Instead, it should
|
||||
probably use class_create() and class->dev_attrs to set up a list of
|
||||
desired attributes in the modules_init function, and then in the .probe()
|
||||
hook, and then use device_create() to create a new device as a child
|
||||
of the probed device. The new device will generate a new uevent and
|
||||
properly advertise the new attributes to userspace.
|
||||
|
||||
For example, if a driver wanted to add the following attributes:
|
||||
struct device_attribute mydriver_attribs[] = {
|
||||
__ATTR(port_count, 0444, port_count_show),
|
||||
__ATTR(serial_number, 0444, serial_number_show),
|
||||
NULL
|
||||
};
|
||||
|
||||
Then in the module init function is would do:
|
||||
mydriver_class = class_create(THIS_MODULE, "my_attrs");
|
||||
mydriver_class.dev_attr = mydriver_attribs;
|
||||
|
||||
And assuming 'dev' is the struct device passed into the probe hook, the driver
|
||||
probe function would do something like:
|
||||
create_device(&mydriver_class, dev, chrdev, &private_data, "my_name");
|
||||
|
|
|
@ -112,7 +112,7 @@ sub tda10045 {
|
|||
|
||||
sub tda10046 {
|
||||
my $sourcefile = "TT_PCI_2.19h_28_11_2006.zip";
|
||||
my $url = "http://technotrend-online.com/download/software/219/$sourcefile";
|
||||
my $url = "http://www.tt-download.com/download/updates/219/$sourcefile";
|
||||
my $hash = "6a7e1e2f2644b162ff0502367553c72d";
|
||||
my $outfile = "dvb-fe-tda10046.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
@ -129,8 +129,8 @@ sub tda10046 {
|
|||
}
|
||||
|
||||
sub tda10046lifeview {
|
||||
my $sourcefile = "Drv_2.11.02.zip";
|
||||
my $url = "http://www.lifeview.com.tw/drivers/pci_card/FlyDVB-T/$sourcefile";
|
||||
my $sourcefile = "7%5Cdrv_2.11.02.zip";
|
||||
my $url = "http://www.lifeview.hk/dbimages/document/$sourcefile";
|
||||
my $hash = "1ea24dee4eea8fe971686981f34fd2e0";
|
||||
my $outfile = "dvb-fe-tda10046.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
@ -317,7 +317,7 @@ sub nxt2002 {
|
|||
|
||||
sub nxt2004 {
|
||||
my $sourcefile = "AVerTVHD_MCE_A180_Drv_v1.2.2.16.zip";
|
||||
my $url = "http://www.aver.com/support/Drivers/$sourcefile";
|
||||
my $url = "http://www.avermedia-usa.com/support/Drivers/$sourcefile";
|
||||
my $hash = "111cb885b1e009188346d72acfed024c";
|
||||
my $outfile = "dvb-fe-nxt2004.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
|
|
@ -29,16 +29,16 @@ o debugfs entries
|
|||
fault-inject-debugfs kernel module provides some debugfs entries for runtime
|
||||
configuration of fault-injection capabilities.
|
||||
|
||||
- /debug/fail*/probability:
|
||||
- /sys/kernel/debug/fail*/probability:
|
||||
|
||||
likelihood of failure injection, in percent.
|
||||
Format: <percent>
|
||||
|
||||
Note that one-failure-per-hundred is a very high error rate
|
||||
for some testcases. Consider setting probability=100 and configure
|
||||
/debug/fail*/interval for such testcases.
|
||||
/sys/kernel/debug/fail*/interval for such testcases.
|
||||
|
||||
- /debug/fail*/interval:
|
||||
- /sys/kernel/debug/fail*/interval:
|
||||
|
||||
specifies the interval between failures, for calls to
|
||||
should_fail() that pass all the other tests.
|
||||
|
@ -46,18 +46,18 @@ configuration of fault-injection capabilities.
|
|||
Note that if you enable this, by setting interval>1, you will
|
||||
probably want to set probability=100.
|
||||
|
||||
- /debug/fail*/times:
|
||||
- /sys/kernel/debug/fail*/times:
|
||||
|
||||
specifies how many times failures may happen at most.
|
||||
A value of -1 means "no limit".
|
||||
|
||||
- /debug/fail*/space:
|
||||
- /sys/kernel/debug/fail*/space:
|
||||
|
||||
specifies an initial resource "budget", decremented by "size"
|
||||
on each call to should_fail(,size). Failure injection is
|
||||
suppressed until "space" reaches zero.
|
||||
|
||||
- /debug/fail*/verbose
|
||||
- /sys/kernel/debug/fail*/verbose
|
||||
|
||||
Format: { 0 | 1 | 2 }
|
||||
specifies the verbosity of the messages when failure is
|
||||
|
@ -65,17 +65,17 @@ configuration of fault-injection capabilities.
|
|||
log line per failure; '2' will print a call trace too -- useful
|
||||
to debug the problems revealed by fault injection.
|
||||
|
||||
- /debug/fail*/task-filter:
|
||||
- /sys/kernel/debug/fail*/task-filter:
|
||||
|
||||
Format: { 'Y' | 'N' }
|
||||
A value of 'N' disables filtering by process (default).
|
||||
Any positive value limits failures to only processes indicated by
|
||||
/proc/<pid>/make-it-fail==1.
|
||||
|
||||
- /debug/fail*/require-start:
|
||||
- /debug/fail*/require-end:
|
||||
- /debug/fail*/reject-start:
|
||||
- /debug/fail*/reject-end:
|
||||
- /sys/kernel/debug/fail*/require-start:
|
||||
- /sys/kernel/debug/fail*/require-end:
|
||||
- /sys/kernel/debug/fail*/reject-start:
|
||||
- /sys/kernel/debug/fail*/reject-end:
|
||||
|
||||
specifies the range of virtual addresses tested during
|
||||
stacktrace walking. Failure is injected only if some caller
|
||||
|
@ -84,26 +84,26 @@ configuration of fault-injection capabilities.
|
|||
Default required range is [0,ULONG_MAX) (whole of virtual address space).
|
||||
Default rejected range is [0,0).
|
||||
|
||||
- /debug/fail*/stacktrace-depth:
|
||||
- /sys/kernel/debug/fail*/stacktrace-depth:
|
||||
|
||||
specifies the maximum stacktrace depth walked during search
|
||||
for a caller within [require-start,require-end) OR
|
||||
[reject-start,reject-end).
|
||||
|
||||
- /debug/fail_page_alloc/ignore-gfp-highmem:
|
||||
- /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem:
|
||||
|
||||
Format: { 'Y' | 'N' }
|
||||
default is 'N', setting it to 'Y' won't inject failures into
|
||||
highmem/user allocations.
|
||||
|
||||
- /debug/failslab/ignore-gfp-wait:
|
||||
- /debug/fail_page_alloc/ignore-gfp-wait:
|
||||
- /sys/kernel/debug/failslab/ignore-gfp-wait:
|
||||
- /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait:
|
||||
|
||||
Format: { 'Y' | 'N' }
|
||||
default is 'N', setting it to 'Y' will inject failures
|
||||
only into non-sleep allocations (GFP_ATOMIC allocations).
|
||||
|
||||
- /debug/fail_page_alloc/min-order:
|
||||
- /sys/kernel/debug/fail_page_alloc/min-order:
|
||||
|
||||
specifies the minimum page allocation order to be injected
|
||||
failures.
|
||||
|
@ -166,13 +166,13 @@ o Inject slab allocation failures into module init/exit code
|
|||
#!/bin/bash
|
||||
|
||||
FAILTYPE=failslab
|
||||
echo Y > /debug/$FAILTYPE/task-filter
|
||||
echo 10 > /debug/$FAILTYPE/probability
|
||||
echo 100 > /debug/$FAILTYPE/interval
|
||||
echo -1 > /debug/$FAILTYPE/times
|
||||
echo 0 > /debug/$FAILTYPE/space
|
||||
echo 2 > /debug/$FAILTYPE/verbose
|
||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
|
||||
echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||
echo 10 > /sys/kernel/debug/$FAILTYPE/probability
|
||||
echo 100 > /sys/kernel/debug/$FAILTYPE/interval
|
||||
echo -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo 0 > /sys/kernel/debug/$FAILTYPE/space
|
||||
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
|
||||
echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
|
||||
|
||||
faulty_system()
|
||||
{
|
||||
|
@ -217,20 +217,20 @@ then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
cat /sys/module/$module/sections/.text > /debug/$FAILTYPE/require-start
|
||||
cat /sys/module/$module/sections/.data > /debug/$FAILTYPE/require-end
|
||||
cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start
|
||||
cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end
|
||||
|
||||
echo N > /debug/$FAILTYPE/task-filter
|
||||
echo 10 > /debug/$FAILTYPE/probability
|
||||
echo 100 > /debug/$FAILTYPE/interval
|
||||
echo -1 > /debug/$FAILTYPE/times
|
||||
echo 0 > /debug/$FAILTYPE/space
|
||||
echo 2 > /debug/$FAILTYPE/verbose
|
||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
|
||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-highmem
|
||||
echo 10 > /debug/$FAILTYPE/stacktrace-depth
|
||||
echo N > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||
echo 10 > /sys/kernel/debug/$FAILTYPE/probability
|
||||
echo 100 > /sys/kernel/debug/$FAILTYPE/interval
|
||||
echo -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||
echo 0 > /sys/kernel/debug/$FAILTYPE/space
|
||||
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
|
||||
echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
|
||||
echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem
|
||||
echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth
|
||||
|
||||
trap "echo 0 > /debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
|
||||
trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
|
||||
|
||||
echo "Injecting errors into the module $module... (interrupt to stop)"
|
||||
sleep 1000000
|
||||
|
|
|
@ -95,7 +95,7 @@ There is no way to change the vesafb video mode and/or timings after
|
|||
booting linux. If you are not happy with the 60 Hz refresh rate, you
|
||||
have these options:
|
||||
|
||||
* configure and load the DOS-Tools for your the graphics board (if
|
||||
* configure and load the DOS-Tools for the graphics board (if
|
||||
available) and boot linux with loadlin.
|
||||
* use a native driver (matroxfb/atyfb) instead if vesafb. If none
|
||||
is available, write a new one!
|
||||
|
|
|
@ -187,7 +187,7 @@ readpages: no
|
|||
write_begin: no locks the page yes
|
||||
write_end: no yes, unlocks yes
|
||||
perform_write: no n/a yes
|
||||
bmap: yes
|
||||
bmap: no
|
||||
invalidatepage: no yes
|
||||
releasepage: no yes
|
||||
direct_IO: no
|
||||
|
|
|
@ -1003,11 +1003,13 @@ CHAPTER 3: PER-PROCESS PARAMETERS
|
|||
3.1 /proc/<pid>/oom_adj - Adjust the oom-killer score
|
||||
------------------------------------------------------
|
||||
|
||||
This file can be used to adjust the score used to select which processes
|
||||
should be killed in an out-of-memory situation. Giving it a high score will
|
||||
increase the likelihood of this process being killed by the oom-killer. Valid
|
||||
values are in the range -16 to +15, plus the special value -17, which disables
|
||||
oom-killing altogether for this process.
|
||||
This file can be used to adjust the score used to select which processes should
|
||||
be killed in an out-of-memory situation. The oom_adj value is a characteristic
|
||||
of the task's mm, so all threads that share an mm with pid will have the same
|
||||
oom_adj value. A high value will increase the likelihood of this process being
|
||||
killed by the oom-killer. Valid values are in the range -16 to +15 as
|
||||
explained below and a special value of -17, which disables oom-killing
|
||||
altogether for threads sharing pid's mm.
|
||||
|
||||
The process to be killed in an out-of-memory situation is selected among all others
|
||||
based on its badness score. This value equals the original memory size of the process
|
||||
|
@ -1021,6 +1023,9 @@ the parent's score if they do not share the same memory. Thus forking servers
|
|||
are the prime candidates to be killed. Having only one 'hungry' child will make
|
||||
parent less preferable than the child.
|
||||
|
||||
/proc/<pid>/oom_adj cannot be changed for kthreads since they are immune from
|
||||
oom-killing already.
|
||||
|
||||
/proc/<pid>/oom_score shows process' current badness score.
|
||||
|
||||
The following heuristics are then applied:
|
||||
|
|
|
@ -77,7 +77,8 @@
|
|||
seconds for the whole load operation.
|
||||
|
||||
- request_firmware_nowait() is also provided for convenience in
|
||||
non-user contexts.
|
||||
user contexts to request firmware asynchronously, but can't be called
|
||||
in atomic contexts.
|
||||
|
||||
|
||||
about in-kernel persistence:
|
||||
|
|
|
@ -546,6 +546,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
console=brl,ttyS0
|
||||
For now, only VisioBraille is supported.
|
||||
|
||||
consoleblank= [KNL] The console blank (screen saver) timeout in
|
||||
seconds. Defaults to 10*60 = 10mins. A value of 0
|
||||
disables the blank timer.
|
||||
|
||||
coredump_filter=
|
||||
[KNL] Change the default value for
|
||||
/proc/<pid>/coredump_filter.
|
||||
|
|
773
Documentation/kmemcheck.txt
Normal file
773
Documentation/kmemcheck.txt
Normal file
|
@ -0,0 +1,773 @@
|
|||
GETTING STARTED WITH KMEMCHECK
|
||||
==============================
|
||||
|
||||
Vegard Nossum <vegardno@ifi.uio.no>
|
||||
|
||||
|
||||
Contents
|
||||
========
|
||||
0. Introduction
|
||||
1. Downloading
|
||||
2. Configuring and compiling
|
||||
3. How to use
|
||||
3.1. Booting
|
||||
3.2. Run-time enable/disable
|
||||
3.3. Debugging
|
||||
3.4. Annotating false positives
|
||||
4. Reporting errors
|
||||
5. Technical description
|
||||
|
||||
|
||||
0. Introduction
|
||||
===============
|
||||
|
||||
kmemcheck is a debugging feature for the Linux Kernel. More specifically, it
|
||||
is a dynamic checker that detects and warns about some uses of uninitialized
|
||||
memory.
|
||||
|
||||
Userspace programmers might be familiar with Valgrind's memcheck. The main
|
||||
difference between memcheck and kmemcheck is that memcheck works for userspace
|
||||
programs only, and kmemcheck works for the kernel only. The implementations
|
||||
are of course vastly different. Because of this, kmemcheck is not as accurate
|
||||
as memcheck, but it turns out to be good enough in practice to discover real
|
||||
programmer errors that the compiler is not able to find through static
|
||||
analysis.
|
||||
|
||||
Enabling kmemcheck on a kernel will probably slow it down to the extent that
|
||||
the machine will not be usable for normal workloads such as e.g. an
|
||||
interactive desktop. kmemcheck will also cause the kernel to use about twice
|
||||
as much memory as normal. For this reason, kmemcheck is strictly a debugging
|
||||
feature.
|
||||
|
||||
|
||||
1. Downloading
|
||||
==============
|
||||
|
||||
kmemcheck can only be downloaded using git. If you want to write patches
|
||||
against the current code, you should use the kmemcheck development branch of
|
||||
the tip tree. It is also possible to use the linux-next tree, which also
|
||||
includes the latest version of kmemcheck.
|
||||
|
||||
Assuming that you've already cloned the linux-2.6.git repository, all you
|
||||
have to do is add the -tip tree as a remote, like this:
|
||||
|
||||
$ git remote add tip git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git
|
||||
|
||||
To actually download the tree, fetch the remote:
|
||||
|
||||
$ git fetch tip
|
||||
|
||||
And to check out a new local branch with the kmemcheck code:
|
||||
|
||||
$ git checkout -b kmemcheck tip/kmemcheck
|
||||
|
||||
General instructions for the -tip tree can be found here:
|
||||
http://people.redhat.com/mingo/tip.git/readme.txt
|
||||
|
||||
|
||||
2. Configuring and compiling
|
||||
============================
|
||||
|
||||
kmemcheck only works for the x86 (both 32- and 64-bit) platform. A number of
|
||||
configuration variables must have specific settings in order for the kmemcheck
|
||||
menu to even appear in "menuconfig". These are:
|
||||
|
||||
o CONFIG_CC_OPTIMIZE_FOR_SIZE=n
|
||||
|
||||
This option is located under "General setup" / "Optimize for size".
|
||||
|
||||
Without this, gcc will use certain optimizations that usually lead to
|
||||
false positive warnings from kmemcheck. An example of this is a 16-bit
|
||||
field in a struct, where gcc may load 32 bits, then discard the upper
|
||||
16 bits. kmemcheck sees only the 32-bit load, and may trigger a
|
||||
warning for the upper 16 bits (if they're uninitialized).
|
||||
|
||||
o CONFIG_SLAB=y or CONFIG_SLUB=y
|
||||
|
||||
This option is located under "General setup" / "Choose SLAB
|
||||
allocator".
|
||||
|
||||
o CONFIG_FUNCTION_TRACER=n
|
||||
|
||||
This option is located under "Kernel hacking" / "Tracers" / "Kernel
|
||||
Function Tracer"
|
||||
|
||||
When function tracing is compiled in, gcc emits a call to another
|
||||
function at the beginning of every function. This means that when the
|
||||
page fault handler is called, the ftrace framework will be called
|
||||
before kmemcheck has had a chance to handle the fault. If ftrace then
|
||||
modifies memory that was tracked by kmemcheck, the result is an
|
||||
endless recursive page fault.
|
||||
|
||||
o CONFIG_DEBUG_PAGEALLOC=n
|
||||
|
||||
This option is located under "Kernel hacking" / "Debug page memory
|
||||
allocations".
|
||||
|
||||
In addition, I highly recommend turning on CONFIG_DEBUG_INFO=y. This is also
|
||||
located under "Kernel hacking". With this, you will be able to get line number
|
||||
information from the kmemcheck warnings, which is extremely valuable in
|
||||
debugging a problem. This option is not mandatory, however, because it slows
|
||||
down the compilation process and produces a much bigger kernel image.
|
||||
|
||||
Now the kmemcheck menu should be visible (under "Kernel hacking" / "kmemcheck:
|
||||
trap use of uninitialized memory"). Here follows a description of the
|
||||
kmemcheck configuration variables:
|
||||
|
||||
o CONFIG_KMEMCHECK
|
||||
|
||||
This must be enabled in order to use kmemcheck at all...
|
||||
|
||||
o CONFIG_KMEMCHECK_[DISABLED | ENABLED | ONESHOT]_BY_DEFAULT
|
||||
|
||||
This option controls the status of kmemcheck at boot-time. "Enabled"
|
||||
will enable kmemcheck right from the start, "disabled" will boot the
|
||||
kernel as normal (but with the kmemcheck code compiled in, so it can
|
||||
be enabled at run-time after the kernel has booted), and "one-shot" is
|
||||
a special mode which will turn kmemcheck off automatically after
|
||||
detecting the first use of uninitialized memory.
|
||||
|
||||
If you are using kmemcheck to actively debug a problem, then you
|
||||
probably want to choose "enabled" here.
|
||||
|
||||
The one-shot mode is mostly useful in automated test setups because it
|
||||
can prevent floods of warnings and increase the chances of the machine
|
||||
surviving in case something is really wrong. In other cases, the one-
|
||||
shot mode could actually be counter-productive because it would turn
|
||||
itself off at the very first error -- in the case of a false positive
|
||||
too -- and this would come in the way of debugging the specific
|
||||
problem you were interested in.
|
||||
|
||||
If you would like to use your kernel as normal, but with a chance to
|
||||
enable kmemcheck in case of some problem, it might be a good idea to
|
||||
choose "disabled" here. When kmemcheck is disabled, most of the run-
|
||||
time overhead is not incurred, and the kernel will be almost as fast
|
||||
as normal.
|
||||
|
||||
o CONFIG_KMEMCHECK_QUEUE_SIZE
|
||||
|
||||
Select the maximum number of error reports to store in an internal
|
||||
(fixed-size) buffer. Since errors can occur virtually anywhere and in
|
||||
any context, we need a temporary storage area which is guaranteed not
|
||||
to generate any other page faults when accessed. The queue will be
|
||||
emptied as soon as a tasklet may be scheduled. If the queue is full,
|
||||
new error reports will be lost.
|
||||
|
||||
The default value of 64 is probably fine. If some code produces more
|
||||
than 64 errors within an irqs-off section, then the code is likely to
|
||||
produce many, many more, too, and these additional reports seldom give
|
||||
any more information (the first report is usually the most valuable
|
||||
anyway).
|
||||
|
||||
This number might have to be adjusted if you are not using serial
|
||||
console or similar to capture the kernel log. If you are using the
|
||||
"dmesg" command to save the log, then getting a lot of kmemcheck
|
||||
warnings might overflow the kernel log itself, and the earlier reports
|
||||
will get lost in that way instead. Try setting this to 10 or so on
|
||||
such a setup.
|
||||
|
||||
o CONFIG_KMEMCHECK_SHADOW_COPY_SHIFT
|
||||
|
||||
Select the number of shadow bytes to save along with each entry of the
|
||||
error-report queue. These bytes indicate what parts of an allocation
|
||||
are initialized, uninitialized, etc. and will be displayed when an
|
||||
error is detected to help the debugging of a particular problem.
|
||||
|
||||
The number entered here is actually the logarithm of the number of
|
||||
bytes that will be saved. So if you pick for example 5 here, kmemcheck
|
||||
will save 2^5 = 32 bytes.
|
||||
|
||||
The default value should be fine for debugging most problems. It also
|
||||
fits nicely within 80 columns.
|
||||
|
||||
o CONFIG_KMEMCHECK_PARTIAL_OK
|
||||
|
||||
This option (when enabled) works around certain GCC optimizations that
|
||||
produce 32-bit reads from 16-bit variables where the upper 16 bits are
|
||||
thrown away afterwards.
|
||||
|
||||
The default value (enabled) is recommended. This may of course hide
|
||||
some real errors, but disabling it would probably produce a lot of
|
||||
false positives.
|
||||
|
||||
o CONFIG_KMEMCHECK_BITOPS_OK
|
||||
|
||||
This option silences warnings that would be generated for bit-field
|
||||
accesses where not all the bits are initialized at the same time. This
|
||||
may also hide some real bugs.
|
||||
|
||||
This option is probably obsolete, or it should be replaced with
|
||||
the kmemcheck-/bitfield-annotations for the code in question. The
|
||||
default value is therefore fine.
|
||||
|
||||
Now compile the kernel as usual.
|
||||
|
||||
|
||||
3. How to use
|
||||
=============
|
||||
|
||||
3.1. Booting
|
||||
============
|
||||
|
||||
First some information about the command-line options. There is only one
|
||||
option specific to kmemcheck, and this is called "kmemcheck". It can be used
|
||||
to override the default mode as chosen by the CONFIG_KMEMCHECK_*_BY_DEFAULT
|
||||
option. Its possible settings are:
|
||||
|
||||
o kmemcheck=0 (disabled)
|
||||
o kmemcheck=1 (enabled)
|
||||
o kmemcheck=2 (one-shot mode)
|
||||
|
||||
If SLUB debugging has been enabled in the kernel, it may take precedence over
|
||||
kmemcheck in such a way that the slab caches which are under SLUB debugging
|
||||
will not be tracked by kmemcheck. In order to ensure that this doesn't happen
|
||||
(even though it shouldn't by default), use SLUB's boot option "slub_debug",
|
||||
like this: slub_debug=-
|
||||
|
||||
In fact, this option may also be used for fine-grained control over SLUB vs.
|
||||
kmemcheck. For example, if the command line includes "kmemcheck=1
|
||||
slub_debug=,dentry", then SLUB debugging will be used only for the "dentry"
|
||||
slab cache, and with kmemcheck tracking all the other caches. This is advanced
|
||||
usage, however, and is not generally recommended.
|
||||
|
||||
|
||||
3.2. Run-time enable/disable
|
||||
============================
|
||||
|
||||
When the kernel has booted, it is possible to enable or disable kmemcheck at
|
||||
run-time. WARNING: This feature is still experimental and may cause false
|
||||
positive warnings to appear. Therefore, try not to use this. If you find that
|
||||
it doesn't work properly (e.g. you see an unreasonable amount of warnings), I
|
||||
will be happy to take bug reports.
|
||||
|
||||
Use the file /proc/sys/kernel/kmemcheck for this purpose, e.g.:
|
||||
|
||||
$ echo 0 > /proc/sys/kernel/kmemcheck # disables kmemcheck
|
||||
|
||||
The numbers are the same as for the kmemcheck= command-line option.
|
||||
|
||||
|
||||
3.3. Debugging
|
||||
==============
|
||||
|
||||
A typical report will look something like this:
|
||||
|
||||
WARNING: kmemcheck: Caught 32-bit read from uninitialized memory (ffff88003e4a2024)
|
||||
80000000000000000000000000000000000000000088ffff0000000000000000
|
||||
i i i i u u u u i i i i i i i i u u u u u u u u u u u u u u u u
|
||||
^
|
||||
|
||||
Pid: 1856, comm: ntpdate Not tainted 2.6.29-rc5 #264 945P-A
|
||||
RIP: 0010:[<ffffffff8104ede8>] [<ffffffff8104ede8>] __dequeue_signal+0xc8/0x190
|
||||
RSP: 0018:ffff88003cdf7d98 EFLAGS: 00210002
|
||||
RAX: 0000000000000030 RBX: ffff88003d4ea968 RCX: 0000000000000009
|
||||
RDX: ffff88003e5d6018 RSI: ffff88003e5d6024 RDI: ffff88003cdf7e84
|
||||
RBP: ffff88003cdf7db8 R08: ffff88003e5d6000 R09: 0000000000000000
|
||||
R10: 0000000000000080 R11: 0000000000000000 R12: 000000000000000e
|
||||
R13: ffff88003cdf7e78 R14: ffff88003d530710 R15: ffff88003d5a98c8
|
||||
FS: 0000000000000000(0000) GS:ffff880001982000(0063) knlGS:00000
|
||||
CS: 0010 DS: 002b ES: 002b CR0: 0000000080050033
|
||||
CR2: ffff88003f806ea0 CR3: 000000003c036000 CR4: 00000000000006a0
|
||||
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
|
||||
DR3: 0000000000000000 DR6: 00000000ffff4ff0 DR7: 0000000000000400
|
||||
[<ffffffff8104f04e>] dequeue_signal+0x8e/0x170
|
||||
[<ffffffff81050bd8>] get_signal_to_deliver+0x98/0x390
|
||||
[<ffffffff8100b87d>] do_notify_resume+0xad/0x7d0
|
||||
[<ffffffff8100c7b5>] int_signal+0x12/0x17
|
||||
[<ffffffffffffffff>] 0xffffffffffffffff
|
||||
|
||||
The single most valuable information in this report is the RIP (or EIP on 32-
|
||||
bit) value. This will help us pinpoint exactly which instruction that caused
|
||||
the warning.
|
||||
|
||||
If your kernel was compiled with CONFIG_DEBUG_INFO=y, then all we have to do
|
||||
is give this address to the addr2line program, like this:
|
||||
|
||||
$ addr2line -e vmlinux -i ffffffff8104ede8
|
||||
arch/x86/include/asm/string_64.h:12
|
||||
include/asm-generic/siginfo.h:287
|
||||
kernel/signal.c:380
|
||||
kernel/signal.c:410
|
||||
|
||||
The "-e vmlinux" tells addr2line which file to look in. IMPORTANT: This must
|
||||
be the vmlinux of the kernel that produced the warning in the first place! If
|
||||
not, the line number information will almost certainly be wrong.
|
||||
|
||||
The "-i" tells addr2line to also print the line numbers of inlined functions.
|
||||
In this case, the flag was very important, because otherwise, it would only
|
||||
have printed the first line, which is just a call to memcpy(), which could be
|
||||
called from a thousand places in the kernel, and is therefore not very useful.
|
||||
These inlined functions would not show up in the stack trace above, simply
|
||||
because the kernel doesn't load the extra debugging information. This
|
||||
technique can of course be used with ordinary kernel oopses as well.
|
||||
|
||||
In this case, it's the caller of memcpy() that is interesting, and it can be
|
||||
found in include/asm-generic/siginfo.h, line 287:
|
||||
|
||||
281 static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
||||
282 {
|
||||
283 if (from->si_code < 0)
|
||||
284 memcpy(to, from, sizeof(*to));
|
||||
285 else
|
||||
286 /* _sigchld is currently the largest know union member */
|
||||
287 memcpy(to, from, __ARCH_SI_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld));
|
||||
288 }
|
||||
|
||||
Since this was a read (kmemcheck usually warns about reads only, though it can
|
||||
warn about writes to unallocated or freed memory as well), it was probably the
|
||||
"from" argument which contained some uninitialized bytes. Following the chain
|
||||
of calls, we move upwards to see where "from" was allocated or initialized,
|
||||
kernel/signal.c, line 380:
|
||||
|
||||
359 static void collect_signal(int sig, struct sigpending *list, siginfo_t *info)
|
||||
360 {
|
||||
...
|
||||
367 list_for_each_entry(q, &list->list, list) {
|
||||
368 if (q->info.si_signo == sig) {
|
||||
369 if (first)
|
||||
370 goto still_pending;
|
||||
371 first = q;
|
||||
...
|
||||
377 if (first) {
|
||||
378 still_pending:
|
||||
379 list_del_init(&first->list);
|
||||
380 copy_siginfo(info, &first->info);
|
||||
381 __sigqueue_free(first);
|
||||
...
|
||||
392 }
|
||||
393 }
|
||||
|
||||
Here, it is &first->info that is being passed on to copy_siginfo(). The
|
||||
variable "first" was found on a list -- passed in as the second argument to
|
||||
collect_signal(). We continue our journey through the stack, to figure out
|
||||
where the item on "list" was allocated or initialized. We move to line 410:
|
||||
|
||||
395 static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
|
||||
396 siginfo_t *info)
|
||||
397 {
|
||||
...
|
||||
410 collect_signal(sig, pending, info);
|
||||
...
|
||||
414 }
|
||||
|
||||
Now we need to follow the "pending" pointer, since that is being passed on to
|
||||
collect_signal() as "list". At this point, we've run out of lines from the
|
||||
"addr2line" output. Not to worry, we just paste the next addresses from the
|
||||
kmemcheck stack dump, i.e.:
|
||||
|
||||
[<ffffffff8104f04e>] dequeue_signal+0x8e/0x170
|
||||
[<ffffffff81050bd8>] get_signal_to_deliver+0x98/0x390
|
||||
[<ffffffff8100b87d>] do_notify_resume+0xad/0x7d0
|
||||
[<ffffffff8100c7b5>] int_signal+0x12/0x17
|
||||
|
||||
$ addr2line -e vmlinux -i ffffffff8104f04e ffffffff81050bd8 \
|
||||
ffffffff8100b87d ffffffff8100c7b5
|
||||
kernel/signal.c:446
|
||||
kernel/signal.c:1806
|
||||
arch/x86/kernel/signal.c:805
|
||||
arch/x86/kernel/signal.c:871
|
||||
arch/x86/kernel/entry_64.S:694
|
||||
|
||||
Remember that since these addresses were found on the stack and not as the
|
||||
RIP value, they actually point to the _next_ instruction (they are return
|
||||
addresses). This becomes obvious when we look at the code for line 446:
|
||||
|
||||
422 int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
|
||||
423 {
|
||||
...
|
||||
431 signr = __dequeue_signal(&tsk->signal->shared_pending,
|
||||
432 mask, info);
|
||||
433 /*
|
||||
434 * itimer signal ?
|
||||
435 *
|
||||
436 * itimers are process shared and we restart periodic
|
||||
437 * itimers in the signal delivery path to prevent DoS
|
||||
438 * attacks in the high resolution timer case. This is
|
||||
439 * compliant with the old way of self restarting
|
||||
440 * itimers, as the SIGALRM is a legacy signal and only
|
||||
441 * queued once. Changing the restart behaviour to
|
||||
442 * restart the timer in the signal dequeue path is
|
||||
443 * reducing the timer noise on heavy loaded !highres
|
||||
444 * systems too.
|
||||
445 */
|
||||
446 if (unlikely(signr == SIGALRM)) {
|
||||
...
|
||||
489 }
|
||||
|
||||
So instead of looking at 446, we should be looking at 431, which is the line
|
||||
that executes just before 446. Here we see that what we are looking for is
|
||||
&tsk->signal->shared_pending.
|
||||
|
||||
Our next task is now to figure out which function that puts items on this
|
||||
"shared_pending" list. A crude, but efficient tool, is git grep:
|
||||
|
||||
$ git grep -n 'shared_pending' kernel/
|
||||
...
|
||||
kernel/signal.c:828: pending = group ? &t->signal->shared_pending : &t->pending;
|
||||
kernel/signal.c:1339: pending = group ? &t->signal->shared_pending : &t->pending;
|
||||
...
|
||||
|
||||
There were more results, but none of them were related to list operations,
|
||||
and these were the only assignments. We inspect the line numbers more closely
|
||||
and find that this is indeed where items are being added to the list:
|
||||
|
||||
816 static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
||||
817 int group)
|
||||
818 {
|
||||
...
|
||||
828 pending = group ? &t->signal->shared_pending : &t->pending;
|
||||
...
|
||||
851 q = __sigqueue_alloc(t, GFP_ATOMIC, (sig < SIGRTMIN &&
|
||||
852 (is_si_special(info) ||
|
||||
853 info->si_code >= 0)));
|
||||
854 if (q) {
|
||||
855 list_add_tail(&q->list, &pending->list);
|
||||
...
|
||||
890 }
|
||||
|
||||
and:
|
||||
|
||||
1309 int send_sigqueue(struct sigqueue *q, struct task_struct *t, int group)
|
||||
1310 {
|
||||
....
|
||||
1339 pending = group ? &t->signal->shared_pending : &t->pending;
|
||||
1340 list_add_tail(&q->list, &pending->list);
|
||||
....
|
||||
1347 }
|
||||
|
||||
In the first case, the list element we are looking for, "q", is being returned
|
||||
from the function __sigqueue_alloc(), which looks like an allocation function.
|
||||
Let's take a look at it:
|
||||
|
||||
187 static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags,
|
||||
188 int override_rlimit)
|
||||
189 {
|
||||
190 struct sigqueue *q = NULL;
|
||||
191 struct user_struct *user;
|
||||
192
|
||||
193 /*
|
||||
194 * We won't get problems with the target's UID changing under us
|
||||
195 * because changing it requires RCU be used, and if t != current, the
|
||||
196 * caller must be holding the RCU readlock (by way of a spinlock) and
|
||||
197 * we use RCU protection here
|
||||
198 */
|
||||
199 user = get_uid(__task_cred(t)->user);
|
||||
200 atomic_inc(&user->sigpending);
|
||||
201 if (override_rlimit ||
|
||||
202 atomic_read(&user->sigpending) <=
|
||||
203 t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
|
||||
204 q = kmem_cache_alloc(sigqueue_cachep, flags);
|
||||
205 if (unlikely(q == NULL)) {
|
||||
206 atomic_dec(&user->sigpending);
|
||||
207 free_uid(user);
|
||||
208 } else {
|
||||
209 INIT_LIST_HEAD(&q->list);
|
||||
210 q->flags = 0;
|
||||
211 q->user = user;
|
||||
212 }
|
||||
213
|
||||
214 return q;
|
||||
215 }
|
||||
|
||||
We see that this function initializes q->list, q->flags, and q->user. It seems
|
||||
that now is the time to look at the definition of "struct sigqueue", e.g.:
|
||||
|
||||
14 struct sigqueue {
|
||||
15 struct list_head list;
|
||||
16 int flags;
|
||||
17 siginfo_t info;
|
||||
18 struct user_struct *user;
|
||||
19 };
|
||||
|
||||
And, you might remember, it was a memcpy() on &first->info that caused the
|
||||
warning, so this makes perfect sense. It also seems reasonable to assume that
|
||||
it is the caller of __sigqueue_alloc() that has the responsibility of filling
|
||||
out (initializing) this member.
|
||||
|
||||
But just which fields of the struct were uninitialized? Let's look at
|
||||
kmemcheck's report again:
|
||||
|
||||
WARNING: kmemcheck: Caught 32-bit read from uninitialized memory (ffff88003e4a2024)
|
||||
80000000000000000000000000000000000000000088ffff0000000000000000
|
||||
i i i i u u u u i i i i i i i i u u u u u u u u u u u u u u u u
|
||||
^
|
||||
|
||||
These first two lines are the memory dump of the memory object itself, and the
|
||||
shadow bytemap, respectively. The memory object itself is in this case
|
||||
&first->info. Just beware that the start of this dump is NOT the start of the
|
||||
object itself! The position of the caret (^) corresponds with the address of
|
||||
the read (ffff88003e4a2024).
|
||||
|
||||
The shadow bytemap dump legend is as follows:
|
||||
|
||||
i - initialized
|
||||
u - uninitialized
|
||||
a - unallocated (memory has been allocated by the slab layer, but has not
|
||||
yet been handed off to anybody)
|
||||
f - freed (memory has been allocated by the slab layer, but has been freed
|
||||
by the previous owner)
|
||||
|
||||
In order to figure out where (relative to the start of the object) the
|
||||
uninitialized memory was located, we have to look at the disassembly. For
|
||||
that, we'll need the RIP address again:
|
||||
|
||||
RIP: 0010:[<ffffffff8104ede8>] [<ffffffff8104ede8>] __dequeue_signal+0xc8/0x190
|
||||
|
||||
$ objdump -d --no-show-raw-insn vmlinux | grep -C 8 ffffffff8104ede8:
|
||||
ffffffff8104edc8: mov %r8,0x8(%r8)
|
||||
ffffffff8104edcc: test %r10d,%r10d
|
||||
ffffffff8104edcf: js ffffffff8104ee88 <__dequeue_signal+0x168>
|
||||
ffffffff8104edd5: mov %rax,%rdx
|
||||
ffffffff8104edd8: mov $0xc,%ecx
|
||||
ffffffff8104eddd: mov %r13,%rdi
|
||||
ffffffff8104ede0: mov $0x30,%eax
|
||||
ffffffff8104ede5: mov %rdx,%rsi
|
||||
ffffffff8104ede8: rep movsl %ds:(%rsi),%es:(%rdi)
|
||||
ffffffff8104edea: test $0x2,%al
|
||||
ffffffff8104edec: je ffffffff8104edf0 <__dequeue_signal+0xd0>
|
||||
ffffffff8104edee: movsw %ds:(%rsi),%es:(%rdi)
|
||||
ffffffff8104edf0: test $0x1,%al
|
||||
ffffffff8104edf2: je ffffffff8104edf5 <__dequeue_signal+0xd5>
|
||||
ffffffff8104edf4: movsb %ds:(%rsi),%es:(%rdi)
|
||||
ffffffff8104edf5: mov %r8,%rdi
|
||||
ffffffff8104edf8: callq ffffffff8104de60 <__sigqueue_free>
|
||||
|
||||
As expected, it's the "rep movsl" instruction from the memcpy() that causes
|
||||
the warning. We know about REP MOVSL that it uses the register RCX to count
|
||||
the number of remaining iterations. By taking a look at the register dump
|
||||
again (from the kmemcheck report), we can figure out how many bytes were left
|
||||
to copy:
|
||||
|
||||
RAX: 0000000000000030 RBX: ffff88003d4ea968 RCX: 0000000000000009
|
||||
|
||||
By looking at the disassembly, we also see that %ecx is being loaded with the
|
||||
value $0xc just before (ffffffff8104edd8), so we are very lucky. Keep in mind
|
||||
that this is the number of iterations, not bytes. And since this is a "long"
|
||||
operation, we need to multiply by 4 to get the number of bytes. So this means
|
||||
that the uninitialized value was encountered at 4 * (0xc - 0x9) = 12 bytes
|
||||
from the start of the object.
|
||||
|
||||
We can now try to figure out which field of the "struct siginfo" that was not
|
||||
initialized. This is the beginning of the struct:
|
||||
|
||||
40 typedef struct siginfo {
|
||||
41 int si_signo;
|
||||
42 int si_errno;
|
||||
43 int si_code;
|
||||
44
|
||||
45 union {
|
||||
..
|
||||
92 } _sifields;
|
||||
93 } siginfo_t;
|
||||
|
||||
On 64-bit, the int is 4 bytes long, so it must the the union member that has
|
||||
not been initialized. We can verify this using gdb:
|
||||
|
||||
$ gdb vmlinux
|
||||
...
|
||||
(gdb) p &((struct siginfo *) 0)->_sifields
|
||||
$1 = (union {...} *) 0x10
|
||||
|
||||
Actually, it seems that the union member is located at offset 0x10 -- which
|
||||
means that gcc has inserted 4 bytes of padding between the members si_code
|
||||
and _sifields. We can now get a fuller picture of the memory dump:
|
||||
|
||||
_----------------------------=> si_code
|
||||
/ _--------------------=> (padding)
|
||||
| / _------------=> _sifields(._kill._pid)
|
||||
| | / _----=> _sifields(._kill._uid)
|
||||
| | | /
|
||||
-------|-------|-------|-------|
|
||||
80000000000000000000000000000000000000000088ffff0000000000000000
|
||||
i i i i u u u u i i i i i i i i u u u u u u u u u u u u u u u u
|
||||
|
||||
This allows us to realize another important fact: si_code contains the value
|
||||
0x80. Remember that x86 is little endian, so the first 4 bytes "80000000" are
|
||||
really the number 0x00000080. With a bit of research, we find that this is
|
||||
actually the constant SI_KERNEL defined in include/asm-generic/siginfo.h:
|
||||
|
||||
144 #define SI_KERNEL 0x80 /* sent by the kernel from somewhere */
|
||||
|
||||
This macro is used in exactly one place in the x86 kernel: In send_signal()
|
||||
in kernel/signal.c:
|
||||
|
||||
816 static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
||||
817 int group)
|
||||
818 {
|
||||
...
|
||||
828 pending = group ? &t->signal->shared_pending : &t->pending;
|
||||
...
|
||||
851 q = __sigqueue_alloc(t, GFP_ATOMIC, (sig < SIGRTMIN &&
|
||||
852 (is_si_special(info) ||
|
||||
853 info->si_code >= 0)));
|
||||
854 if (q) {
|
||||
855 list_add_tail(&q->list, &pending->list);
|
||||
856 switch ((unsigned long) info) {
|
||||
...
|
||||
865 case (unsigned long) SEND_SIG_PRIV:
|
||||
866 q->info.si_signo = sig;
|
||||
867 q->info.si_errno = 0;
|
||||
868 q->info.si_code = SI_KERNEL;
|
||||
869 q->info.si_pid = 0;
|
||||
870 q->info.si_uid = 0;
|
||||
871 break;
|
||||
...
|
||||
890 }
|
||||
|
||||
Not only does this match with the .si_code member, it also matches the place
|
||||
we found earlier when looking for where siginfo_t objects are enqueued on the
|
||||
"shared_pending" list.
|
||||
|
||||
So to sum up: It seems that it is the padding introduced by the compiler
|
||||
between two struct fields that is uninitialized, and this gets reported when
|
||||
we do a memcpy() on the struct. This means that we have identified a false
|
||||
positive warning.
|
||||
|
||||
Normally, kmemcheck will not report uninitialized accesses in memcpy() calls
|
||||
when both the source and destination addresses are tracked. (Instead, we copy
|
||||
the shadow bytemap as well). In this case, the destination address clearly
|
||||
was not tracked. We can dig a little deeper into the stack trace from above:
|
||||
|
||||
arch/x86/kernel/signal.c:805
|
||||
arch/x86/kernel/signal.c:871
|
||||
arch/x86/kernel/entry_64.S:694
|
||||
|
||||
And we clearly see that the destination siginfo object is located on the
|
||||
stack:
|
||||
|
||||
782 static void do_signal(struct pt_regs *regs)
|
||||
783 {
|
||||
784 struct k_sigaction ka;
|
||||
785 siginfo_t info;
|
||||
...
|
||||
804 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||
...
|
||||
854 }
|
||||
|
||||
And this &info is what eventually gets passed to copy_siginfo() as the
|
||||
destination argument.
|
||||
|
||||
Now, even though we didn't find an actual error here, the example is still a
|
||||
good one, because it shows how one would go about to find out what the report
|
||||
was all about.
|
||||
|
||||
|
||||
3.4. Annotating false positives
|
||||
===============================
|
||||
|
||||
There are a few different ways to make annotations in the source code that
|
||||
will keep kmemcheck from checking and reporting certain allocations. Here
|
||||
they are:
|
||||
|
||||
o __GFP_NOTRACK_FALSE_POSITIVE
|
||||
|
||||
This flag can be passed to kmalloc() or kmem_cache_alloc() (therefore
|
||||
also to other functions that end up calling one of these) to indicate
|
||||
that the allocation should not be tracked because it would lead to
|
||||
a false positive report. This is a "big hammer" way of silencing
|
||||
kmemcheck; after all, even if the false positive pertains to
|
||||
particular field in a struct, for example, we will now lose the
|
||||
ability to find (real) errors in other parts of the same struct.
|
||||
|
||||
Example:
|
||||
|
||||
/* No warnings will ever trigger on accessing any part of x */
|
||||
x = kmalloc(sizeof *x, GFP_KERNEL | __GFP_NOTRACK_FALSE_POSITIVE);
|
||||
|
||||
o kmemcheck_bitfield_begin(name)/kmemcheck_bitfield_end(name) and
|
||||
kmemcheck_annotate_bitfield(ptr, name)
|
||||
|
||||
The first two of these three macros can be used inside struct
|
||||
definitions to signal, respectively, the beginning and end of a
|
||||
bitfield. Additionally, this will assign the bitfield a name, which
|
||||
is given as an argument to the macros.
|
||||
|
||||
Having used these markers, one can later use
|
||||
kmemcheck_annotate_bitfield() at the point of allocation, to indicate
|
||||
which parts of the allocation is part of a bitfield.
|
||||
|
||||
Example:
|
||||
|
||||
struct foo {
|
||||
int x;
|
||||
|
||||
kmemcheck_bitfield_begin(flags);
|
||||
int flag_a:1;
|
||||
int flag_b:1;
|
||||
kmemcheck_bitfield_end(flags);
|
||||
|
||||
int y;
|
||||
};
|
||||
|
||||
struct foo *x = kmalloc(sizeof *x);
|
||||
|
||||
/* No warnings will trigger on accessing the bitfield of x */
|
||||
kmemcheck_annotate_bitfield(x, flags);
|
||||
|
||||
Note that kmemcheck_annotate_bitfield() can be used even before the
|
||||
return value of kmalloc() is checked -- in other words, passing NULL
|
||||
as the first argument is legal (and will do nothing).
|
||||
|
||||
|
||||
4. Reporting errors
|
||||
===================
|
||||
|
||||
As we have seen, kmemcheck will produce false positive reports. Therefore, it
|
||||
is not very wise to blindly post kmemcheck warnings to mailing lists and
|
||||
maintainers. Instead, I encourage maintainers and developers to find errors
|
||||
in their own code. If you get a warning, you can try to work around it, try
|
||||
to figure out if it's a real error or not, or simply ignore it. Most
|
||||
developers know their own code and will quickly and efficiently determine the
|
||||
root cause of a kmemcheck report. This is therefore also the most efficient
|
||||
way to work with kmemcheck.
|
||||
|
||||
That said, we (the kmemcheck maintainers) will always be on the lookout for
|
||||
false positives that we can annotate and silence. So whatever you find,
|
||||
please drop us a note privately! Kernel configs and steps to reproduce (if
|
||||
available) are of course a great help too.
|
||||
|
||||
Happy hacking!
|
||||
|
||||
|
||||
5. Technical description
|
||||
========================
|
||||
|
||||
kmemcheck works by marking memory pages non-present. This means that whenever
|
||||
somebody attempts to access the page, a page fault is generated. The page
|
||||
fault handler notices that the page was in fact only hidden, and so it calls
|
||||
on the kmemcheck code to make further investigations.
|
||||
|
||||
When the investigations are completed, kmemcheck "shows" the page by marking
|
||||
it present (as it would be under normal circumstances). This way, the
|
||||
interrupted code can continue as usual.
|
||||
|
||||
But after the instruction has been executed, we should hide the page again, so
|
||||
that we can catch the next access too! Now kmemcheck makes use of a debugging
|
||||
feature of the processor, namely single-stepping. When the processor has
|
||||
finished the one instruction that generated the memory access, a debug
|
||||
exception is raised. From here, we simply hide the page again and continue
|
||||
execution, this time with the single-stepping feature turned off.
|
||||
|
||||
kmemcheck requires some assistance from the memory allocator in order to work.
|
||||
The memory allocator needs to
|
||||
|
||||
1. Tell kmemcheck about newly allocated pages and pages that are about to
|
||||
be freed. This allows kmemcheck to set up and tear down the shadow memory
|
||||
for the pages in question. The shadow memory stores the status of each
|
||||
byte in the allocation proper, e.g. whether it is initialized or
|
||||
uninitialized.
|
||||
|
||||
2. Tell kmemcheck which parts of memory should be marked uninitialized.
|
||||
There are actually a few more states, such as "not yet allocated" and
|
||||
"recently freed".
|
||||
|
||||
If a slab cache is set up using the SLAB_NOTRACK flag, it will never return
|
||||
memory that can take page faults because of kmemcheck.
|
||||
|
||||
If a slab cache is NOT set up using the SLAB_NOTRACK flag, callers can still
|
||||
request memory with the __GFP_NOTRACK or __GFP_NOTRACK_FALSE_POSITIVE flags.
|
||||
This does not prevent the page faults from occurring, however, but marks the
|
||||
object in question as being initialized so that no warnings will ever be
|
||||
produced for this object.
|
||||
|
||||
Currently, the SLAB and SLUB allocators are supported by kmemcheck.
|
|
@ -507,9 +507,9 @@ http://www.linuxsymposium.org/2006/linuxsymposium_procv2.pdf (pages 101-115)
|
|||
Appendix A: The kprobes debugfs interface
|
||||
|
||||
With recent kernels (> 2.6.20) the list of registered kprobes is visible
|
||||
under the /debug/kprobes/ directory (assuming debugfs is mounted at /debug).
|
||||
under the /sys/kernel/debug/kprobes/ directory (assuming debugfs is mounted at //sys/kernel/debug).
|
||||
|
||||
/debug/kprobes/list: Lists all registered probes on the system
|
||||
/sys/kernel/debug/kprobes/list: Lists all registered probes on the system
|
||||
|
||||
c015d71a k vfs_read+0x0
|
||||
c011a316 j do_fork+0x0
|
||||
|
@ -525,7 +525,7 @@ virtual addresses that correspond to modules that've been unloaded),
|
|||
such probes are marked with [GONE]. If the probe is temporarily disabled,
|
||||
such probes are marked with [DISABLED].
|
||||
|
||||
/debug/kprobes/enabled: Turn kprobes ON/OFF forcibly.
|
||||
/sys/kernel/debug/kprobes/enabled: Turn kprobes ON/OFF forcibly.
|
||||
|
||||
Provides a knob to globally and forcibly turn registered kprobes ON or OFF.
|
||||
By default, all kprobes are enabled. By echoing "0" to this file, all
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
SCSI FC Tansport
|
||||
=============================================
|
||||
|
||||
Date: 4/12/2007
|
||||
Date: 11/18/2008
|
||||
Kernel Revisions for features:
|
||||
rports : <<TBS>>
|
||||
vports : 2.6.22 (? TBD)
|
||||
vports : 2.6.22
|
||||
bsg support : 2.6.30 (?TBD?)
|
||||
|
||||
|
||||
Introduction
|
||||
|
@ -15,6 +16,7 @@ The FC transport can be found at:
|
|||
drivers/scsi/scsi_transport_fc.c
|
||||
include/scsi/scsi_transport_fc.h
|
||||
include/scsi/scsi_netlink_fc.h
|
||||
include/scsi/scsi_bsg_fc.h
|
||||
|
||||
This file is found at Documentation/scsi/scsi_fc_transport.txt
|
||||
|
||||
|
@ -472,6 +474,14 @@ int
|
|||
fc_vport_terminate(struct fc_vport *vport)
|
||||
|
||||
|
||||
FC BSG support (CT & ELS passthru, and more)
|
||||
========================================================================
|
||||
<< To Be Supplied >>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Credits
|
||||
=======
|
||||
The following people have contributed to this document:
|
||||
|
|
|
@ -1271,6 +1271,11 @@ of interest:
|
|||
hostdata[0] - area reserved for LLD at end of struct Scsi_Host. Size
|
||||
is set by the second argument (named 'xtr_bytes') to
|
||||
scsi_host_alloc() or scsi_register().
|
||||
vendor_id - a unique value that identifies the vendor supplying
|
||||
the LLD for the Scsi_Host. Used most often in validating
|
||||
vendor-specific message requests. Value consists of an
|
||||
identifier type and a vendor-specific value.
|
||||
See scsi_netlink.h for a description of valid formats.
|
||||
|
||||
The scsi_host structure is defined in include/scsi/scsi_host.h
|
||||
|
||||
|
|
|
@ -233,8 +233,8 @@ These protections are added to score to judge whether this zone should be used
|
|||
for page allocation or should be reclaimed.
|
||||
|
||||
In this example, if normal pages (index=2) are required to this DMA zone and
|
||||
pages_high is used for watermark, the kernel judges this zone should not be
|
||||
used because pages_free(1355) is smaller than watermark + protection[2]
|
||||
watermark[WMARK_HIGH] is used for watermark, the kernel judges this zone should
|
||||
not be used because pages_free(1355) is smaller than watermark + protection[2]
|
||||
(4 + 2004 = 2008). If this protection value is 0, this zone would be used for
|
||||
normal page requirement. If requirement is DMA zone(index=0), protection[0]
|
||||
(=0) is used.
|
||||
|
@ -280,9 +280,10 @@ The default value is 65536.
|
|||
min_free_kbytes:
|
||||
|
||||
This is used to force the Linux VM to keep a minimum number
|
||||
of kilobytes free. The VM uses this number to compute a pages_min
|
||||
value for each lowmem zone in the system. Each lowmem zone gets
|
||||
a number of reserved free pages based proportionally on its size.
|
||||
of kilobytes free. The VM uses this number to compute a
|
||||
watermark[WMARK_MIN] value for each lowmem zone in the system.
|
||||
Each lowmem zone gets a number of reserved free pages based
|
||||
proportionally on its size.
|
||||
|
||||
Some minimal amount of memory is needed to satisfy PF_MEMALLOC
|
||||
allocations; if you set this to lower than 1024KB, your system will
|
||||
|
@ -314,10 +315,14 @@ min_unmapped_ratio:
|
|||
|
||||
This is available only on NUMA kernels.
|
||||
|
||||
A percentage of the total pages in each zone. Zone reclaim will only
|
||||
occur if more than this percentage of pages are file backed and unmapped.
|
||||
This is to insure that a minimal amount of local pages is still available for
|
||||
file I/O even if the node is overallocated.
|
||||
This is a percentage of the total pages in each zone. Zone reclaim will
|
||||
only occur if more than this percentage of pages are in a state that
|
||||
zone_reclaim_mode allows to be reclaimed.
|
||||
|
||||
If zone_reclaim_mode has the value 4 OR'd, then the percentage is compared
|
||||
against all file-backed unmapped pages including swapcache pages and tmpfs
|
||||
files. Otherwise, only unmapped pages backed by normal files but not tmpfs
|
||||
files and similar are considered.
|
||||
|
||||
The default is 1 percent.
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ Copyright 2008 Red Hat Inc.
|
|||
(dual licensed under the GPL v2)
|
||||
Reviewers: Elias Oltmanns, Randy Dunlap, Andrew Morton,
|
||||
John Kacur, and David Teigland.
|
||||
|
||||
Written for: 2.6.28-rc2
|
||||
|
||||
Introduction
|
||||
|
@ -33,13 +32,26 @@ The File System
|
|||
Ftrace uses the debugfs file system to hold the control files as
|
||||
well as the files to display output.
|
||||
|
||||
To mount the debugfs system:
|
||||
When debugfs is configured into the kernel (which selecting any ftrace
|
||||
option will do) the directory /sys/kernel/debug will be created. To mount
|
||||
this directory, you can add to your /etc/fstab file:
|
||||
|
||||
# mkdir /debug
|
||||
# mount -t debugfs nodev /debug
|
||||
debugfs /sys/kernel/debug debugfs defaults 0 0
|
||||
|
||||
( Note: it is more common to mount at /sys/kernel/debug, but for
|
||||
simplicity this document will use /debug)
|
||||
Or you can mount it at run time with:
|
||||
|
||||
mount -t debugfs nodev /sys/kernel/debug
|
||||
|
||||
For quicker access to that directory you may want to make a soft link to
|
||||
it:
|
||||
|
||||
ln -s /sys/kernel/debug /debug
|
||||
|
||||
Any selected ftrace option will also create a directory called tracing
|
||||
within the debugfs. The rest of the document will assume that you are in
|
||||
the ftrace directory (cd /sys/kernel/debug/tracing) and will only concentrate
|
||||
on the files within that directory and not distract from the content with
|
||||
the extended "/sys/kernel/debug/tracing" path name.
|
||||
|
||||
That's it! (assuming that you have ftrace configured into your kernel)
|
||||
|
||||
|
@ -389,18 +401,18 @@ trace_options
|
|||
The trace_options file is used to control what gets printed in
|
||||
the trace output. To see what is available, simply cat the file:
|
||||
|
||||
cat /debug/tracing/trace_options
|
||||
cat trace_options
|
||||
print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \
|
||||
noblock nostacktrace nosched-tree nouserstacktrace nosym-userobj
|
||||
|
||||
To disable one of the options, echo in the option prepended with
|
||||
"no".
|
||||
|
||||
echo noprint-parent > /debug/tracing/trace_options
|
||||
echo noprint-parent > trace_options
|
||||
|
||||
To enable an option, leave off the "no".
|
||||
|
||||
echo sym-offset > /debug/tracing/trace_options
|
||||
echo sym-offset > trace_options
|
||||
|
||||
Here are the available options:
|
||||
|
||||
|
@ -476,11 +488,11 @@ sched_switch
|
|||
This tracer simply records schedule switches. Here is an example
|
||||
of how to use it.
|
||||
|
||||
# echo sched_switch > /debug/tracing/current_tracer
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
# echo sched_switch > current_tracer
|
||||
# echo 1 > tracing_enabled
|
||||
# sleep 1
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat trace
|
||||
|
||||
# tracer: sched_switch
|
||||
#
|
||||
|
@ -583,13 +595,13 @@ new trace is saved.
|
|||
To reset the maximum, echo 0 into tracing_max_latency. Here is
|
||||
an example:
|
||||
|
||||
# echo irqsoff > /debug/tracing/current_tracer
|
||||
# echo 0 > /debug/tracing/tracing_max_latency
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
# echo irqsoff > current_tracer
|
||||
# echo 0 > tracing_max_latency
|
||||
# echo 1 > tracing_enabled
|
||||
# ls -ltr
|
||||
[...]
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/latency_trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat latency_trace
|
||||
# tracer: irqsoff
|
||||
#
|
||||
irqsoff latency trace v1.1.5 on 2.6.26
|
||||
|
@ -690,13 +702,13 @@ Like the irqsoff tracer, it records the maximum latency for
|
|||
which preemption was disabled. The control of preemptoff tracer
|
||||
is much like the irqsoff tracer.
|
||||
|
||||
# echo preemptoff > /debug/tracing/current_tracer
|
||||
# echo 0 > /debug/tracing/tracing_max_latency
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
# echo preemptoff > current_tracer
|
||||
# echo 0 > tracing_max_latency
|
||||
# echo 1 > tracing_enabled
|
||||
# ls -ltr
|
||||
[...]
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/latency_trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat latency_trace
|
||||
# tracer: preemptoff
|
||||
#
|
||||
preemptoff latency trace v1.1.5 on 2.6.26-rc8
|
||||
|
@ -837,13 +849,13 @@ tracer.
|
|||
Again, using this trace is much like the irqsoff and preemptoff
|
||||
tracers.
|
||||
|
||||
# echo preemptirqsoff > /debug/tracing/current_tracer
|
||||
# echo 0 > /debug/tracing/tracing_max_latency
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
# echo preemptirqsoff > current_tracer
|
||||
# echo 0 > tracing_max_latency
|
||||
# echo 1 > tracing_enabled
|
||||
# ls -ltr
|
||||
[...]
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/latency_trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat latency_trace
|
||||
# tracer: preemptirqsoff
|
||||
#
|
||||
preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8
|
||||
|
@ -999,12 +1011,12 @@ slightly differently than we did with the previous tracers.
|
|||
Instead of performing an 'ls', we will run 'sleep 1' under
|
||||
'chrt' which changes the priority of the task.
|
||||
|
||||
# echo wakeup > /debug/tracing/current_tracer
|
||||
# echo 0 > /debug/tracing/tracing_max_latency
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
# echo wakeup > current_tracer
|
||||
# echo 0 > tracing_max_latency
|
||||
# echo 1 > tracing_enabled
|
||||
# chrt -f 5 sleep 1
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/latency_trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat latency_trace
|
||||
# tracer: wakeup
|
||||
#
|
||||
wakeup latency trace v1.1.5 on 2.6.26-rc8
|
||||
|
@ -1114,11 +1126,11 @@ can be done from the debug file system. Make sure the
|
|||
ftrace_enabled is set; otherwise this tracer is a nop.
|
||||
|
||||
# sysctl kernel.ftrace_enabled=1
|
||||
# echo function > /debug/tracing/current_tracer
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
# echo function > current_tracer
|
||||
# echo 1 > tracing_enabled
|
||||
# usleep 1
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat trace
|
||||
# tracer: function
|
||||
#
|
||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||
|
@ -1155,7 +1167,7 @@ int trace_fd;
|
|||
[...]
|
||||
int main(int argc, char *argv[]) {
|
||||
[...]
|
||||
trace_fd = open("/debug/tracing/tracing_enabled", O_WRONLY);
|
||||
trace_fd = open(tracing_file("tracing_enabled"), O_WRONLY);
|
||||
[...]
|
||||
if (condition_hit()) {
|
||||
write(trace_fd, "0", 1);
|
||||
|
@ -1163,26 +1175,20 @@ int main(int argc, char *argv[]) {
|
|||
[...]
|
||||
}
|
||||
|
||||
Note: Here we hard coded the path name. The debugfs mount is not
|
||||
guaranteed to be at /debug (and is more commonly at
|
||||
/sys/kernel/debug). For simple one time traces, the above is
|
||||
sufficent. For anything else, a search through /proc/mounts may
|
||||
be needed to find where the debugfs file-system is mounted.
|
||||
|
||||
|
||||
Single thread tracing
|
||||
---------------------
|
||||
|
||||
By writing into /debug/tracing/set_ftrace_pid you can trace a
|
||||
By writing into set_ftrace_pid you can trace a
|
||||
single thread. For example:
|
||||
|
||||
# cat /debug/tracing/set_ftrace_pid
|
||||
# cat set_ftrace_pid
|
||||
no pid
|
||||
# echo 3111 > /debug/tracing/set_ftrace_pid
|
||||
# cat /debug/tracing/set_ftrace_pid
|
||||
# echo 3111 > set_ftrace_pid
|
||||
# cat set_ftrace_pid
|
||||
3111
|
||||
# echo function > /debug/tracing/current_tracer
|
||||
# cat /debug/tracing/trace | head
|
||||
# echo function > current_tracer
|
||||
# cat trace | head
|
||||
# tracer: function
|
||||
#
|
||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||
|
@ -1193,8 +1199,8 @@ no pid
|
|||
yum-updatesd-3111 [003] 1637.254683: lock_hrtimer_base <-hrtimer_try_to_cancel
|
||||
yum-updatesd-3111 [003] 1637.254685: fget_light <-do_sys_poll
|
||||
yum-updatesd-3111 [003] 1637.254686: pipe_poll <-do_sys_poll
|
||||
# echo -1 > /debug/tracing/set_ftrace_pid
|
||||
# cat /debug/tracing/trace |head
|
||||
# echo -1 > set_ftrace_pid
|
||||
# cat trace |head
|
||||
# tracer: function
|
||||
#
|
||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||
|
@ -1216,6 +1222,51 @@ something like this simple program:
|
|||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define _STR(x) #x
|
||||
#define STR(x) _STR(x)
|
||||
#define MAX_PATH 256
|
||||
|
||||
const char *find_debugfs(void)
|
||||
{
|
||||
static char debugfs[MAX_PATH+1];
|
||||
static int debugfs_found;
|
||||
char type[100];
|
||||
FILE *fp;
|
||||
|
||||
if (debugfs_found)
|
||||
return debugfs;
|
||||
|
||||
if ((fp = fopen("/proc/mounts","r")) == NULL) {
|
||||
perror("/proc/mounts");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (fscanf(fp, "%*s %"
|
||||
STR(MAX_PATH)
|
||||
"s %99s %*s %*d %*d\n",
|
||||
debugfs, type) == 2) {
|
||||
if (strcmp(type, "debugfs") == 0)
|
||||
break;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
if (strcmp(type, "debugfs") != 0) {
|
||||
fprintf(stderr, "debugfs not mounted");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
debugfs_found = 1;
|
||||
|
||||
return debugfs;
|
||||
}
|
||||
|
||||
const char *tracing_file(const char *file_name)
|
||||
{
|
||||
static char trace_file[MAX_PATH+1];
|
||||
snprintf(trace_file, MAX_PATH, "%s/%s", find_debugfs(), file_name);
|
||||
return trace_file;
|
||||
}
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
if (argc < 1)
|
||||
|
@ -1226,12 +1277,12 @@ int main (int argc, char **argv)
|
|||
char line[64];
|
||||
int s;
|
||||
|
||||
ffd = open("/debug/tracing/current_tracer", O_WRONLY);
|
||||
ffd = open(tracing_file("current_tracer"), O_WRONLY);
|
||||
if (ffd < 0)
|
||||
exit(-1);
|
||||
write(ffd, "nop", 3);
|
||||
|
||||
fd = open("/debug/tracing/set_ftrace_pid", O_WRONLY);
|
||||
fd = open(tracing_file("set_ftrace_pid"), O_WRONLY);
|
||||
s = sprintf(line, "%d\n", getpid());
|
||||
write(fd, line, s);
|
||||
|
||||
|
@ -1383,22 +1434,22 @@ want, depending on your needs.
|
|||
tracing_cpu_mask file) or you might sometimes see unordered
|
||||
function calls while cpu tracing switch.
|
||||
|
||||
hide: echo nofuncgraph-cpu > /debug/tracing/trace_options
|
||||
show: echo funcgraph-cpu > /debug/tracing/trace_options
|
||||
hide: echo nofuncgraph-cpu > trace_options
|
||||
show: echo funcgraph-cpu > trace_options
|
||||
|
||||
- The duration (function's time of execution) is displayed on
|
||||
the closing bracket line of a function or on the same line
|
||||
than the current function in case of a leaf one. It is default
|
||||
enabled.
|
||||
|
||||
hide: echo nofuncgraph-duration > /debug/tracing/trace_options
|
||||
show: echo funcgraph-duration > /debug/tracing/trace_options
|
||||
hide: echo nofuncgraph-duration > trace_options
|
||||
show: echo funcgraph-duration > trace_options
|
||||
|
||||
- The overhead field precedes the duration field in case of
|
||||
reached duration thresholds.
|
||||
|
||||
hide: echo nofuncgraph-overhead > /debug/tracing/trace_options
|
||||
show: echo funcgraph-overhead > /debug/tracing/trace_options
|
||||
hide: echo nofuncgraph-overhead > trace_options
|
||||
show: echo funcgraph-overhead > trace_options
|
||||
depends on: funcgraph-duration
|
||||
|
||||
ie:
|
||||
|
@ -1427,8 +1478,8 @@ want, depending on your needs.
|
|||
- The task/pid field displays the thread cmdline and pid which
|
||||
executed the function. It is default disabled.
|
||||
|
||||
hide: echo nofuncgraph-proc > /debug/tracing/trace_options
|
||||
show: echo funcgraph-proc > /debug/tracing/trace_options
|
||||
hide: echo nofuncgraph-proc > trace_options
|
||||
show: echo funcgraph-proc > trace_options
|
||||
|
||||
ie:
|
||||
|
||||
|
@ -1451,8 +1502,8 @@ want, depending on your needs.
|
|||
system clock since it started. A snapshot of this time is
|
||||
given on each entry/exit of functions
|
||||
|
||||
hide: echo nofuncgraph-abstime > /debug/tracing/trace_options
|
||||
show: echo funcgraph-abstime > /debug/tracing/trace_options
|
||||
hide: echo nofuncgraph-abstime > trace_options
|
||||
show: echo funcgraph-abstime > trace_options
|
||||
|
||||
ie:
|
||||
|
||||
|
@ -1549,7 +1600,7 @@ listed in:
|
|||
|
||||
available_filter_functions
|
||||
|
||||
# cat /debug/tracing/available_filter_functions
|
||||
# cat available_filter_functions
|
||||
put_prev_task_idle
|
||||
kmem_cache_create
|
||||
pick_next_task_rt
|
||||
|
@ -1561,12 +1612,12 @@ mutex_lock
|
|||
If I am only interested in sys_nanosleep and hrtimer_interrupt:
|
||||
|
||||
# echo sys_nanosleep hrtimer_interrupt \
|
||||
> /debug/tracing/set_ftrace_filter
|
||||
# echo ftrace > /debug/tracing/current_tracer
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
> set_ftrace_filter
|
||||
# echo ftrace > current_tracer
|
||||
# echo 1 > tracing_enabled
|
||||
# usleep 1
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat trace
|
||||
# tracer: ftrace
|
||||
#
|
||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||
|
@ -1577,7 +1628,7 @@ If I am only interested in sys_nanosleep and hrtimer_interrupt:
|
|||
|
||||
To see which functions are being traced, you can cat the file:
|
||||
|
||||
# cat /debug/tracing/set_ftrace_filter
|
||||
# cat set_ftrace_filter
|
||||
hrtimer_interrupt
|
||||
sys_nanosleep
|
||||
|
||||
|
@ -1597,7 +1648,7 @@ Note: It is better to use quotes to enclose the wild cards,
|
|||
otherwise the shell may expand the parameters into names
|
||||
of files in the local directory.
|
||||
|
||||
# echo 'hrtimer_*' > /debug/tracing/set_ftrace_filter
|
||||
# echo 'hrtimer_*' > set_ftrace_filter
|
||||
|
||||
Produces:
|
||||
|
||||
|
@ -1618,7 +1669,7 @@ Produces:
|
|||
|
||||
Notice that we lost the sys_nanosleep.
|
||||
|
||||
# cat /debug/tracing/set_ftrace_filter
|
||||
# cat set_ftrace_filter
|
||||
hrtimer_run_queues
|
||||
hrtimer_run_pending
|
||||
hrtimer_init
|
||||
|
@ -1644,17 +1695,17 @@ To append to the filters, use '>>'
|
|||
To clear out a filter so that all functions will be recorded
|
||||
again:
|
||||
|
||||
# echo > /debug/tracing/set_ftrace_filter
|
||||
# cat /debug/tracing/set_ftrace_filter
|
||||
# echo > set_ftrace_filter
|
||||
# cat set_ftrace_filter
|
||||
#
|
||||
|
||||
Again, now we want to append.
|
||||
|
||||
# echo sys_nanosleep > /debug/tracing/set_ftrace_filter
|
||||
# cat /debug/tracing/set_ftrace_filter
|
||||
# echo sys_nanosleep > set_ftrace_filter
|
||||
# cat set_ftrace_filter
|
||||
sys_nanosleep
|
||||
# echo 'hrtimer_*' >> /debug/tracing/set_ftrace_filter
|
||||
# cat /debug/tracing/set_ftrace_filter
|
||||
# echo 'hrtimer_*' >> set_ftrace_filter
|
||||
# cat set_ftrace_filter
|
||||
hrtimer_run_queues
|
||||
hrtimer_run_pending
|
||||
hrtimer_init
|
||||
|
@ -1677,7 +1728,7 @@ hrtimer_init_sleeper
|
|||
The set_ftrace_notrace prevents those functions from being
|
||||
traced.
|
||||
|
||||
# echo '*preempt*' '*lock*' > /debug/tracing/set_ftrace_notrace
|
||||
# echo '*preempt*' '*lock*' > set_ftrace_notrace
|
||||
|
||||
Produces:
|
||||
|
||||
|
@ -1767,13 +1818,13 @@ the effect on the tracing is different. Every read from
|
|||
trace_pipe is consumed. This means that subsequent reads will be
|
||||
different. The trace is live.
|
||||
|
||||
# echo function > /debug/tracing/current_tracer
|
||||
# cat /debug/tracing/trace_pipe > /tmp/trace.out &
|
||||
# echo function > current_tracer
|
||||
# cat trace_pipe > /tmp/trace.out &
|
||||
[1] 4153
|
||||
# echo 1 > /debug/tracing/tracing_enabled
|
||||
# echo 1 > tracing_enabled
|
||||
# usleep 1
|
||||
# echo 0 > /debug/tracing/tracing_enabled
|
||||
# cat /debug/tracing/trace
|
||||
# echo 0 > tracing_enabled
|
||||
# cat trace
|
||||
# tracer: function
|
||||
#
|
||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||
|
@ -1809,7 +1860,7 @@ number listed is the number of entries that can be recorded per
|
|||
CPU. To know the full size, multiply the number of possible CPUS
|
||||
with the number of entries.
|
||||
|
||||
# cat /debug/tracing/buffer_size_kb
|
||||
# cat buffer_size_kb
|
||||
1408 (units kilobytes)
|
||||
|
||||
Note, to modify this, you must have tracing completely disabled.
|
||||
|
@ -1817,18 +1868,18 @@ To do that, echo "nop" into the current_tracer. If the
|
|||
current_tracer is not set to "nop", an EINVAL error will be
|
||||
returned.
|
||||
|
||||
# echo nop > /debug/tracing/current_tracer
|
||||
# echo 10000 > /debug/tracing/buffer_size_kb
|
||||
# cat /debug/tracing/buffer_size_kb
|
||||
# echo nop > current_tracer
|
||||
# echo 10000 > buffer_size_kb
|
||||
# cat buffer_size_kb
|
||||
10000 (units kilobytes)
|
||||
|
||||
The number of pages which will be allocated is limited to a
|
||||
percentage of available memory. Allocating too much will produce
|
||||
an error.
|
||||
|
||||
# echo 1000000000000 > /debug/tracing/buffer_size_kb
|
||||
# echo 1000000000000 > buffer_size_kb
|
||||
-bash: echo: write error: Cannot allocate memory
|
||||
# cat /debug/tracing/buffer_size_kb
|
||||
# cat buffer_size_kb
|
||||
85
|
||||
|
||||
-----------
|
||||
|
|
|
@ -32,41 +32,41 @@ is no way to automatically detect if you are losing events due to CPUs racing.
|
|||
Usage Quick Reference
|
||||
---------------------
|
||||
|
||||
$ mount -t debugfs debugfs /debug
|
||||
$ echo mmiotrace > /debug/tracing/current_tracer
|
||||
$ cat /debug/tracing/trace_pipe > mydump.txt &
|
||||
$ mount -t debugfs debugfs /sys/kernel/debug
|
||||
$ echo mmiotrace > /sys/kernel/debug/tracing/current_tracer
|
||||
$ cat /sys/kernel/debug/tracing/trace_pipe > mydump.txt &
|
||||
Start X or whatever.
|
||||
$ echo "X is up" > /debug/tracing/trace_marker
|
||||
$ echo nop > /debug/tracing/current_tracer
|
||||
$ echo "X is up" > /sys/kernel/debug/tracing/trace_marker
|
||||
$ echo nop > /sys/kernel/debug/tracing/current_tracer
|
||||
Check for lost events.
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Make sure debugfs is mounted to /debug. If not, (requires root privileges)
|
||||
$ mount -t debugfs debugfs /debug
|
||||
Make sure debugfs is mounted to /sys/kernel/debug. If not, (requires root privileges)
|
||||
$ mount -t debugfs debugfs /sys/kernel/debug
|
||||
|
||||
Check that the driver you are about to trace is not loaded.
|
||||
|
||||
Activate mmiotrace (requires root privileges):
|
||||
$ echo mmiotrace > /debug/tracing/current_tracer
|
||||
$ echo mmiotrace > /sys/kernel/debug/tracing/current_tracer
|
||||
|
||||
Start storing the trace:
|
||||
$ cat /debug/tracing/trace_pipe > mydump.txt &
|
||||
$ cat /sys/kernel/debug/tracing/trace_pipe > mydump.txt &
|
||||
The 'cat' process should stay running (sleeping) in the background.
|
||||
|
||||
Load the driver you want to trace and use it. Mmiotrace will only catch MMIO
|
||||
accesses to areas that are ioremapped while mmiotrace is active.
|
||||
|
||||
During tracing you can place comments (markers) into the trace by
|
||||
$ echo "X is up" > /debug/tracing/trace_marker
|
||||
$ echo "X is up" > /sys/kernel/debug/tracing/trace_marker
|
||||
This makes it easier to see which part of the (huge) trace corresponds to
|
||||
which action. It is recommended to place descriptive markers about what you
|
||||
do.
|
||||
|
||||
Shut down mmiotrace (requires root privileges):
|
||||
$ echo nop > /debug/tracing/current_tracer
|
||||
$ echo nop > /sys/kernel/debug/tracing/current_tracer
|
||||
The 'cat' process exits. If it does not, kill it by issuing 'fg' command and
|
||||
pressing ctrl+c.
|
||||
|
||||
|
@ -78,10 +78,10 @@ to view your kernel log and look for "mmiotrace has lost events" warning. If
|
|||
events were lost, the trace is incomplete. You should enlarge the buffers and
|
||||
try again. Buffers are enlarged by first seeing how large the current buffers
|
||||
are:
|
||||
$ cat /debug/tracing/buffer_size_kb
|
||||
$ cat /sys/kernel/debug/tracing/buffer_size_kb
|
||||
gives you a number. Approximately double this number and write it back, for
|
||||
instance:
|
||||
$ echo 128000 > /debug/tracing/buffer_size_kb
|
||||
$ echo 128000 > /sys/kernel/debug/tracing/buffer_size_kb
|
||||
Then start again from the top.
|
||||
|
||||
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
||||
|
|
|
@ -16,3 +16,8 @@
|
|||
15 -> TeVii S470 [d470:9022]
|
||||
16 -> DVBWorld DVB-S2 2005 [0001:2005]
|
||||
17 -> NetUP Dual DVB-S2 CI [1b55:2a2c]
|
||||
18 -> Hauppauge WinTV-HVR1270 [0070:2211]
|
||||
19 -> Hauppauge WinTV-HVR1275 [0070:2215]
|
||||
20 -> Hauppauge WinTV-HVR1255 [0070:2251]
|
||||
21 -> Hauppauge WinTV-HVR1210 [0070:2291,0070:2295]
|
||||
22 -> Mygica X8506 DMB-TH [14f1:8651]
|
||||
|
|
|
@ -78,3 +78,5 @@
|
|||
77 -> TBS 8910 DVB-S [8910:8888]
|
||||
78 -> Prof 6200 DVB-S [b022:3022]
|
||||
79 -> Terratec Cinergy HT PCI MKII [153b:1177]
|
||||
80 -> Hauppauge WinTV-IR Only [0070:9290]
|
||||
81 -> Leadtek WinFast DTV1800 Hybrid [107d:6654]
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
16 -> Hauppauge WinTV HVR 950 (em2883) [2040:6513,2040:6517,2040:651b]
|
||||
17 -> Pinnacle PCTV HD Pro Stick (em2880) [2304:0227]
|
||||
18 -> Hauppauge WinTV HVR 900 (R2) (em2880) [2040:6502]
|
||||
19 -> PointNix Intra-Oral Camera (em2860)
|
||||
19 -> EM2860/SAA711X Reference Design (em2860)
|
||||
20 -> AMD ATI TV Wonder HD 600 (em2880) [0438:b002]
|
||||
21 -> eMPIA Technology, Inc. GrabBeeX+ Video Encoder (em2800) [eb1a:2801]
|
||||
22 -> Unknown EM2750/EM2751 webcam grabber (em2750) [eb1a:2750,eb1a:2751]
|
||||
|
@ -61,3 +61,7 @@
|
|||
63 -> Kaiomy TVnPC U2 (em2860) [eb1a:e303]
|
||||
64 -> Easy Cap Capture DC-60 (em2860)
|
||||
65 -> IO-DATA GV-MVP/SZ (em2820/em2840) [04bb:0515]
|
||||
66 -> Empire dual TV (em2880)
|
||||
67 -> Terratec Grabby (em2860) [0ccd:0096]
|
||||
68 -> Terratec AV350 (em2860) [0ccd:0084]
|
||||
69 -> KWorld ATSC 315U HDTV TV Box (em2882) [eb1a:a313]
|
||||
|
|
|
@ -124,10 +124,10 @@
|
|||
123 -> Beholder BeholdTV 407 [0000:4070]
|
||||
124 -> Beholder BeholdTV 407 FM [0000:4071]
|
||||
125 -> Beholder BeholdTV 409 [0000:4090]
|
||||
126 -> Beholder BeholdTV 505 FM/RDS [0000:5051,0000:505B,5ace:5050]
|
||||
127 -> Beholder BeholdTV 507 FM/RDS / BeholdTV 509 FM [0000:5071,0000:507B,5ace:5070,5ace:5090]
|
||||
126 -> Beholder BeholdTV 505 FM [5ace:5050]
|
||||
127 -> Beholder BeholdTV 507 FM / BeholdTV 509 FM [5ace:5070,5ace:5090]
|
||||
128 -> Beholder BeholdTV Columbus TVFM [0000:5201]
|
||||
129 -> Beholder BeholdTV 607 / BeholdTV 609 [5ace:6070,5ace:6071,5ace:6072,5ace:6073,5ace:6090,5ace:6091,5ace:6092,5ace:6093]
|
||||
129 -> Beholder BeholdTV 607 FM [5ace:6070]
|
||||
130 -> Beholder BeholdTV M6 [5ace:6190]
|
||||
131 -> Twinhan Hybrid DTV-DVB 3056 PCI [1822:0022]
|
||||
132 -> Genius TVGO AM11MCE
|
||||
|
@ -143,7 +143,7 @@
|
|||
142 -> Beholder BeholdTV H6 [5ace:6290]
|
||||
143 -> Beholder BeholdTV M63 [5ace:6191]
|
||||
144 -> Beholder BeholdTV M6 Extra [5ace:6193]
|
||||
145 -> AVerMedia MiniPCI DVB-T Hybrid M103 [1461:f636]
|
||||
145 -> AVerMedia MiniPCI DVB-T Hybrid M103 [1461:f636,1461:f736]
|
||||
146 -> ASUSTeK P7131 Analog
|
||||
147 -> Asus Tiger 3in1 [1043:4878]
|
||||
148 -> Encore ENLTV-FM v5.3 [1a7f:2008]
|
||||
|
@ -154,4 +154,16 @@
|
|||
153 -> Kworld Plus TV Analog Lite PCI [17de:7128]
|
||||
154 -> Avermedia AVerTV GO 007 FM Plus [1461:f31d]
|
||||
155 -> Hauppauge WinTV-HVR1120 ATSC/QAM-Hybrid [0070:6706,0070:6708]
|
||||
156 -> Hauppauge WinTV-HVR1110r3 [0070:6707,0070:6709,0070:670a]
|
||||
156 -> Hauppauge WinTV-HVR1110r3 DVB-T/Hybrid [0070:6707,0070:6709,0070:670a]
|
||||
157 -> Avermedia AVerTV Studio 507UA [1461:a11b]
|
||||
158 -> AVerMedia Cardbus TV/Radio (E501R) [1461:b7e9]
|
||||
159 -> Beholder BeholdTV 505 RDS [0000:505B]
|
||||
160 -> Beholder BeholdTV 507 RDS [0000:5071]
|
||||
161 -> Beholder BeholdTV 507 RDS [0000:507B]
|
||||
162 -> Beholder BeholdTV 607 FM [5ace:6071]
|
||||
163 -> Beholder BeholdTV 609 FM [5ace:6090]
|
||||
164 -> Beholder BeholdTV 609 FM [5ace:6091]
|
||||
165 -> Beholder BeholdTV 607 RDS [5ace:6072]
|
||||
166 -> Beholder BeholdTV 607 RDS [5ace:6073]
|
||||
167 -> Beholder BeholdTV 609 RDS [5ace:6092]
|
||||
168 -> Beholder BeholdTV 609 RDS [5ace:6093]
|
||||
|
|
|
@ -76,3 +76,5 @@ tuner=75 - Philips TEA5761 FM Radio
|
|||
tuner=76 - Xceive 5000 tuner
|
||||
tuner=77 - TCL tuner MF02GIP-5N-E
|
||||
tuner=78 - Philips FMD1216MEX MK3 Hybrid Tuner
|
||||
tuner=79 - Philips PAL/SECAM multi (FM1216 MK5)
|
||||
tuner=80 - Philips FQ1216LME MK3 PAL/SECAM w/active loopthrough
|
||||
|
|
|
@ -163,10 +163,11 @@ sunplus 055f:c650 Mustek MDC5500Z
|
|||
zc3xx 055f:d003 Mustek WCam300A
|
||||
zc3xx 055f:d004 Mustek WCam300 AN
|
||||
conex 0572:0041 Creative Notebook cx11646
|
||||
ov519 05a9:0519 OmniVision
|
||||
ov519 05a9:0519 OV519 Microphone
|
||||
ov519 05a9:0530 OmniVision
|
||||
ov519 05a9:4519 OmniVision
|
||||
ov519 05a9:4519 Webcam Classic
|
||||
ov519 05a9:8519 OmniVision
|
||||
ov519 05a9:a518 D-Link DSB-C310 Webcam
|
||||
sunplus 05da:1018 Digital Dream Enigma 1.3
|
||||
stk014 05e1:0893 Syntek DV4000
|
||||
spca561 060b:a001 Maxell Compact Pc PM3
|
||||
|
@ -178,6 +179,7 @@ spca506 06e1:a190 ADS Instant VCD
|
|||
ov534 06f8:3002 Hercules Blog Webcam
|
||||
ov534 06f8:3003 Hercules Dualpix HD Weblog
|
||||
sonixj 06f8:3004 Hercules Classic Silver
|
||||
sonixj 06f8:3008 Hercules Deluxe Optical Glass
|
||||
spca508 0733:0110 ViewQuest VQ110
|
||||
spca508 0130:0130 Clone Digital Webcam 11043
|
||||
spca501 0733:0401 Intel Create and Share
|
||||
|
@ -209,6 +211,7 @@ sunplus 08ca:2050 Medion MD 41437
|
|||
sunplus 08ca:2060 Aiptek PocketDV5300
|
||||
tv8532 0923:010f ICM532 cams
|
||||
mars 093a:050f Mars-Semi Pc-Camera
|
||||
mr97310a 093a:010f Sakar Digital no. 77379
|
||||
pac207 093a:2460 Qtec Webcam 100
|
||||
pac207 093a:2461 HP Webcam
|
||||
pac207 093a:2463 Philips SPC 220 NC
|
||||
|
@ -265,6 +268,11 @@ sonixj 0c45:60ec SN9C105+MO4000
|
|||
sonixj 0c45:60fb Surfer NoName
|
||||
sonixj 0c45:60fc LG-LIC300
|
||||
sonixj 0c45:60fe Microdia Audio
|
||||
sonixj 0c45:6100 PC Camera (SN9C128)
|
||||
sonixj 0c45:610a PC Camera (SN9C128)
|
||||
sonixj 0c45:610b PC Camera (SN9C128)
|
||||
sonixj 0c45:610c PC Camera (SN9C128)
|
||||
sonixj 0c45:610e PC Camera (SN9C128)
|
||||
sonixj 0c45:6128 Microdia/Sonix SNP325
|
||||
sonixj 0c45:612a Avant Camera
|
||||
sonixj 0c45:612c Typhoon Rasy Cam 1.3MPix
|
||||
|
|
|
@ -26,6 +26,55 @@ Global video workflow
|
|||
|
||||
Once the last buffer is filled in, the QCI interface stops.
|
||||
|
||||
c) Capture global finite state machine schema
|
||||
|
||||
+----+ +---+ +----+
|
||||
| DQ | | Q | | DQ |
|
||||
| v | v | v
|
||||
+-----------+ +------------------------+
|
||||
| STOP | | Wait for capture start |
|
||||
+-----------+ Q +------------------------+
|
||||
+-> | QCI: stop | ------------------> | QCI: run | <------------+
|
||||
| | DMA: stop | | DMA: stop | |
|
||||
| +-----------+ +-----> +------------------------+ |
|
||||
| / | |
|
||||
| / +---+ +----+ | |
|
||||
|capture list empty / | Q | | DQ | | QCI Irq EOF |
|
||||
| / | v | v v |
|
||||
| +--------------------+ +----------------------+ |
|
||||
| | DMA hotlink missed | | Capture running | |
|
||||
| +--------------------+ +----------------------+ |
|
||||
| | QCI: run | +-----> | QCI: run | <-+ |
|
||||
| | DMA: stop | / | DMA: run | | |
|
||||
| +--------------------+ / +----------------------+ | Other |
|
||||
| ^ /DMA still | | channels |
|
||||
| | capture list / running | DMA Irq End | not |
|
||||
| | not empty / | | finished |
|
||||
| | / v | yet |
|
||||
| +----------------------+ +----------------------+ | |
|
||||
| | Videobuf released | | Channel completed | | |
|
||||
| +----------------------+ +----------------------+ | |
|
||||
+-- | QCI: run | | QCI: run | --+ |
|
||||
| DMA: run | | DMA: run | |
|
||||
+----------------------+ +----------------------+ |
|
||||
^ / | |
|
||||
| no overrun / | overrun |
|
||||
| / v |
|
||||
+--------------------+ / +----------------------+ |
|
||||
| Frame completed | / | Frame overran | |
|
||||
+--------------------+ <-----+ +----------------------+ restart frame |
|
||||
| QCI: run | | QCI: stop | --------------+
|
||||
| DMA: run | | DMA: stop |
|
||||
+--------------------+ +----------------------+
|
||||
|
||||
Legend: - each box is a FSM state
|
||||
- each arrow is the condition to transition to another state
|
||||
- an arrow with a comment is a mandatory transition (no condition)
|
||||
- arrow "Q" means : a buffer was enqueued
|
||||
- arrow "DQ" means : a buffer was dequeued
|
||||
- "QCI: stop" means the QCI interface is not enabled
|
||||
- "DMA: stop" means all 3 DMA channels are stopped
|
||||
- "DMA: run" means at least 1 DMA channel is still running
|
||||
|
||||
DMA usage
|
||||
---------
|
||||
|
|
|
@ -89,6 +89,11 @@ from dev (driver name followed by the bus_id, to be precise). If you set it
|
|||
up before calling v4l2_device_register then it will be untouched. If dev is
|
||||
NULL, then you *must* setup v4l2_dev->name before calling v4l2_device_register.
|
||||
|
||||
You can use v4l2_device_set_name() to set the name based on a driver name and
|
||||
a driver-global atomic_t instance. This will generate names like ivtv0, ivtv1,
|
||||
etc. If the name ends with a digit, then it will insert a dash: cx18-0,
|
||||
cx18-1, etc. This function returns the instance number.
|
||||
|
||||
The first 'dev' argument is normally the struct device pointer of a pci_dev,
|
||||
usb_interface or platform_device. It is rare for dev to be NULL, but it happens
|
||||
with ISA devices or when one device creates multiple PCI devices, thus making
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
obj- := dummy.o
|
||||
|
||||
# List of programs to build
|
||||
hostprogs-y := slabinfo
|
||||
hostprogs-y := slabinfo page-types
|
||||
|
||||
# Tell kbuild to always build the programs
|
||||
always := $(hostprogs-y)
|
||||
|
|
|
@ -75,15 +75,15 @@ Page stealing from process memory and shm is done if stealing the page would
|
|||
alleviate memory pressure on any zone in the page's node that has fallen below
|
||||
its watermark.
|
||||
|
||||
pages_min/pages_low/pages_high/low_on_memory/zone_wake_kswapd: These are
|
||||
per-zone fields, used to determine when a zone needs to be balanced. When
|
||||
the number of pages falls below pages_min, the hysteric field low_on_memory
|
||||
gets set. This stays set till the number of free pages becomes pages_high.
|
||||
When low_on_memory is set, page allocation requests will try to free some
|
||||
pages in the zone (providing GFP_WAIT is set in the request). Orthogonal
|
||||
to this, is the decision to poke kswapd to free some zone pages. That
|
||||
decision is not hysteresis based, and is done when the number of free
|
||||
pages is below pages_low; in which case zone_wake_kswapd is also set.
|
||||
watemark[WMARK_MIN/WMARK_LOW/WMARK_HIGH]/low_on_memory/zone_wake_kswapd: These
|
||||
are per-zone fields, used to determine when a zone needs to be balanced. When
|
||||
the number of pages falls below watermark[WMARK_MIN], the hysteric field
|
||||
low_on_memory gets set. This stays set till the number of free pages becomes
|
||||
watermark[WMARK_HIGH]. When low_on_memory is set, page allocation requests will
|
||||
try to free some pages in the zone (providing GFP_WAIT is set in the request).
|
||||
Orthogonal to this, is the decision to poke kswapd to free some zone pages.
|
||||
That decision is not hysteresis based, and is done when the number of free
|
||||
pages is below watermark[WMARK_LOW]; in which case zone_wake_kswapd is also set.
|
||||
|
||||
|
||||
(Good) Ideas that I have heard:
|
||||
|
|
698
Documentation/vm/page-types.c
Normal file
698
Documentation/vm/page-types.c
Normal file
|
@ -0,0 +1,698 @@
|
|||
/*
|
||||
* page-types: Tool for querying page flags
|
||||
*
|
||||
* Copyright (C) 2009 Intel corporation
|
||||
* Copyright (C) 2009 Wu Fengguang <fengguang.wu@intel.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
|
||||
/*
|
||||
* kernel page flags
|
||||
*/
|
||||
|
||||
#define KPF_BYTES 8
|
||||
#define PROC_KPAGEFLAGS "/proc/kpageflags"
|
||||
|
||||
/* copied from kpageflags_read() */
|
||||
#define KPF_LOCKED 0
|
||||
#define KPF_ERROR 1
|
||||
#define KPF_REFERENCED 2
|
||||
#define KPF_UPTODATE 3
|
||||
#define KPF_DIRTY 4
|
||||
#define KPF_LRU 5
|
||||
#define KPF_ACTIVE 6
|
||||
#define KPF_SLAB 7
|
||||
#define KPF_WRITEBACK 8
|
||||
#define KPF_RECLAIM 9
|
||||
#define KPF_BUDDY 10
|
||||
|
||||
/* [11-20] new additions in 2.6.31 */
|
||||
#define KPF_MMAP 11
|
||||
#define KPF_ANON 12
|
||||
#define KPF_SWAPCACHE 13
|
||||
#define KPF_SWAPBACKED 14
|
||||
#define KPF_COMPOUND_HEAD 15
|
||||
#define KPF_COMPOUND_TAIL 16
|
||||
#define KPF_HUGE 17
|
||||
#define KPF_UNEVICTABLE 18
|
||||
#define KPF_NOPAGE 20
|
||||
|
||||
/* [32-] kernel hacking assistances */
|
||||
#define KPF_RESERVED 32
|
||||
#define KPF_MLOCKED 33
|
||||
#define KPF_MAPPEDTODISK 34
|
||||
#define KPF_PRIVATE 35
|
||||
#define KPF_PRIVATE_2 36
|
||||
#define KPF_OWNER_PRIVATE 37
|
||||
#define KPF_ARCH 38
|
||||
#define KPF_UNCACHED 39
|
||||
|
||||
/* [48-] take some arbitrary free slots for expanding overloaded flags
|
||||
* not part of kernel API
|
||||
*/
|
||||
#define KPF_READAHEAD 48
|
||||
#define KPF_SLOB_FREE 49
|
||||
#define KPF_SLUB_FROZEN 50
|
||||
#define KPF_SLUB_DEBUG 51
|
||||
|
||||
#define KPF_ALL_BITS ((uint64_t)~0ULL)
|
||||
#define KPF_HACKERS_BITS (0xffffULL << 32)
|
||||
#define KPF_OVERLOADED_BITS (0xffffULL << 48)
|
||||
#define BIT(name) (1ULL << KPF_##name)
|
||||
#define BITS_COMPOUND (BIT(COMPOUND_HEAD) | BIT(COMPOUND_TAIL))
|
||||
|
||||
static char *page_flag_names[] = {
|
||||
[KPF_LOCKED] = "L:locked",
|
||||
[KPF_ERROR] = "E:error",
|
||||
[KPF_REFERENCED] = "R:referenced",
|
||||
[KPF_UPTODATE] = "U:uptodate",
|
||||
[KPF_DIRTY] = "D:dirty",
|
||||
[KPF_LRU] = "l:lru",
|
||||
[KPF_ACTIVE] = "A:active",
|
||||
[KPF_SLAB] = "S:slab",
|
||||
[KPF_WRITEBACK] = "W:writeback",
|
||||
[KPF_RECLAIM] = "I:reclaim",
|
||||
[KPF_BUDDY] = "B:buddy",
|
||||
|
||||
[KPF_MMAP] = "M:mmap",
|
||||
[KPF_ANON] = "a:anonymous",
|
||||
[KPF_SWAPCACHE] = "s:swapcache",
|
||||
[KPF_SWAPBACKED] = "b:swapbacked",
|
||||
[KPF_COMPOUND_HEAD] = "H:compound_head",
|
||||
[KPF_COMPOUND_TAIL] = "T:compound_tail",
|
||||
[KPF_HUGE] = "G:huge",
|
||||
[KPF_UNEVICTABLE] = "u:unevictable",
|
||||
[KPF_NOPAGE] = "n:nopage",
|
||||
|
||||
[KPF_RESERVED] = "r:reserved",
|
||||
[KPF_MLOCKED] = "m:mlocked",
|
||||
[KPF_MAPPEDTODISK] = "d:mappedtodisk",
|
||||
[KPF_PRIVATE] = "P:private",
|
||||
[KPF_PRIVATE_2] = "p:private_2",
|
||||
[KPF_OWNER_PRIVATE] = "O:owner_private",
|
||||
[KPF_ARCH] = "h:arch",
|
||||
[KPF_UNCACHED] = "c:uncached",
|
||||
|
||||
[KPF_READAHEAD] = "I:readahead",
|
||||
[KPF_SLOB_FREE] = "P:slob_free",
|
||||
[KPF_SLUB_FROZEN] = "A:slub_frozen",
|
||||
[KPF_SLUB_DEBUG] = "E:slub_debug",
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* data structures
|
||||
*/
|
||||
|
||||
static int opt_raw; /* for kernel developers */
|
||||
static int opt_list; /* list pages (in ranges) */
|
||||
static int opt_no_summary; /* don't show summary */
|
||||
static pid_t opt_pid; /* process to walk */
|
||||
|
||||
#define MAX_ADDR_RANGES 1024
|
||||
static int nr_addr_ranges;
|
||||
static unsigned long opt_offset[MAX_ADDR_RANGES];
|
||||
static unsigned long opt_size[MAX_ADDR_RANGES];
|
||||
|
||||
#define MAX_BIT_FILTERS 64
|
||||
static int nr_bit_filters;
|
||||
static uint64_t opt_mask[MAX_BIT_FILTERS];
|
||||
static uint64_t opt_bits[MAX_BIT_FILTERS];
|
||||
|
||||
static int page_size;
|
||||
|
||||
#define PAGES_BATCH (64 << 10) /* 64k pages */
|
||||
static int kpageflags_fd;
|
||||
static uint64_t kpageflags_buf[KPF_BYTES * PAGES_BATCH];
|
||||
|
||||
#define HASH_SHIFT 13
|
||||
#define HASH_SIZE (1 << HASH_SHIFT)
|
||||
#define HASH_MASK (HASH_SIZE - 1)
|
||||
#define HASH_KEY(flags) (flags & HASH_MASK)
|
||||
|
||||
static unsigned long total_pages;
|
||||
static unsigned long nr_pages[HASH_SIZE];
|
||||
static uint64_t page_flags[HASH_SIZE];
|
||||
|
||||
|
||||
/*
|
||||
* helper functions
|
||||
*/
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
#define min_t(type, x, y) ({ \
|
||||
type __min1 = (x); \
|
||||
type __min2 = (y); \
|
||||
__min1 < __min2 ? __min1 : __min2; })
|
||||
|
||||
unsigned long pages2mb(unsigned long pages)
|
||||
{
|
||||
return (pages * page_size) >> 20;
|
||||
}
|
||||
|
||||
void fatal(const char *x, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, x);
|
||||
vfprintf(stderr, x, ap);
|
||||
va_end(ap);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* page flag names
|
||||
*/
|
||||
|
||||
char *page_flag_name(uint64_t flags)
|
||||
{
|
||||
static char buf[65];
|
||||
int present;
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = 0; i < ARRAY_SIZE(page_flag_names); i++) {
|
||||
present = (flags >> i) & 1;
|
||||
if (!page_flag_names[i]) {
|
||||
if (present)
|
||||
fatal("unkown flag bit %d\n", i);
|
||||
continue;
|
||||
}
|
||||
buf[j++] = present ? page_flag_names[i][0] : '_';
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
char *page_flag_longname(uint64_t flags)
|
||||
{
|
||||
static char buf[1024];
|
||||
int i, n;
|
||||
|
||||
for (i = 0, n = 0; i < ARRAY_SIZE(page_flag_names); i++) {
|
||||
if (!page_flag_names[i])
|
||||
continue;
|
||||
if ((flags >> i) & 1)
|
||||
n += snprintf(buf + n, sizeof(buf) - n, "%s,",
|
||||
page_flag_names[i] + 2);
|
||||
}
|
||||
if (n)
|
||||
n--;
|
||||
buf[n] = '\0';
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* page list and summary
|
||||
*/
|
||||
|
||||
void show_page_range(unsigned long offset, uint64_t flags)
|
||||
{
|
||||
static uint64_t flags0;
|
||||
static unsigned long index;
|
||||
static unsigned long count;
|
||||
|
||||
if (flags == flags0 && offset == index + count) {
|
||||
count++;
|
||||
return;
|
||||
}
|
||||
|
||||
if (count)
|
||||
printf("%lu\t%lu\t%s\n",
|
||||
index, count, page_flag_name(flags0));
|
||||
|
||||
flags0 = flags;
|
||||
index = offset;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
void show_page(unsigned long offset, uint64_t flags)
|
||||
{
|
||||
printf("%lu\t%s\n", offset, page_flag_name(flags));
|
||||
}
|
||||
|
||||
void show_summary(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf(" flags\tpage-count MB"
|
||||
" symbolic-flags\t\t\tlong-symbolic-flags\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(nr_pages); i++) {
|
||||
if (nr_pages[i])
|
||||
printf("0x%016llx\t%10lu %8lu %s\t%s\n",
|
||||
(unsigned long long)page_flags[i],
|
||||
nr_pages[i],
|
||||
pages2mb(nr_pages[i]),
|
||||
page_flag_name(page_flags[i]),
|
||||
page_flag_longname(page_flags[i]));
|
||||
}
|
||||
|
||||
printf(" total\t%10lu %8lu\n",
|
||||
total_pages, pages2mb(total_pages));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* page flag filters
|
||||
*/
|
||||
|
||||
int bit_mask_ok(uint64_t flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_bit_filters; i++) {
|
||||
if (opt_bits[i] == KPF_ALL_BITS) {
|
||||
if ((flags & opt_mask[i]) == 0)
|
||||
return 0;
|
||||
} else {
|
||||
if ((flags & opt_mask[i]) != opt_bits[i])
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint64_t expand_overloaded_flags(uint64_t flags)
|
||||
{
|
||||
/* SLOB/SLUB overload several page flags */
|
||||
if (flags & BIT(SLAB)) {
|
||||
if (flags & BIT(PRIVATE))
|
||||
flags ^= BIT(PRIVATE) | BIT(SLOB_FREE);
|
||||
if (flags & BIT(ACTIVE))
|
||||
flags ^= BIT(ACTIVE) | BIT(SLUB_FROZEN);
|
||||
if (flags & BIT(ERROR))
|
||||
flags ^= BIT(ERROR) | BIT(SLUB_DEBUG);
|
||||
}
|
||||
|
||||
/* PG_reclaim is overloaded as PG_readahead in the read path */
|
||||
if ((flags & (BIT(RECLAIM) | BIT(WRITEBACK))) == BIT(RECLAIM))
|
||||
flags ^= BIT(RECLAIM) | BIT(READAHEAD);
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
uint64_t well_known_flags(uint64_t flags)
|
||||
{
|
||||
/* hide flags intended only for kernel hacker */
|
||||
flags &= ~KPF_HACKERS_BITS;
|
||||
|
||||
/* hide non-hugeTLB compound pages */
|
||||
if ((flags & BITS_COMPOUND) && !(flags & BIT(HUGE)))
|
||||
flags &= ~BITS_COMPOUND;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* page frame walker
|
||||
*/
|
||||
|
||||
int hash_slot(uint64_t flags)
|
||||
{
|
||||
int k = HASH_KEY(flags);
|
||||
int i;
|
||||
|
||||
/* Explicitly reserve slot 0 for flags 0: the following logic
|
||||
* cannot distinguish an unoccupied slot from slot (flags==0).
|
||||
*/
|
||||
if (flags == 0)
|
||||
return 0;
|
||||
|
||||
/* search through the remaining (HASH_SIZE-1) slots */
|
||||
for (i = 1; i < ARRAY_SIZE(page_flags); i++, k++) {
|
||||
if (!k || k >= ARRAY_SIZE(page_flags))
|
||||
k = 1;
|
||||
if (page_flags[k] == 0) {
|
||||
page_flags[k] = flags;
|
||||
return k;
|
||||
}
|
||||
if (page_flags[k] == flags)
|
||||
return k;
|
||||
}
|
||||
|
||||
fatal("hash table full: bump up HASH_SHIFT?\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void add_page(unsigned long offset, uint64_t flags)
|
||||
{
|
||||
flags = expand_overloaded_flags(flags);
|
||||
|
||||
if (!opt_raw)
|
||||
flags = well_known_flags(flags);
|
||||
|
||||
if (!bit_mask_ok(flags))
|
||||
return;
|
||||
|
||||
if (opt_list == 1)
|
||||
show_page_range(offset, flags);
|
||||
else if (opt_list == 2)
|
||||
show_page(offset, flags);
|
||||
|
||||
nr_pages[hash_slot(flags)]++;
|
||||
total_pages++;
|
||||
}
|
||||
|
||||
void walk_pfn(unsigned long index, unsigned long count)
|
||||
{
|
||||
unsigned long batch;
|
||||
unsigned long n;
|
||||
unsigned long i;
|
||||
|
||||
if (index > ULONG_MAX / KPF_BYTES)
|
||||
fatal("index overflow: %lu\n", index);
|
||||
|
||||
lseek(kpageflags_fd, index * KPF_BYTES, SEEK_SET);
|
||||
|
||||
while (count) {
|
||||
batch = min_t(unsigned long, count, PAGES_BATCH);
|
||||
n = read(kpageflags_fd, kpageflags_buf, batch * KPF_BYTES);
|
||||
if (n == 0)
|
||||
break;
|
||||
if (n < 0) {
|
||||
perror(PROC_KPAGEFLAGS);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (n % KPF_BYTES != 0)
|
||||
fatal("partial read: %lu bytes\n", n);
|
||||
n = n / KPF_BYTES;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
add_page(index + i, kpageflags_buf[i]);
|
||||
|
||||
index += batch;
|
||||
count -= batch;
|
||||
}
|
||||
}
|
||||
|
||||
void walk_addr_ranges(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
kpageflags_fd = open(PROC_KPAGEFLAGS, O_RDONLY);
|
||||
if (kpageflags_fd < 0) {
|
||||
perror(PROC_KPAGEFLAGS);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (!nr_addr_ranges)
|
||||
walk_pfn(0, ULONG_MAX);
|
||||
|
||||
for (i = 0; i < nr_addr_ranges; i++)
|
||||
walk_pfn(opt_offset[i], opt_size[i]);
|
||||
|
||||
close(kpageflags_fd);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* user interface
|
||||
*/
|
||||
|
||||
const char *page_flag_type(uint64_t flag)
|
||||
{
|
||||
if (flag & KPF_HACKERS_BITS)
|
||||
return "(r)";
|
||||
if (flag & KPF_OVERLOADED_BITS)
|
||||
return "(o)";
|
||||
return " ";
|
||||
}
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
printf(
|
||||
"page-types [options]\n"
|
||||
" -r|--raw Raw mode, for kernel developers\n"
|
||||
" -a|--addr addr-spec Walk a range of pages\n"
|
||||
" -b|--bits bits-spec Walk pages with specified bits\n"
|
||||
#if 0 /* planned features */
|
||||
" -p|--pid pid Walk process address space\n"
|
||||
" -f|--file filename Walk file address space\n"
|
||||
#endif
|
||||
" -l|--list Show page details in ranges\n"
|
||||
" -L|--list-each Show page details one by one\n"
|
||||
" -N|--no-summary Don't show summay info\n"
|
||||
" -h|--help Show this usage message\n"
|
||||
"addr-spec:\n"
|
||||
" N one page at offset N (unit: pages)\n"
|
||||
" N+M pages range from N to N+M-1\n"
|
||||
" N,M pages range from N to M-1\n"
|
||||
" N, pages range from N to end\n"
|
||||
" ,M pages range from 0 to M\n"
|
||||
"bits-spec:\n"
|
||||
" bit1,bit2 (flags & (bit1|bit2)) != 0\n"
|
||||
" bit1,bit2=bit1 (flags & (bit1|bit2)) == bit1\n"
|
||||
" bit1,~bit2 (flags & (bit1|bit2)) == bit1\n"
|
||||
" =bit1,bit2 flags == (bit1|bit2)\n"
|
||||
"bit-names:\n"
|
||||
);
|
||||
|
||||
for (i = 0, j = 0; i < ARRAY_SIZE(page_flag_names); i++) {
|
||||
if (!page_flag_names[i])
|
||||
continue;
|
||||
printf("%16s%s", page_flag_names[i] + 2,
|
||||
page_flag_type(1ULL << i));
|
||||
if (++j > 3) {
|
||||
j = 0;
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
printf("\n "
|
||||
"(r) raw mode bits (o) overloaded bits\n");
|
||||
}
|
||||
|
||||
unsigned long long parse_number(const char *str)
|
||||
{
|
||||
unsigned long long n;
|
||||
|
||||
n = strtoll(str, NULL, 0);
|
||||
|
||||
if (n == 0 && str[0] != '0')
|
||||
fatal("invalid name or number: %s\n", str);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
void parse_pid(const char *str)
|
||||
{
|
||||
opt_pid = parse_number(str);
|
||||
}
|
||||
|
||||
void parse_file(const char *name)
|
||||
{
|
||||
}
|
||||
|
||||
void add_addr_range(unsigned long offset, unsigned long size)
|
||||
{
|
||||
if (nr_addr_ranges >= MAX_ADDR_RANGES)
|
||||
fatal("too much addr ranges\n");
|
||||
|
||||
opt_offset[nr_addr_ranges] = offset;
|
||||
opt_size[nr_addr_ranges] = size;
|
||||
nr_addr_ranges++;
|
||||
}
|
||||
|
||||
void parse_addr_range(const char *optarg)
|
||||
{
|
||||
unsigned long offset;
|
||||
unsigned long size;
|
||||
char *p;
|
||||
|
||||
p = strchr(optarg, ',');
|
||||
if (!p)
|
||||
p = strchr(optarg, '+');
|
||||
|
||||
if (p == optarg) {
|
||||
offset = 0;
|
||||
size = parse_number(p + 1);
|
||||
} else if (p) {
|
||||
offset = parse_number(optarg);
|
||||
if (p[1] == '\0')
|
||||
size = ULONG_MAX;
|
||||
else {
|
||||
size = parse_number(p + 1);
|
||||
if (*p == ',') {
|
||||
if (size < offset)
|
||||
fatal("invalid range: %lu,%lu\n",
|
||||
offset, size);
|
||||
size -= offset;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
offset = parse_number(optarg);
|
||||
size = 1;
|
||||
}
|
||||
|
||||
add_addr_range(offset, size);
|
||||
}
|
||||
|
||||
void add_bits_filter(uint64_t mask, uint64_t bits)
|
||||
{
|
||||
if (nr_bit_filters >= MAX_BIT_FILTERS)
|
||||
fatal("too much bit filters\n");
|
||||
|
||||
opt_mask[nr_bit_filters] = mask;
|
||||
opt_bits[nr_bit_filters] = bits;
|
||||
nr_bit_filters++;
|
||||
}
|
||||
|
||||
uint64_t parse_flag_name(const char *str, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!*str || !len)
|
||||
return 0;
|
||||
|
||||
if (len <= 8 && !strncmp(str, "compound", len))
|
||||
return BITS_COMPOUND;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(page_flag_names); i++) {
|
||||
if (!page_flag_names[i])
|
||||
continue;
|
||||
if (!strncmp(str, page_flag_names[i] + 2, len))
|
||||
return 1ULL << i;
|
||||
}
|
||||
|
||||
return parse_number(str);
|
||||
}
|
||||
|
||||
uint64_t parse_flag_names(const char *str, int all)
|
||||
{
|
||||
const char *p = str;
|
||||
uint64_t flags = 0;
|
||||
|
||||
while (1) {
|
||||
if (*p == ',' || *p == '=' || *p == '\0') {
|
||||
if ((*str != '~') || (*str == '~' && all && *++str))
|
||||
flags |= parse_flag_name(str, p - str);
|
||||
if (*p != ',')
|
||||
break;
|
||||
str = p + 1;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
void parse_bits_mask(const char *optarg)
|
||||
{
|
||||
uint64_t mask;
|
||||
uint64_t bits;
|
||||
const char *p;
|
||||
|
||||
p = strchr(optarg, '=');
|
||||
if (p == optarg) {
|
||||
mask = KPF_ALL_BITS;
|
||||
bits = parse_flag_names(p + 1, 0);
|
||||
} else if (p) {
|
||||
mask = parse_flag_names(optarg, 0);
|
||||
bits = parse_flag_names(p + 1, 0);
|
||||
} else if (strchr(optarg, '~')) {
|
||||
mask = parse_flag_names(optarg, 1);
|
||||
bits = parse_flag_names(optarg, 0);
|
||||
} else {
|
||||
mask = parse_flag_names(optarg, 0);
|
||||
bits = KPF_ALL_BITS;
|
||||
}
|
||||
|
||||
add_bits_filter(mask, bits);
|
||||
}
|
||||
|
||||
|
||||
struct option opts[] = {
|
||||
{ "raw" , 0, NULL, 'r' },
|
||||
{ "pid" , 1, NULL, 'p' },
|
||||
{ "file" , 1, NULL, 'f' },
|
||||
{ "addr" , 1, NULL, 'a' },
|
||||
{ "bits" , 1, NULL, 'b' },
|
||||
{ "list" , 0, NULL, 'l' },
|
||||
{ "list-each" , 0, NULL, 'L' },
|
||||
{ "no-summary", 0, NULL, 'N' },
|
||||
{ "help" , 0, NULL, 'h' },
|
||||
{ NULL , 0, NULL, 0 }
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int c;
|
||||
|
||||
page_size = getpagesize();
|
||||
|
||||
while ((c = getopt_long(argc, argv,
|
||||
"rp:f:a:b:lLNh", opts, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 'r':
|
||||
opt_raw = 1;
|
||||
break;
|
||||
case 'p':
|
||||
parse_pid(optarg);
|
||||
break;
|
||||
case 'f':
|
||||
parse_file(optarg);
|
||||
break;
|
||||
case 'a':
|
||||
parse_addr_range(optarg);
|
||||
break;
|
||||
case 'b':
|
||||
parse_bits_mask(optarg);
|
||||
break;
|
||||
case 'l':
|
||||
opt_list = 1;
|
||||
break;
|
||||
case 'L':
|
||||
opt_list = 2;
|
||||
break;
|
||||
case 'N':
|
||||
opt_no_summary = 1;
|
||||
break;
|
||||
case 'h':
|
||||
usage();
|
||||
exit(0);
|
||||
default:
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (opt_list == 1)
|
||||
printf("offset\tcount\tflags\n");
|
||||
if (opt_list == 2)
|
||||
printf("offset\tflags\n");
|
||||
|
||||
walk_addr_ranges();
|
||||
|
||||
if (opt_list == 1)
|
||||
show_page_range(0, 0); /* drain the buffer */
|
||||
|
||||
if (opt_no_summary)
|
||||
return 0;
|
||||
|
||||
if (opt_list)
|
||||
printf("\n\n");
|
||||
|
||||
show_summary();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -12,9 +12,9 @@ There are three components to pagemap:
|
|||
value for each virtual page, containing the following data (from
|
||||
fs/proc/task_mmu.c, above pagemap_read):
|
||||
|
||||
* Bits 0-55 page frame number (PFN) if present
|
||||
* Bits 0-54 page frame number (PFN) if present
|
||||
* Bits 0-4 swap type if swapped
|
||||
* Bits 5-55 swap offset if swapped
|
||||
* Bits 5-54 swap offset if swapped
|
||||
* Bits 55-60 page shift (page size = 1<<page shift)
|
||||
* Bit 61 reserved for future use
|
||||
* Bit 62 page swapped
|
||||
|
@ -36,7 +36,7 @@ There are three components to pagemap:
|
|||
* /proc/kpageflags. This file contains a 64-bit set of flags for each
|
||||
page, indexed by PFN.
|
||||
|
||||
The flags are (from fs/proc/proc_misc, above kpageflags_read):
|
||||
The flags are (from fs/proc/page.c, above kpageflags_read):
|
||||
|
||||
0. LOCKED
|
||||
1. ERROR
|
||||
|
@ -49,6 +49,68 @@ There are three components to pagemap:
|
|||
8. WRITEBACK
|
||||
9. RECLAIM
|
||||
10. BUDDY
|
||||
11. MMAP
|
||||
12. ANON
|
||||
13. SWAPCACHE
|
||||
14. SWAPBACKED
|
||||
15. COMPOUND_HEAD
|
||||
16. COMPOUND_TAIL
|
||||
16. HUGE
|
||||
18. UNEVICTABLE
|
||||
20. NOPAGE
|
||||
|
||||
Short descriptions to the page flags:
|
||||
|
||||
0. LOCKED
|
||||
page is being locked for exclusive access, eg. by undergoing read/write IO
|
||||
|
||||
7. SLAB
|
||||
page is managed by the SLAB/SLOB/SLUB/SLQB kernel memory allocator
|
||||
When compound page is used, SLUB/SLQB will only set this flag on the head
|
||||
page; SLOB will not flag it at all.
|
||||
|
||||
10. BUDDY
|
||||
a free memory block managed by the buddy system allocator
|
||||
The buddy system organizes free memory in blocks of various orders.
|
||||
An order N block has 2^N physically contiguous pages, with the BUDDY flag
|
||||
set for and _only_ for the first page.
|
||||
|
||||
15. COMPOUND_HEAD
|
||||
16. COMPOUND_TAIL
|
||||
A compound page with order N consists of 2^N physically contiguous pages.
|
||||
A compound page with order 2 takes the form of "HTTT", where H donates its
|
||||
head page and T donates its tail page(s). The major consumers of compound
|
||||
pages are hugeTLB pages (Documentation/vm/hugetlbpage.txt), the SLUB etc.
|
||||
memory allocators and various device drivers. However in this interface,
|
||||
only huge/giga pages are made visible to end users.
|
||||
17. HUGE
|
||||
this is an integral part of a HugeTLB page
|
||||
|
||||
20. NOPAGE
|
||||
no page frame exists at the requested address
|
||||
|
||||
[IO related page flags]
|
||||
1. ERROR IO error occurred
|
||||
3. UPTODATE page has up-to-date data
|
||||
ie. for file backed page: (in-memory data revision >= on-disk one)
|
||||
4. DIRTY page has been written to, hence contains new data
|
||||
ie. for file backed page: (in-memory data revision > on-disk one)
|
||||
8. WRITEBACK page is being synced to disk
|
||||
|
||||
[LRU related page flags]
|
||||
5. LRU page is in one of the LRU lists
|
||||
6. ACTIVE page is in the active LRU list
|
||||
18. UNEVICTABLE page is in the unevictable (non-)LRU list
|
||||
It is somehow pinned and not a candidate for LRU page reclaims,
|
||||
eg. ramfs pages, shmctl(SHM_LOCK) and mlock() memory segments
|
||||
2. REFERENCED page has been referenced since last LRU list enqueue/requeue
|
||||
9. RECLAIM page will be reclaimed soon after its pageout IO completed
|
||||
11. MMAP a memory mapped page
|
||||
12. ANON a memory mapped page that is not part of a file
|
||||
13. SWAPCACHE page is mapped to swap space, ie. has an associated swap entry
|
||||
14. SWAPBACKED page is backed by swap/RAM
|
||||
|
||||
The page-types tool in this directory can be used to query the above flags.
|
||||
|
||||
Using pagemap to do something useful:
|
||||
|
||||
|
|
137
MAINTAINERS
137
MAINTAINERS
|
@ -36,6 +36,12 @@ trivial patch so apply some common sense.
|
|||
(scripts/checkpatch.pl) to catch trival style violations.
|
||||
See Documentation/CodingStyle for guidance here.
|
||||
|
||||
PLEASE CC: the maintainers and mailing lists that are generated
|
||||
by scripts/get_maintainer.pl. The results returned by the
|
||||
script will be best if you have git installed and are making
|
||||
your changes in a branch derived from Linus' latest git tree.
|
||||
See Documentation/SubmittingPatches for details.
|
||||
|
||||
PLEASE try to include any credit lines you want added with the
|
||||
patch. It avoids people being missed off by mistake and makes
|
||||
it easier to know who wants adding and who doesn't.
|
||||
|
@ -489,7 +495,7 @@ AOA (Apple Onboard Audio) ALSA DRIVER
|
|||
P: Johannes Berg
|
||||
M: johannes@sipsolutions.net
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: alsa-devel@alsa-project.org (subscribers-only)
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: sound/aoa/
|
||||
|
||||
|
@ -912,7 +918,6 @@ P: Dan Williams
|
|||
M: dan.j.williams@intel.com
|
||||
P: Maciej Sosnowski
|
||||
M: maciej.sosnowski@intel.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://sourceforge.net/projects/xscaleiop
|
||||
S: Supported
|
||||
F: Documentation/crypto/async-tx-api.txt
|
||||
|
@ -1008,7 +1013,6 @@ F: drivers/mmc/host/at91_mci.c
|
|||
ATMEL AT91 / AT32 SERIAL DRIVER
|
||||
P: Haavard Skinnemoen
|
||||
M: hskinnemoen@atmel.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/serial/atmel_serial.c
|
||||
|
||||
|
@ -1064,7 +1068,6 @@ F: kernel/audit*
|
|||
AUXILIARY DISPLAY DRIVERS
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
@ -1134,7 +1137,6 @@ F: drivers/net/hamradio/baycom*
|
|||
BEFS FILE SYSTEM
|
||||
P: Sergey S. Kostyliov
|
||||
M: rathamahata@php4.ru
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/befs.txt
|
||||
F: fs/befs/
|
||||
|
@ -1142,7 +1144,6 @@ F: fs/befs/
|
|||
BFS FILE SYSTEM
|
||||
P: Tigran A. Aivazian
|
||||
M: tigran@aivazian.fsnet.co.uk
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/bfs.txt
|
||||
F: fs/bfs/
|
||||
|
@ -1199,7 +1200,6 @@ F: drivers/i2c/busses/i2c-bfin-twi.c
|
|||
BLOCK LAYER
|
||||
P: Jens Axboe
|
||||
M: axboe@kernel.dk
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
|
||||
S: Maintained
|
||||
F: block/
|
||||
|
@ -1326,7 +1326,6 @@ P: Muli Ben-Yehuda
|
|||
M: muli@il.ibm.com
|
||||
P: Jon D. Mason
|
||||
M: jdmason@kudzu.us
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: discuss@x86-64.org
|
||||
S: Maintained
|
||||
F: arch/x86/kernel/pci-calgary_64.c
|
||||
|
@ -1378,7 +1377,6 @@ F: include/linux/usb/wusb*
|
|||
CFAG12864B LCD DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
@ -1388,7 +1386,6 @@ F: include/linux/cfag12864b.h
|
|||
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
@ -1408,7 +1405,6 @@ X: net/wireless/wext*
|
|||
CHECKPATCH
|
||||
P: Andy Whitcroft
|
||||
M: apw@canonical.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: scripts/checkpatch.pl
|
||||
|
||||
|
@ -1437,7 +1433,7 @@ F: drivers/usb/host/ohci-ep93xx.c
|
|||
CIRRUS LOGIC CS4270 SOUND DRIVER
|
||||
P: Timur Tabi
|
||||
M: timur@freescale.com
|
||||
L: alsa-devel@alsa-project.org
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: sound/soc/codecs/cs4270*
|
||||
|
||||
|
@ -1462,6 +1458,7 @@ P: Joe Eykholt
|
|||
M: jeykholt@cisco.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/scsi/fnic/
|
||||
|
||||
CODA FILE SYSTEM
|
||||
P: Jan Harkes
|
||||
|
@ -1534,7 +1531,6 @@ F: drivers/usb/atm/cxacru.c
|
|||
CONFIGFS
|
||||
P: Joel Becker
|
||||
M: joel.becker@oracle.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: fs/configfs/
|
||||
F: include/linux/configfs.h
|
||||
|
@ -1592,7 +1588,6 @@ F: arch/x86/kernel/msr.c
|
|||
CPUSETS
|
||||
P: Paul Menage
|
||||
M: menage@google.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.bullopensource.org/cpuset/
|
||||
W: http://oss.sgi.com/projects/cpusets/
|
||||
S: Supported
|
||||
|
@ -1799,7 +1794,6 @@ DEVICE NUMBER REGISTRY
|
|||
P: Torben Mathiasen
|
||||
M: device@lanana.org
|
||||
W: http://lanana.org/docs/device-list/index.html
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
DEVICE-MAPPER (LVM)
|
||||
|
@ -1825,7 +1819,6 @@ F: drivers/char/digi*
|
|||
DIRECTORY NOTIFICATION (DNOTIFY)
|
||||
P: Eric Paris
|
||||
M: eparis@parisplace.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/dnotify.txt
|
||||
F: fs/notify/dnotify/
|
||||
|
@ -1842,7 +1835,6 @@ S: Maintained
|
|||
DISKQUOTA
|
||||
P: Jan Kara
|
||||
M: jack@suse.cz
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/quota.txt
|
||||
F: fs/quota/
|
||||
|
@ -1864,7 +1856,6 @@ P: Maciej Sosnowski
|
|||
M: maciej.sosnowski@intel.com
|
||||
P: Dan Williams
|
||||
M: dan.j.williams@intel.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/dma/
|
||||
F: include/linux/dma*
|
||||
|
@ -1916,7 +1907,6 @@ F: drivers/scsi/dpt/
|
|||
DRIVER CORE, KOBJECTS, AND SYSFS
|
||||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Supported
|
||||
F: Documentation/kobject.txt
|
||||
|
@ -1982,8 +1972,8 @@ F: net/bridge/netfilter/ebt*.c
|
|||
ECRYPT FILE SYSTEM
|
||||
P: Tyler Hicks
|
||||
M: tyhicks@linux.vnet.ibm.com
|
||||
M: Dustin Kirkland
|
||||
P: kirkland@canonical.com
|
||||
P: Dustin Kirkland
|
||||
M: kirkland@canonical.com
|
||||
L: ecryptfs-devel@lists.launchpad.net
|
||||
W: https://launchpad.net/ecryptfs
|
||||
S: Supported
|
||||
|
@ -2263,7 +2253,6 @@ F: drivers/firewire/
|
|||
F: include/linux/firewire*.h
|
||||
|
||||
FIRMWARE LOADER (request_firmware)
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Orphan
|
||||
F: Documentation/firmware_class/
|
||||
F: drivers/base/firmware*.c
|
||||
|
@ -2300,7 +2289,6 @@ M: leoli@freescale.com
|
|||
P: Zhang Wei
|
||||
M: zw@zh-kernel.org
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/dma/fsldma.*
|
||||
|
||||
|
@ -2366,7 +2354,7 @@ F: drivers/serial/ucc_uart.c
|
|||
FREESCALE SOC SOUND DRIVERS
|
||||
P: Timur Tabi
|
||||
M: timur@freescale.com
|
||||
L: alsa-devel@alsa-project.org
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Supported
|
||||
F: sound/soc/fsl/fsl*
|
||||
|
@ -2500,7 +2488,6 @@ F: drivers/hwmon/hdaps.c
|
|||
|
||||
HYPERVISOR VIRTUAL CONSOLE DRIVER
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: drivers/char/hvc_*
|
||||
|
||||
|
@ -2567,7 +2554,6 @@ F: sound/parisc/harmony.*
|
|||
HAYES ESP SERIAL DRIVER
|
||||
P: Andrew J. Robinson
|
||||
M: arobinso@nyx.net
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.nyx.net/~arobinso
|
||||
S: Maintained
|
||||
F: Documentation/serial/hayes-esp.txt
|
||||
|
@ -2593,7 +2579,6 @@ F: include/linux/cciss_ioctl.h
|
|||
HFS FILESYSTEM
|
||||
P: Roman Zippel
|
||||
M: zippel@linux-m68k.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/hfs.txt
|
||||
F: fs/hfs/
|
||||
|
@ -2633,7 +2618,6 @@ F: include/linux/hid*
|
|||
HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
|
||||
P: Thomas Gleixner
|
||||
M: tglx@linutronix.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/timers/
|
||||
F: kernel/hrtimer.c
|
||||
|
@ -2772,7 +2756,6 @@ F: drivers/i2c/busses/i2c-tiny-usb.c
|
|||
i386 BOOT CODE
|
||||
P: H. Peter Anvin
|
||||
M: hpa@zytor.com
|
||||
L: Linux-Kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/x86/boot/
|
||||
|
||||
|
@ -2902,7 +2885,6 @@ P: Robert Love
|
|||
M: rlove@rlove.org
|
||||
P: Eric Paris
|
||||
M: eparis@parisplace.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/inotify.txt
|
||||
F: fs/notify/inotify/
|
||||
|
@ -2950,7 +2932,6 @@ F: arch/x86/kernel/microcode_intel.c
|
|||
INTEL I/OAT DMA DRIVER
|
||||
P: Maciej Sosnowski
|
||||
M: maciej.sosnowski@intel.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/dma/ioat*
|
||||
|
||||
|
@ -2966,7 +2947,6 @@ F: include/linux/intel-iommu.h
|
|||
INTEL IOP-ADMA DMA DRIVER
|
||||
P: Dan Williams
|
||||
M: dan.j.williams@intel.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/dma/iop-adma.c
|
||||
|
||||
|
@ -3279,7 +3259,6 @@ M: vgoyal@redhat.com
|
|||
P: Haren Myneni
|
||||
M: hbabu@us.ibm.com
|
||||
L: kexec@lists.infradead.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://lse.sourceforge.net/kdump/
|
||||
S: Maintained
|
||||
F: Documentation/kdump/
|
||||
|
@ -3389,7 +3368,6 @@ KEXEC
|
|||
P: Eric Biederman
|
||||
M: ebiederm@xmission.com
|
||||
W: http://ftp.kernel.org/pub/linux/kernel/people/horms/kexec-tools/
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: kexec@lists.infradead.org
|
||||
S: Maintained
|
||||
F: include/linux/kexec.h
|
||||
|
@ -3406,6 +3384,14 @@ F: drivers/serial/kgdboc.c
|
|||
F: include/linux/kgdb.h
|
||||
F: kernel/kgdb.c
|
||||
|
||||
KMEMCHECK
|
||||
P: Vegard Nossum
|
||||
M: vegardno@ifi.uio.no
|
||||
P Pekka Enberg
|
||||
M: penberg@cs.helsinki.fi
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
KMEMLEAK
|
||||
P: Catalin Marinas
|
||||
M: catalin.marinas@arm.com
|
||||
|
@ -3419,7 +3405,6 @@ F: mm/kmemleak-test.c
|
|||
KMEMTRACE
|
||||
P: Eduard - Gabriel Munteanu
|
||||
M: eduard.munteanu@linux360.ro
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/trace/kmemtrace.txt
|
||||
F: include/trace/kmemtrace.h
|
||||
|
@ -3434,7 +3419,6 @@ P: David S. Miller
|
|||
M: davem@davemloft.net
|
||||
P: Masami Hiramatsu
|
||||
M: mhiramat@redhat.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/kprobes.txt
|
||||
F: include/linux/kprobes.h
|
||||
|
@ -3443,7 +3427,6 @@ F: kernel/kprobes.c
|
|||
KS0108 LCD CONTROLLER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
@ -3607,7 +3590,6 @@ P: Peter Zijlstra
|
|||
M: peterz@infradead.org
|
||||
P: Ingo Molnar
|
||||
M: mingo@redhat.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git
|
||||
S: Maintained
|
||||
F: Documentation/lockdep*.txt
|
||||
|
@ -3659,7 +3641,6 @@ L: linux-m32r-ja@ml.linux-m32r.org (in Japanese)
|
|||
W: http://www.linux-m32r.org/
|
||||
S: Maintained
|
||||
F: arch/m32r/
|
||||
F: include/asm-m32r/
|
||||
|
||||
M68K ARCHITECTURE
|
||||
P: Geert Uytterhoeven
|
||||
|
@ -3743,7 +3724,6 @@ F: include/linux/mv643xx.h
|
|||
MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER
|
||||
P: Nicolas Pitre
|
||||
M: nico@cam.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
MARVELL YUKON / SYSKONNECT DRIVER
|
||||
|
@ -3797,7 +3777,6 @@ F: drivers/scsi/megaraid/
|
|||
|
||||
MEMORY MANAGEMENT
|
||||
L: linux-mm@kvack.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.linux-mm.org
|
||||
S: Maintained
|
||||
F: include/linux/mm.h
|
||||
|
@ -3811,7 +3790,6 @@ M: xemul@openvz.org
|
|||
P: KAMEZAWA Hiroyuki
|
||||
M: kamezawa.hiroyu@jp.fujitsu.com
|
||||
L: linux-mm@kvack.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: mm/memcontrol.c
|
||||
|
||||
|
@ -3854,7 +3832,6 @@ F: arch/mips/
|
|||
MISCELLANEOUS MCA-SUPPORT
|
||||
P: James Bottomley
|
||||
M: James.Bottomley@HansenPartnership.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/ia64/mca.txt
|
||||
F: Documentation/mca.txt
|
||||
|
@ -3864,7 +3841,6 @@ F: include/linux/mca*
|
|||
MODULE SUPPORT
|
||||
P: Rusty Russell
|
||||
M: rusty@rustcorp.com.au
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/linux/module.h
|
||||
F: kernel/module.c
|
||||
|
@ -3888,7 +3864,6 @@ F: drivers/mmc/host/imxmmc.*
|
|||
MOUSE AND MISC DEVICES [GENERAL]
|
||||
P: Alessandro Rubini
|
||||
M: rubini@ipvvis.unipv.it
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/input/mouse/
|
||||
F: include/linux/gpio_mouse.h
|
||||
|
@ -3896,7 +3871,6 @@ F: include/linux/gpio_mouse.h
|
|||
MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
|
||||
P: Jiri Slaby
|
||||
M: jirislaby@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/serial/moxa-smartio
|
||||
F: drivers/char/mxser.*
|
||||
|
@ -3912,7 +3886,6 @@ F: drivers/platform/x86/msi-laptop.c
|
|||
MULTIFUNCTION DEVICES (MFD)
|
||||
P: Samuel Ortiz
|
||||
M: sameo@linux.intel.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6.git
|
||||
S: Supported
|
||||
F: drivers/mfd/
|
||||
|
@ -3920,7 +3893,6 @@ F: drivers/mfd/
|
|||
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
|
||||
P: Pierre Ossman
|
||||
M: pierre@ossman.eu
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/mmc/
|
||||
F: include/linux/mmc/
|
||||
|
@ -3928,7 +3900,6 @@ F: include/linux/mmc/
|
|||
MULTIMEDIA CARD (MMC) ETC. OVER SPI
|
||||
P: David Brownell
|
||||
M: dbrownell@users.sourceforge.net
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: drivers/mmc/host/mmc_spi.c
|
||||
F: include/linux/spi/mmc_spi.h
|
||||
|
@ -3943,7 +3914,6 @@ F: sound/oss/msnd*
|
|||
MULTITECH MULTIPORT CARD (ISICOM)
|
||||
P: Jiri Slaby
|
||||
M: jirislaby@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/char/isicom.c
|
||||
F: include/linux/isicom.h
|
||||
|
@ -4187,7 +4157,6 @@ NTFS FILESYSTEM
|
|||
P: Anton Altaparmakov
|
||||
M: aia21@cantab.net
|
||||
L: linux-ntfs-dev@lists.sourceforge.net
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.linux-ntfs.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git
|
||||
S: Maintained
|
||||
|
@ -4421,7 +4390,6 @@ M: akataria@vmware.com
|
|||
P: Rusty Russell
|
||||
M: rusty@rustcorp.com.au
|
||||
L: virtualization@lists.osdl.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/ia64/paravirt_ops.txt
|
||||
F: arch/*/kernel/paravirt*
|
||||
|
@ -4472,7 +4440,6 @@ F: include/linux/leds-pca9532.h
|
|||
PCI ERROR RECOVERY
|
||||
P: Linas Vepstas
|
||||
M: linas@austin.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-pci@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/PCI/pci-error-recovery.txt
|
||||
|
@ -4481,7 +4448,6 @@ F: Documentation/powerpc/eeh-pci-error-recovery.txt
|
|||
PCI SUBSYSTEM
|
||||
P: Jesse Barnes
|
||||
M: jbarnes@virtuousgeek.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-pci@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git
|
||||
S: Supported
|
||||
|
@ -4516,7 +4482,6 @@ F: drivers/net/pcnet32.c
|
|||
PER-TASK DELAY ACCOUNTING
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/linux/delayacct.h
|
||||
F: kernel/delayacct.c
|
||||
|
@ -4548,7 +4513,6 @@ F: drivers/mtd/devices/phram.c
|
|||
PKTCDVD DRIVER
|
||||
P: Peter Osterlund
|
||||
M: petero2@telia.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/block/pktcdvd.c
|
||||
F: include/linux/pktcdvd.h
|
||||
|
@ -4556,7 +4520,6 @@ F: include/linux/pktcdvd.h
|
|||
POSIX CLOCKS and TIMERS
|
||||
P: Thomas Gleixner
|
||||
M: tglx@linutronix.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: fs/timerfd.c
|
||||
F: include/linux/timer*
|
||||
|
@ -4567,7 +4530,6 @@ P: Anton Vorontsov
|
|||
M: cbou@mail.ru
|
||||
P: David Woodhouse
|
||||
M: dwmw2@infradead.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.infradead.org/battery-2.6.git
|
||||
S: Maintained
|
||||
F: include/linux/power_supply.h
|
||||
|
@ -4619,7 +4581,6 @@ F: include/linux/if_pppol2tp.h
|
|||
PREEMPTIBLE KERNEL
|
||||
P: Robert Love
|
||||
M: rml@tech9.net
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: kpreempt-tech@lists.sourceforge.net
|
||||
W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel
|
||||
S: Supported
|
||||
|
@ -4682,7 +4643,6 @@ P: Roland McGrath
|
|||
M: roland@redhat.com
|
||||
P: Oleg Nesterov
|
||||
M: oleg@redhat.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/asm-generic/syscall.h
|
||||
F: include/linux/ptrace.h
|
||||
|
@ -4768,7 +4728,6 @@ F: drivers/net/qlge/
|
|||
QNX4 FILESYSTEM
|
||||
P: Anders Larsen
|
||||
M: al@alarsen.net
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.alarsen.net/linux/qnx4fs/
|
||||
S: Maintained
|
||||
F: fs/qnx4/
|
||||
|
@ -4815,7 +4774,6 @@ F: drivers/char/random.c
|
|||
RAPIDIO SUBSYSTEM
|
||||
P: Matt Porter
|
||||
M: mporter@kernel.crashing.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/rapidio/
|
||||
|
||||
|
@ -4829,7 +4787,8 @@ F: drivers/net/wireless/ray*
|
|||
RCUTORTURE MODULE
|
||||
P: Josh Triplett
|
||||
M: josh@freedesktop.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
P: Paul E. McKenney
|
||||
M: paulmck@linux.vnet.ibm.com
|
||||
S: Maintained
|
||||
F: Documentation/RCU/torture.txt
|
||||
F: kernel/rcutorture.c
|
||||
|
@ -4837,7 +4796,6 @@ F: kernel/rcutorture.c
|
|||
RDC R-321X SoC
|
||||
P: Florian Fainelli
|
||||
M: florian@openwrt.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
RDC R6040 FAST ETHERNET DRIVER
|
||||
|
@ -4857,8 +4815,9 @@ F: net/rds/
|
|||
READ-COPY UPDATE (RCU)
|
||||
P: Dipankar Sarma
|
||||
M: dipankar@in.ibm.com
|
||||
P: Paul E. McKenney
|
||||
M: paulmck@linux.vnet.ibm.com
|
||||
W: http://www.rdrop.com/users/paulmck/rclock/
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/RCU/rcu.txt
|
||||
F: Documentation/RCU/rcuref.txt
|
||||
|
@ -4869,7 +4828,6 @@ F: kernel/rcupdate.c
|
|||
REAL TIME CLOCK DRIVER
|
||||
P: Paul Gortmaker
|
||||
M: p_gortmaker@yahoo.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/rtc.txt
|
||||
F: drivers/rtc/
|
||||
|
@ -5007,7 +4965,6 @@ S3C24XX SD/MMC Driver
|
|||
P: Ben Dooks
|
||||
M: ben-linux@fluff.org
|
||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/mmc/host/s3cmci.*
|
||||
|
||||
|
@ -5033,7 +4990,6 @@ P: Ingo Molnar
|
|||
M: mingo@elte.hu
|
||||
P: Peter Zijlstra
|
||||
M: peterz@infradead.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/sched*
|
||||
F: include/linux/sched.h
|
||||
|
@ -5135,7 +5091,6 @@ F: drivers/mmc/host/sdhci.*
|
|||
SECURITY SUBSYSTEM
|
||||
P: James Morris
|
||||
M: jmorris@namei.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-security-module@vger.kernel.org (suggested Cc:)
|
||||
T: git git://www.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git
|
||||
W: http://security.wiki.kernel.org/
|
||||
|
@ -5154,7 +5109,6 @@ P: James Morris
|
|||
M: jmorris@namei.org
|
||||
P: Eric Paris
|
||||
M: eparis@parisplace.org
|
||||
L: linux-kernel@vger.kernel.org (kernel issues)
|
||||
L: selinux@tycho.nsa.gov (subscribers-only, general discussion)
|
||||
W: http://selinuxproject.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git
|
||||
|
@ -5417,7 +5371,6 @@ F: include/linux/sony-laptop.h
|
|||
SONY MEMORYSTICK CARD SUPPORT
|
||||
P: Alex Dubov
|
||||
M: oakad@yahoo.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://tifmxx.berlios.de/
|
||||
S: Maintained
|
||||
F: drivers/memstick/host/tifm_ms.c
|
||||
|
@ -5427,7 +5380,7 @@ P: Jaroslav Kysela
|
|||
M: perex@perex.cz
|
||||
P: Takashi Iwai
|
||||
M: tiwai@suse.de
|
||||
L: alsa-devel@alsa-project.org (subscribers-only)
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
W: http://www.alsa-project.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
|
||||
T: git git://git.alsa-project.org/alsa-kernel.git
|
||||
|
@ -5442,7 +5395,7 @@ M: lrg@slimlogic.co.uk
|
|||
P: Mark Brown
|
||||
M: broonie@opensource.wolfsonmicro.com
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound-2.6.git
|
||||
L: alsa-devel@alsa-project.org (subscribers-only)
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
W: http://alsa-project.org/main/index.php/ASoC
|
||||
S: Supported
|
||||
F: sound/soc/
|
||||
|
@ -5460,7 +5413,6 @@ F: arch/sparc/
|
|||
SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
|
||||
P: Roger Wolff
|
||||
M: R.E.Wolff@BitWizard.nl
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/serial/specialix.txt
|
||||
F: drivers/char/specialix*
|
||||
|
@ -5506,7 +5458,6 @@ F: fs/squashfs/
|
|||
SRM (Alpha) environment access
|
||||
P: Jan-Benedict Glaw
|
||||
M: jbglaw@lug-owl.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/alpha/kernel/srm_env.c
|
||||
|
||||
|
@ -5521,7 +5472,6 @@ S: Maintained
|
|||
STAGING SUBSYSTEM
|
||||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Maintained
|
||||
F: drivers/staging/
|
||||
|
@ -5601,7 +5551,6 @@ F: include/linux/sysv_fs.h
|
|||
TASKSTATS STATISTICS INTERFACE
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/accounting/taskstats*
|
||||
F: include/linux/taskstats*
|
||||
|
@ -5694,7 +5643,6 @@ P: Kentaro Takeda
|
|||
M: takedakn@nttdata.co.jp
|
||||
P: Tetsuo Handa
|
||||
M: penguin-kernel@I-love.SAKURA.ne.jp
|
||||
L: linux-kernel@vger.kernel.org (kernel issues)
|
||||
L: tomoyo-users-en@lists.sourceforge.jp (subscribers-only, for developers and users in English)
|
||||
L: tomoyo-dev@lists.sourceforge.jp (subscribers-only, for developers in Japanese)
|
||||
L: tomoyo-users@lists.sourceforge.jp (subscribers-only, for users in Japanese)
|
||||
|
@ -5746,14 +5694,17 @@ F: drivers/char/tpm/
|
|||
TRIVIAL PATCHES
|
||||
P: Jiri Kosina
|
||||
M: trivial@kernel.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
|
||||
S: Maintained
|
||||
F: drivers/char/tty_*
|
||||
F: drivers/serial/serial_core.c
|
||||
F: include/linux/serial_core.h
|
||||
F: include/linux/serial.h
|
||||
F: include/linux/tty.h
|
||||
|
||||
TTY LAYER
|
||||
P: Alan Cox
|
||||
M: alan@lxorguk.ukuu.org.uk
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: stgit http://zeniv.linux.org.uk/~alan/ttydev/
|
||||
|
||||
|
@ -5826,7 +5777,6 @@ F: fs/udf/
|
|||
UFS FILESYSTEM
|
||||
P: Evgeniy Dushistov
|
||||
M: dushistov@mail.ru
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/ufs.txt
|
||||
F: fs/ufs/
|
||||
|
@ -5843,7 +5793,6 @@ F: include/linux/uwb/
|
|||
UNIFORM CDROM DRIVER
|
||||
P: Jens Axboe
|
||||
M: axboe@kernel.dk
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.kernel.dk
|
||||
S: Maintained
|
||||
F: Documentation/cdrom/
|
||||
|
@ -5872,7 +5821,6 @@ F: drivers/usb/class/cdc-acm.*
|
|||
USB BLOCK DRIVER (UB ub)
|
||||
P: Pete Zaitcev
|
||||
M: zaitcev@redhat.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/block/ub.c
|
||||
|
@ -6165,6 +6113,12 @@ L: linux-wireless@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/net/wireless/rndis_wlan.c
|
||||
|
||||
USB XHCI DRIVER
|
||||
P: Sarah Sharp
|
||||
M: sarah.a.sharp@intel.com
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
USB ZC0301 DRIVER
|
||||
P: Luca Risolia
|
||||
M: luca.risolia@studio.unibo.it
|
||||
|
@ -6212,7 +6166,6 @@ P: Hans J. Koch
|
|||
M: hjk@linutronix.de
|
||||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/DocBook/uio-howto.tmpl
|
||||
F: drivers/uio/
|
||||
|
@ -6238,7 +6191,6 @@ F: drivers/video/uvesafb.*
|
|||
VFAT/FAT/MSDOS FILESYSTEM
|
||||
P: OGAWA Hirofumi
|
||||
M: hirofumi@mail.parknet.co.jp
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/filesystems/vfat.txt
|
||||
F: fs/fat/
|
||||
|
@ -6282,6 +6234,14 @@ F: drivers/net/macvlan.c
|
|||
F: include/linux/if_*vlan.h
|
||||
F: net/8021q/
|
||||
|
||||
VLYNQ BUS
|
||||
P: Florian Fainelli
|
||||
M: florian@openwrt.org
|
||||
L: openwrt-devel@lists.openwrt.org
|
||||
S: Maintained
|
||||
F: drivers/vlynq/vlynq.c
|
||||
F: include/linux/vlynq.h
|
||||
|
||||
VOLTAGE AND CURRENT REGULATOR FRAMEWORK
|
||||
P: Liam Girdwood
|
||||
M: lrg@slimlogic.co.uk
|
||||
|
@ -6335,7 +6295,6 @@ F: drivers/hwmon/w83793.c
|
|||
W83L51xD SD/MMC CARD INTERFACE DRIVER
|
||||
P: Pierre Ossman
|
||||
M: pierre@ossman.eu
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/mmc/host/wbsd.*
|
||||
|
||||
|
@ -6422,7 +6381,6 @@ M: mingo@redhat.com
|
|||
P: H. Peter Anvin
|
||||
M: hpa@zytor.com
|
||||
M: x86@kernel.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||
S: Maintained
|
||||
F: Documentation/x86/
|
||||
|
@ -6458,7 +6416,6 @@ XILINX SYSTEMACE DRIVER
|
|||
P: Grant Likely
|
||||
M: grant.likely@secretlab.ca
|
||||
W: http://www.secretlab.ca/
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/block/xsysace.c
|
||||
|
||||
|
@ -6523,5 +6480,9 @@ F: drivers/serial/zs.*
|
|||
|
||||
THE REST
|
||||
P: Linus Torvalds
|
||||
M: torvalds@linux-foundation.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
|
||||
S: Buried alive in reporters
|
||||
F: *
|
||||
F: */
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
/*
|
||||
* 8253/8254 Programmable Interval Timer
|
||||
*/
|
||||
|
||||
#ifndef _8253PIT_H
|
||||
#define _8253PIT_H
|
||||
|
||||
#define PIT_TICK_RATE 1193180UL
|
||||
|
||||
#endif
|
||||
|
|
|
@ -3,30 +3,12 @@
|
|||
|
||||
/* Dummy header just to define km_type. */
|
||||
|
||||
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
# define D(n) __KM_FENCE_##n ,
|
||||
#else
|
||||
# define D(n)
|
||||
#define __WITH_KM_FENCE
|
||||
#endif
|
||||
|
||||
enum km_type {
|
||||
D(0) KM_BOUNCE_READ,
|
||||
D(1) KM_SKB_SUNRPC_DATA,
|
||||
D(2) KM_SKB_DATA_SOFTIRQ,
|
||||
D(3) KM_USER0,
|
||||
D(4) KM_USER1,
|
||||
D(5) KM_BIO_SRC_IRQ,
|
||||
D(6) KM_BIO_DST_IRQ,
|
||||
D(7) KM_PTE0,
|
||||
D(8) KM_PTE1,
|
||||
D(9) KM_IRQ0,
|
||||
D(10) KM_IRQ1,
|
||||
D(11) KM_SOFTIRQ0,
|
||||
D(12) KM_SOFTIRQ1,
|
||||
D(13) KM_TYPE_NR
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#undef D
|
||||
#undef __WITH_KM_FENCE
|
||||
|
||||
#endif
|
||||
|
|
|
@ -10,10 +10,7 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
struct task_struct init_task = INIT_TASK(init_task);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
EXPORT_SYMBOL(init_task);
|
||||
|
||||
union thread_union init_thread_union
|
||||
|
|
|
@ -227,7 +227,7 @@ struct irqaction timer_irqaction = {
|
|||
.name = "timer",
|
||||
};
|
||||
|
||||
static struct hw_interrupt_type rtc_irq_type = {
|
||||
static struct irq_chip rtc_irq_type = {
|
||||
.typename = "RTC",
|
||||
.startup = rtc_startup,
|
||||
.shutdown = rtc_enable_disable,
|
||||
|
|
|
@ -83,7 +83,7 @@ i8259a_end_irq(unsigned int irq)
|
|||
i8259a_enable_irq(irq);
|
||||
}
|
||||
|
||||
struct hw_interrupt_type i8259a_irq_type = {
|
||||
struct irq_chip i8259a_irq_type = {
|
||||
.typename = "XT-PIC",
|
||||
.startup = i8259a_startup_irq,
|
||||
.shutdown = i8259a_disable_irq,
|
||||
|
|
|
@ -36,7 +36,7 @@ extern void i8259a_disable_irq(unsigned int);
|
|||
extern void i8259a_mask_and_ack_irq(unsigned int);
|
||||
extern unsigned int i8259a_startup_irq(unsigned int);
|
||||
extern void i8259a_end_irq(unsigned int);
|
||||
extern struct hw_interrupt_type i8259a_irq_type;
|
||||
extern struct irq_chip i8259a_irq_type;
|
||||
extern void init_i8259a_irqs(void);
|
||||
|
||||
extern void handle_irq(int irq);
|
||||
|
|
|
@ -70,7 +70,7 @@ pyxis_mask_and_ack_irq(unsigned int irq)
|
|||
*(vulp)PYXIS_INT_MASK;
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type pyxis_irq_type = {
|
||||
static struct irq_chip pyxis_irq_type = {
|
||||
.typename = "PYXIS",
|
||||
.startup = pyxis_startup_irq,
|
||||
.shutdown = pyxis_disable_irq,
|
||||
|
|
|
@ -48,7 +48,7 @@ srm_end_irq(unsigned int irq)
|
|||
}
|
||||
|
||||
/* Handle interrupts from the SRM, assuming no additional weirdness. */
|
||||
static struct hw_interrupt_type srm_irq_type = {
|
||||
static struct irq_chip srm_irq_type = {
|
||||
.typename = "SRM",
|
||||
.startup = srm_startup_irq,
|
||||
.shutdown = srm_disable_irq,
|
||||
|
|
|
@ -252,9 +252,9 @@ reserve_std_resources(void)
|
|||
}
|
||||
|
||||
#define PFN_MAX PFN_DOWN(0x80000000)
|
||||
#define for_each_mem_cluster(memdesc, cluster, i) \
|
||||
for ((cluster) = (memdesc)->cluster, (i) = 0; \
|
||||
(i) < (memdesc)->numclusters; (i)++, (cluster)++)
|
||||
#define for_each_mem_cluster(memdesc, _cluster, i) \
|
||||
for ((_cluster) = (memdesc)->cluster, (i) = 0; \
|
||||
(i) < (memdesc)->numclusters; (i)++, (_cluster)++)
|
||||
|
||||
static unsigned long __init
|
||||
get_mem_size_limit(char *s)
|
||||
|
|
|
@ -89,7 +89,7 @@ alcor_end_irq(unsigned int irq)
|
|||
alcor_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type alcor_irq_type = {
|
||||
static struct irq_chip alcor_irq_type = {
|
||||
.typename = "ALCOR",
|
||||
.startup = alcor_startup_irq,
|
||||
.shutdown = alcor_disable_irq,
|
||||
|
|
|
@ -71,7 +71,7 @@ cabriolet_end_irq(unsigned int irq)
|
|||
cabriolet_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type cabriolet_irq_type = {
|
||||
static struct irq_chip cabriolet_irq_type = {
|
||||
.typename = "CABRIOLET",
|
||||
.startup = cabriolet_startup_irq,
|
||||
.shutdown = cabriolet_disable_irq,
|
||||
|
|
|
@ -198,7 +198,7 @@ clipper_set_affinity(unsigned int irq, const struct cpumask *affinity)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type dp264_irq_type = {
|
||||
static struct irq_chip dp264_irq_type = {
|
||||
.typename = "DP264",
|
||||
.startup = dp264_startup_irq,
|
||||
.shutdown = dp264_disable_irq,
|
||||
|
@ -209,7 +209,7 @@ static struct hw_interrupt_type dp264_irq_type = {
|
|||
.set_affinity = dp264_set_affinity,
|
||||
};
|
||||
|
||||
static struct hw_interrupt_type clipper_irq_type = {
|
||||
static struct irq_chip clipper_irq_type = {
|
||||
.typename = "CLIPPER",
|
||||
.startup = clipper_startup_irq,
|
||||
.shutdown = clipper_disable_irq,
|
||||
|
@ -298,7 +298,7 @@ clipper_srm_device_interrupt(unsigned long vector)
|
|||
}
|
||||
|
||||
static void __init
|
||||
init_tsunami_irqs(struct hw_interrupt_type * ops, int imin, int imax)
|
||||
init_tsunami_irqs(struct irq_chip * ops, int imin, int imax)
|
||||
{
|
||||
long i;
|
||||
for (i = imin; i <= imax; ++i) {
|
||||
|
|
|
@ -69,7 +69,7 @@ eb64p_end_irq(unsigned int irq)
|
|||
eb64p_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type eb64p_irq_type = {
|
||||
static struct irq_chip eb64p_irq_type = {
|
||||
.typename = "EB64P",
|
||||
.startup = eb64p_startup_irq,
|
||||
.shutdown = eb64p_disable_irq,
|
||||
|
|
|
@ -80,7 +80,7 @@ eiger_end_irq(unsigned int irq)
|
|||
eiger_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type eiger_irq_type = {
|
||||
static struct irq_chip eiger_irq_type = {
|
||||
.typename = "EIGER",
|
||||
.startup = eiger_startup_irq,
|
||||
.shutdown = eiger_disable_irq,
|
||||
|
|
|
@ -118,7 +118,7 @@ jensen_local_end(unsigned int irq)
|
|||
i8259a_end_irq(1);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type jensen_local_irq_type = {
|
||||
static struct irq_chip jensen_local_irq_type = {
|
||||
.typename = "LOCAL",
|
||||
.startup = jensen_local_startup,
|
||||
.shutdown = jensen_local_shutdown,
|
||||
|
|
|
@ -169,7 +169,7 @@ marvel_irq_noop_return(unsigned int irq)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type marvel_legacy_irq_type = {
|
||||
static struct irq_chip marvel_legacy_irq_type = {
|
||||
.typename = "LEGACY",
|
||||
.startup = marvel_irq_noop_return,
|
||||
.shutdown = marvel_irq_noop,
|
||||
|
@ -179,7 +179,7 @@ static struct hw_interrupt_type marvel_legacy_irq_type = {
|
|||
.end = marvel_irq_noop,
|
||||
};
|
||||
|
||||
static struct hw_interrupt_type io7_lsi_irq_type = {
|
||||
static struct irq_chip io7_lsi_irq_type = {
|
||||
.typename = "LSI",
|
||||
.startup = io7_startup_irq,
|
||||
.shutdown = io7_disable_irq,
|
||||
|
@ -189,7 +189,7 @@ static struct hw_interrupt_type io7_lsi_irq_type = {
|
|||
.end = io7_end_irq,
|
||||
};
|
||||
|
||||
static struct hw_interrupt_type io7_msi_irq_type = {
|
||||
static struct irq_chip io7_msi_irq_type = {
|
||||
.typename = "MSI",
|
||||
.startup = io7_startup_irq,
|
||||
.shutdown = io7_disable_irq,
|
||||
|
@ -273,8 +273,8 @@ init_one_io7_msi(struct io7 *io7, unsigned int which, unsigned int where)
|
|||
|
||||
static void __init
|
||||
init_io7_irqs(struct io7 *io7,
|
||||
struct hw_interrupt_type *lsi_ops,
|
||||
struct hw_interrupt_type *msi_ops)
|
||||
struct irq_chip *lsi_ops,
|
||||
struct irq_chip *msi_ops)
|
||||
{
|
||||
long base = (io7->pe << MARVEL_IRQ_VEC_PE_SHIFT) + 16;
|
||||
long i;
|
||||
|
|
|
@ -68,7 +68,7 @@ mikasa_end_irq(unsigned int irq)
|
|||
mikasa_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type mikasa_irq_type = {
|
||||
static struct irq_chip mikasa_irq_type = {
|
||||
.typename = "MIKASA",
|
||||
.startup = mikasa_startup_irq,
|
||||
.shutdown = mikasa_disable_irq,
|
||||
|
|
|
@ -73,7 +73,7 @@ noritake_end_irq(unsigned int irq)
|
|||
noritake_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type noritake_irq_type = {
|
||||
static struct irq_chip noritake_irq_type = {
|
||||
.typename = "NORITAKE",
|
||||
.startup = noritake_startup_irq,
|
||||
.shutdown = noritake_disable_irq,
|
||||
|
|
|
@ -135,7 +135,7 @@ rawhide_end_irq(unsigned int irq)
|
|||
rawhide_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type rawhide_irq_type = {
|
||||
static struct irq_chip rawhide_irq_type = {
|
||||
.typename = "RAWHIDE",
|
||||
.startup = rawhide_startup_irq,
|
||||
.shutdown = rawhide_disable_irq,
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
|
|
@ -72,7 +72,7 @@ rx164_end_irq(unsigned int irq)
|
|||
rx164_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type rx164_irq_type = {
|
||||
static struct irq_chip rx164_irq_type = {
|
||||
.typename = "RX164",
|
||||
.startup = rx164_startup_irq,
|
||||
.shutdown = rx164_disable_irq,
|
||||
|
|
|
@ -501,7 +501,7 @@ sable_lynx_mask_and_ack_irq(unsigned int irq)
|
|||
spin_unlock(&sable_lynx_irq_lock);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type sable_lynx_irq_type = {
|
||||
static struct irq_chip sable_lynx_irq_type = {
|
||||
.typename = "SABLE/LYNX",
|
||||
.startup = sable_lynx_startup_irq,
|
||||
.shutdown = sable_lynx_disable_irq,
|
||||
|
|
|
@ -74,7 +74,7 @@ takara_end_irq(unsigned int irq)
|
|||
takara_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type takara_irq_type = {
|
||||
static struct irq_chip takara_irq_type = {
|
||||
.typename = "TAKARA",
|
||||
.startup = takara_startup_irq,
|
||||
.shutdown = takara_disable_irq,
|
||||
|
|
|
@ -185,7 +185,7 @@ titan_srm_device_interrupt(unsigned long vector)
|
|||
|
||||
|
||||
static void __init
|
||||
init_titan_irqs(struct hw_interrupt_type * ops, int imin, int imax)
|
||||
init_titan_irqs(struct irq_chip * ops, int imin, int imax)
|
||||
{
|
||||
long i;
|
||||
for (i = imin; i <= imax; ++i) {
|
||||
|
@ -194,7 +194,7 @@ init_titan_irqs(struct hw_interrupt_type * ops, int imin, int imax)
|
|||
}
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type titan_irq_type = {
|
||||
static struct irq_chip titan_irq_type = {
|
||||
.typename = "TITAN",
|
||||
.startup = titan_startup_irq,
|
||||
.shutdown = titan_disable_irq,
|
||||
|
|
|
@ -157,7 +157,7 @@ wildfire_end_irq(unsigned int irq)
|
|||
wildfire_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type wildfire_irq_type = {
|
||||
static struct irq_chip wildfire_irq_type = {
|
||||
.typename = "WILDFIRE",
|
||||
.startup = wildfire_startup_irq,
|
||||
.shutdown = wildfire_disable_irq,
|
||||
|
|
|
@ -28,9 +28,9 @@ EXPORT_SYMBOL(node_data);
|
|||
#define DBGDCONT(args...)
|
||||
#endif
|
||||
|
||||
#define for_each_mem_cluster(memdesc, cluster, i) \
|
||||
for ((cluster) = (memdesc)->cluster, (i) = 0; \
|
||||
(i) < (memdesc)->numclusters; (i)++, (cluster)++)
|
||||
#define for_each_mem_cluster(memdesc, _cluster, i) \
|
||||
for ((_cluster) = (memdesc)->cluster, (i) = 0; \
|
||||
(i) < (memdesc)->numclusters; (i)++, (_cluster)++)
|
||||
|
||||
static void __init show_mem_layout(void)
|
||||
{
|
||||
|
|
|
@ -14,10 +14,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial thread structure.
|
||||
*
|
||||
|
|
|
@ -380,12 +380,12 @@ static struct pca953x_platform_data pca9536_data = {
|
|||
.gpio_base = NR_BUILTIN_GPIO,
|
||||
};
|
||||
|
||||
static int gpio_bus_switch;
|
||||
static int gpio_bus_switch = -EINVAL;
|
||||
|
||||
static int pcm990_camera_set_bus_param(struct soc_camera_link *link,
|
||||
unsigned long flags)
|
||||
unsigned long flags)
|
||||
{
|
||||
if (gpio_bus_switch <= 0) {
|
||||
if (gpio_bus_switch < 0) {
|
||||
if (flags == SOCAM_DATAWIDTH_10)
|
||||
return 0;
|
||||
else
|
||||
|
@ -404,25 +404,34 @@ static unsigned long pcm990_camera_query_bus_param(struct soc_camera_link *link)
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (!gpio_bus_switch) {
|
||||
if (gpio_bus_switch < 0) {
|
||||
ret = gpio_request(NR_BUILTIN_GPIO, "camera");
|
||||
if (!ret) {
|
||||
gpio_bus_switch = NR_BUILTIN_GPIO;
|
||||
gpio_direction_output(gpio_bus_switch, 0);
|
||||
} else
|
||||
gpio_bus_switch = -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (gpio_bus_switch > 0)
|
||||
if (gpio_bus_switch >= 0)
|
||||
return SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_10;
|
||||
else
|
||||
return SOCAM_DATAWIDTH_10;
|
||||
}
|
||||
|
||||
static void pcm990_camera_free_bus(struct soc_camera_link *link)
|
||||
{
|
||||
if (gpio_bus_switch < 0)
|
||||
return;
|
||||
|
||||
gpio_free(gpio_bus_switch);
|
||||
gpio_bus_switch = -EINVAL;
|
||||
}
|
||||
|
||||
static struct soc_camera_link iclink = {
|
||||
.bus_id = 0, /* Must match with the camera ID above */
|
||||
.query_bus_param = pcm990_camera_query_bus_param,
|
||||
.set_bus_param = pcm990_camera_set_bus_param,
|
||||
.free_bus = pcm990_camera_free_bus,
|
||||
};
|
||||
|
||||
/* Board I2C devices. */
|
||||
|
|
50
arch/arm/plat-s3c/include/plat/regs-usb-hsotg-phy.h
Normal file
50
arch/arm/plat-s3c/include/plat/regs-usb-hsotg-phy.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* arch/arm/plat-s3c/include/plat/regs-usb-hsotg-phy.h
|
||||
*
|
||||
* Copyright 2008 Openmoko, Inc.
|
||||
* Copyright 2008 Simtec Electronics
|
||||
* http://armlinux.simtec.co.uk/
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* S3C - USB2.0 Highspeed/OtG device PHY registers
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
/* Note, this is a seperate header file as some of the clock framework
|
||||
* needs to touch this if the clk_48m is used as the USB OHCI or other
|
||||
* peripheral source.
|
||||
*/
|
||||
|
||||
#ifndef __PLAT_S3C64XX_REGS_USB_HSOTG_PHY_H
|
||||
#define __PLAT_S3C64XX_REGS_USB_HSOTG_PHY_H __FILE__
|
||||
|
||||
/* S3C64XX_PA_USB_HSPHY */
|
||||
|
||||
#define S3C_HSOTG_PHYREG(x) ((x) + S3C_VA_USB_HSPHY)
|
||||
|
||||
#define S3C_PHYPWR S3C_HSOTG_PHYREG(0x00)
|
||||
#define SRC_PHYPWR_OTG_DISABLE (1 << 4)
|
||||
#define SRC_PHYPWR_ANALOG_POWERDOWN (1 << 3)
|
||||
#define SRC_PHYPWR_FORCE_SUSPEND (1 << 1)
|
||||
|
||||
#define S3C_PHYCLK S3C_HSOTG_PHYREG(0x04)
|
||||
#define S3C_PHYCLK_MODE_USB11 (1 << 6)
|
||||
#define S3C_PHYCLK_EXT_OSC (1 << 5)
|
||||
#define S3C_PHYCLK_CLK_FORCE (1 << 4)
|
||||
#define S3C_PHYCLK_ID_PULL (1 << 2)
|
||||
#define S3C_PHYCLK_CLKSEL_MASK (0x3 << 0)
|
||||
#define S3C_PHYCLK_CLKSEL_SHIFT (0)
|
||||
#define S3C_PHYCLK_CLKSEL_48M (0x0 << 0)
|
||||
#define S3C_PHYCLK_CLKSEL_12M (0x2 << 0)
|
||||
#define S3C_PHYCLK_CLKSEL_24M (0x3 << 0)
|
||||
|
||||
#define S3C_RSTCON S3C_HSOTG_PHYREG(0x08)
|
||||
#define S3C_RSTCON_PHYCLK (1 << 2)
|
||||
#define S3C_RSTCON_HCLK (1 << 2)
|
||||
#define S3C_RSTCON_PHY (1 << 0)
|
||||
|
||||
#define S3C_PHYTUNE S3C_HSOTG_PHYREG(0x20)
|
||||
|
||||
#endif /* __PLAT_S3C64XX_REGS_USB_HSOTG_PHY_H */
|
377
arch/arm/plat-s3c/include/plat/regs-usb-hsotg.h
Normal file
377
arch/arm/plat-s3c/include/plat/regs-usb-hsotg.h
Normal file
|
@ -0,0 +1,377 @@
|
|||
/* arch/arm/plat-s3c/include/plat/regs-usb-hsotg.h
|
||||
*
|
||||
* Copyright 2008 Openmoko, Inc.
|
||||
* Copyright 2008 Simtec Electronics
|
||||
* http://armlinux.simtec.co.uk/
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* S3C - USB2.0 Highspeed/OtG device block registers
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __PLAT_S3C64XX_REGS_USB_HSOTG_H
|
||||
#define __PLAT_S3C64XX_REGS_USB_HSOTG_H __FILE__
|
||||
|
||||
#define S3C_HSOTG_REG(x) (x)
|
||||
|
||||
#define S3C_GOTGCTL S3C_HSOTG_REG(0x000)
|
||||
#define S3C_GOTGCTL_BSESVLD (1 << 19)
|
||||
#define S3C_GOTGCTL_ASESVLD (1 << 18)
|
||||
#define S3C_GOTGCTL_DBNC_SHORT (1 << 17)
|
||||
#define S3C_GOTGCTL_CONID_B (1 << 16)
|
||||
#define S3C_GOTGCTL_DEVHNPEN (1 << 11)
|
||||
#define S3C_GOTGCTL_HSSETHNPEN (1 << 10)
|
||||
#define S3C_GOTGCTL_HNPREQ (1 << 9)
|
||||
#define S3C_GOTGCTL_HSTNEGSCS (1 << 8)
|
||||
#define S3C_GOTGCTL_SESREQ (1 << 1)
|
||||
#define S3C_GOTGCTL_SESREQSCS (1 << 0)
|
||||
|
||||
#define S3C_GOTGINT S3C_HSOTG_REG(0x004)
|
||||
#define S3C_GOTGINT_DbnceDone (1 << 19)
|
||||
#define S3C_GOTGINT_ADevTOUTChg (1 << 18)
|
||||
#define S3C_GOTGINT_HstNegDet (1 << 17)
|
||||
#define S3C_GOTGINT_HstnegSucStsChng (1 << 9)
|
||||
#define S3C_GOTGINT_SesReqSucStsChng (1 << 8)
|
||||
#define S3C_GOTGINT_SesEndDet (1 << 2)
|
||||
|
||||
#define S3C_GAHBCFG S3C_HSOTG_REG(0x008)
|
||||
#define S3C_GAHBCFG_PTxFEmpLvl (1 << 8)
|
||||
#define S3C_GAHBCFG_NPTxFEmpLvl (1 << 7)
|
||||
#define S3C_GAHBCFG_DMAEn (1 << 5)
|
||||
#define S3C_GAHBCFG_HBstLen_MASK (0xf << 1)
|
||||
#define S3C_GAHBCFG_HBstLen_SHIFT (1)
|
||||
#define S3C_GAHBCFG_HBstLen_Single (0x0 << 1)
|
||||
#define S3C_GAHBCFG_HBstLen_Incr (0x1 << 1)
|
||||
#define S3C_GAHBCFG_HBstLen_Incr4 (0x3 << 1)
|
||||
#define S3C_GAHBCFG_HBstLen_Incr8 (0x5 << 1)
|
||||
#define S3C_GAHBCFG_HBstLen_Incr16 (0x7 << 1)
|
||||
#define S3C_GAHBCFG_GlblIntrEn (1 << 0)
|
||||
|
||||
#define S3C_GUSBCFG S3C_HSOTG_REG(0x00C)
|
||||
#define S3C_GUSBCFG_PHYLPClkSel (1 << 15)
|
||||
#define S3C_GUSBCFG_HNPCap (1 << 9)
|
||||
#define S3C_GUSBCFG_SRPCap (1 << 8)
|
||||
#define S3C_GUSBCFG_PHYIf16 (1 << 3)
|
||||
#define S3C_GUSBCFG_TOutCal_MASK (0x7 << 0)
|
||||
#define S3C_GUSBCFG_TOutCal_SHIFT (0)
|
||||
#define S3C_GUSBCFG_TOutCal_LIMIT (0x7)
|
||||
#define S3C_GUSBCFG_TOutCal(_x) ((_x) << 0)
|
||||
|
||||
#define S3C_GRSTCTL S3C_HSOTG_REG(0x010)
|
||||
|
||||
#define S3C_GRSTCTL_AHBIdle (1 << 31)
|
||||
#define S3C_GRSTCTL_DMAReq (1 << 30)
|
||||
#define S3C_GRSTCTL_TxFNum_MASK (0x1f << 6)
|
||||
#define S3C_GRSTCTL_TxFNum_SHIFT (6)
|
||||
#define S3C_GRSTCTL_TxFNum_LIMIT (0x1f)
|
||||
#define S3C_GRSTCTL_TxFNum(_x) ((_x) << 6)
|
||||
#define S3C_GRSTCTL_TxFFlsh (1 << 5)
|
||||
#define S3C_GRSTCTL_RxFFlsh (1 << 4)
|
||||
#define S3C_GRSTCTL_INTknQFlsh (1 << 3)
|
||||
#define S3C_GRSTCTL_FrmCntrRst (1 << 2)
|
||||
#define S3C_GRSTCTL_HSftRst (1 << 1)
|
||||
#define S3C_GRSTCTL_CSftRst (1 << 0)
|
||||
|
||||
#define S3C_GINTSTS S3C_HSOTG_REG(0x014)
|
||||
#define S3C_GINTMSK S3C_HSOTG_REG(0x018)
|
||||
|
||||
#define S3C_GINTSTS_WkUpInt (1 << 31)
|
||||
#define S3C_GINTSTS_SessReqInt (1 << 30)
|
||||
#define S3C_GINTSTS_DisconnInt (1 << 29)
|
||||
#define S3C_GINTSTS_ConIDStsChng (1 << 28)
|
||||
#define S3C_GINTSTS_PTxFEmp (1 << 26)
|
||||
#define S3C_GINTSTS_HChInt (1 << 25)
|
||||
#define S3C_GINTSTS_PrtInt (1 << 24)
|
||||
#define S3C_GINTSTS_FetSusp (1 << 22)
|
||||
#define S3C_GINTSTS_incompIP (1 << 21)
|
||||
#define S3C_GINTSTS_IncomplSOIN (1 << 20)
|
||||
#define S3C_GINTSTS_OEPInt (1 << 19)
|
||||
#define S3C_GINTSTS_IEPInt (1 << 18)
|
||||
#define S3C_GINTSTS_EPMis (1 << 17)
|
||||
#define S3C_GINTSTS_EOPF (1 << 15)
|
||||
#define S3C_GINTSTS_ISOutDrop (1 << 14)
|
||||
#define S3C_GINTSTS_EnumDone (1 << 13)
|
||||
#define S3C_GINTSTS_USBRst (1 << 12)
|
||||
#define S3C_GINTSTS_USBSusp (1 << 11)
|
||||
#define S3C_GINTSTS_ErlySusp (1 << 10)
|
||||
#define S3C_GINTSTS_GOUTNakEff (1 << 7)
|
||||
#define S3C_GINTSTS_GINNakEff (1 << 6)
|
||||
#define S3C_GINTSTS_NPTxFEmp (1 << 5)
|
||||
#define S3C_GINTSTS_RxFLvl (1 << 4)
|
||||
#define S3C_GINTSTS_SOF (1 << 3)
|
||||
#define S3C_GINTSTS_OTGInt (1 << 2)
|
||||
#define S3C_GINTSTS_ModeMis (1 << 1)
|
||||
#define S3C_GINTSTS_CurMod_Host (1 << 0)
|
||||
|
||||
#define S3C_GRXSTSR S3C_HSOTG_REG(0x01C)
|
||||
#define S3C_GRXSTSP S3C_HSOTG_REG(0x020)
|
||||
|
||||
#define S3C_GRXSTS_FN_MASK (0x7f << 25)
|
||||
#define S3C_GRXSTS_FN_SHIFT (25)
|
||||
|
||||
#define S3C_GRXSTS_PktSts_MASK (0xf << 17)
|
||||
#define S3C_GRXSTS_PktSts_SHIFT (17)
|
||||
#define S3C_GRXSTS_PktSts_GlobalOutNAK (0x1 << 17)
|
||||
#define S3C_GRXSTS_PktSts_OutRX (0x2 << 17)
|
||||
#define S3C_GRXSTS_PktSts_OutDone (0x3 << 17)
|
||||
#define S3C_GRXSTS_PktSts_SetupDone (0x4 << 17)
|
||||
#define S3C_GRXSTS_PktSts_SetupRX (0x6 << 17)
|
||||
|
||||
#define S3C_GRXSTS_DPID_MASK (0x3 << 15)
|
||||
#define S3C_GRXSTS_DPID_SHIFT (15)
|
||||
#define S3C_GRXSTS_ByteCnt_MASK (0x7ff << 4)
|
||||
#define S3C_GRXSTS_ByteCnt_SHIFT (4)
|
||||
#define S3C_GRXSTS_EPNum_MASK (0xf << 0)
|
||||
#define S3C_GRXSTS_EPNum_SHIFT (0)
|
||||
|
||||
#define S3C_GRXFSIZ S3C_HSOTG_REG(0x024)
|
||||
|
||||
#define S3C_GNPTXFSIZ S3C_HSOTG_REG(0x028)
|
||||
|
||||
#define S3C_GNPTXFSIZ_NPTxFDep_MASK (0xffff << 16)
|
||||
#define S3C_GNPTXFSIZ_NPTxFDep_SHIFT (16)
|
||||
#define S3C_GNPTXFSIZ_NPTxFDep_LIMIT (0xffff)
|
||||
#define S3C_GNPTXFSIZ_NPTxFDep(_x) ((_x) << 16)
|
||||
#define S3C_GNPTXFSIZ_NPTxFStAddr_MASK (0xffff << 0)
|
||||
#define S3C_GNPTXFSIZ_NPTxFStAddr_SHIFT (0)
|
||||
#define S3C_GNPTXFSIZ_NPTxFStAddr_LIMIT (0xffff)
|
||||
#define S3C_GNPTXFSIZ_NPTxFStAddr(_x) ((_x) << 0)
|
||||
|
||||
#define S3C_GNPTXSTS S3C_HSOTG_REG(0x02C)
|
||||
|
||||
#define S3C_GNPTXSTS_NPtxQTop_MASK (0x7f << 24)
|
||||
#define S3C_GNPTXSTS_NPtxQTop_SHIFT (24)
|
||||
|
||||
#define S3C_GNPTXSTS_NPTxQSpcAvail_MASK (0xff << 16)
|
||||
#define S3C_GNPTXSTS_NPTxQSpcAvail_SHIFT (16)
|
||||
#define S3C_GNPTXSTS_NPTxQSpcAvail_GET(_v) (((_v) >> 16) & 0xff)
|
||||
|
||||
#define S3C_GNPTXSTS_NPTxFSpcAvail_MASK (0xffff << 0)
|
||||
#define S3C_GNPTXSTS_NPTxFSpcAvail_SHIFT (0)
|
||||
#define S3C_GNPTXSTS_NPTxFSpcAvail_GET(_v) (((_v) >> 0) & 0xffff)
|
||||
|
||||
|
||||
#define S3C_HPTXFSIZ S3C_HSOTG_REG(0x100)
|
||||
|
||||
#define S3C_DPTXFSIZn(_a) S3C_HSOTG_REG(0x104 + (((_a) - 1) * 4))
|
||||
|
||||
#define S3C_DPTXFSIZn_DPTxFSize_MASK (0xffff << 16)
|
||||
#define S3C_DPTXFSIZn_DPTxFSize_SHIFT (16)
|
||||
#define S3C_DPTXFSIZn_DPTxFSize_GET(_v) (((_v) >> 16) & 0xffff)
|
||||
#define S3C_DPTXFSIZn_DPTxFSize_LIMIT (0xffff)
|
||||
#define S3C_DPTXFSIZn_DPTxFSize(_x) ((_x) << 16)
|
||||
|
||||
#define S3C_DPTXFSIZn_DPTxFStAddr_MASK (0xffff << 0)
|
||||
#define S3C_DPTXFSIZn_DPTxFStAddr_SHIFT (0)
|
||||
|
||||
/* Device mode registers */
|
||||
#define S3C_DCFG S3C_HSOTG_REG(0x800)
|
||||
|
||||
#define S3C_DCFG_EPMisCnt_MASK (0x1f << 18)
|
||||
#define S3C_DCFG_EPMisCnt_SHIFT (18)
|
||||
#define S3C_DCFG_EPMisCnt_LIMIT (0x1f)
|
||||
#define S3C_DCFG_EPMisCnt(_x) ((_x) << 18)
|
||||
|
||||
#define S3C_DCFG_PerFrInt_MASK (0x3 << 11)
|
||||
#define S3C_DCFG_PerFrInt_SHIFT (11)
|
||||
#define S3C_DCFG_PerFrInt_LIMIT (0x3)
|
||||
#define S3C_DCFG_PerFrInt(_x) ((_x) << 11)
|
||||
|
||||
#define S3C_DCFG_DevAddr_MASK (0x7f << 4)
|
||||
#define S3C_DCFG_DevAddr_SHIFT (4)
|
||||
#define S3C_DCFG_DevAddr_LIMIT (0x7f)
|
||||
#define S3C_DCFG_DevAddr(_x) ((_x) << 4)
|
||||
|
||||
#define S3C_DCFG_NZStsOUTHShk (1 << 2)
|
||||
|
||||
#define S3C_DCFG_DevSpd_MASK (0x3 << 0)
|
||||
#define S3C_DCFG_DevSpd_SHIFT (0)
|
||||
#define S3C_DCFG_DevSpd_HS (0x0 << 0)
|
||||
#define S3C_DCFG_DevSpd_FS (0x1 << 0)
|
||||
#define S3C_DCFG_DevSpd_LS (0x2 << 0)
|
||||
#define S3C_DCFG_DevSpd_FS48 (0x3 << 0)
|
||||
|
||||
#define S3C_DCTL S3C_HSOTG_REG(0x804)
|
||||
|
||||
#define S3C_DCTL_PWROnPrgDone (1 << 11)
|
||||
#define S3C_DCTL_CGOUTNak (1 << 10)
|
||||
#define S3C_DCTL_SGOUTNak (1 << 9)
|
||||
#define S3C_DCTL_CGNPInNAK (1 << 8)
|
||||
#define S3C_DCTL_SGNPInNAK (1 << 7)
|
||||
#define S3C_DCTL_TstCtl_MASK (0x7 << 4)
|
||||
#define S3C_DCTL_TstCtl_SHIFT (4)
|
||||
#define S3C_DCTL_GOUTNakSts (1 << 3)
|
||||
#define S3C_DCTL_GNPINNakSts (1 << 2)
|
||||
#define S3C_DCTL_SftDiscon (1 << 1)
|
||||
#define S3C_DCTL_RmtWkUpSig (1 << 0)
|
||||
|
||||
#define S3C_DSTS S3C_HSOTG_REG(0x808)
|
||||
|
||||
#define S3C_DSTS_SOFFN_MASK (0x3fff << 8)
|
||||
#define S3C_DSTS_SOFFN_SHIFT (8)
|
||||
#define S3C_DSTS_SOFFN_LIMIT (0x3fff)
|
||||
#define S3C_DSTS_SOFFN(_x) ((_x) << 8)
|
||||
#define S3C_DSTS_ErraticErr (1 << 3)
|
||||
#define S3C_DSTS_EnumSpd_MASK (0x3 << 1)
|
||||
#define S3C_DSTS_EnumSpd_SHIFT (1)
|
||||
#define S3C_DSTS_EnumSpd_HS (0x0 << 1)
|
||||
#define S3C_DSTS_EnumSpd_FS (0x1 << 1)
|
||||
#define S3C_DSTS_EnumSpd_LS (0x2 << 1)
|
||||
#define S3C_DSTS_EnumSpd_FS48 (0x3 << 1)
|
||||
|
||||
#define S3C_DSTS_SuspSts (1 << 0)
|
||||
|
||||
#define S3C_DIEPMSK S3C_HSOTG_REG(0x810)
|
||||
|
||||
#define S3C_DIEPMSK_INEPNakEffMsk (1 << 6)
|
||||
#define S3C_DIEPMSK_INTknEPMisMsk (1 << 5)
|
||||
#define S3C_DIEPMSK_INTknTXFEmpMsk (1 << 4)
|
||||
#define S3C_DIEPMSK_TimeOUTMsk (1 << 3)
|
||||
#define S3C_DIEPMSK_AHBErrMsk (1 << 2)
|
||||
#define S3C_DIEPMSK_EPDisbldMsk (1 << 1)
|
||||
#define S3C_DIEPMSK_XferComplMsk (1 << 0)
|
||||
|
||||
#define S3C_DOEPMSK S3C_HSOTG_REG(0x814)
|
||||
|
||||
#define S3C_DOEPMSK_Back2BackSetup (1 << 6)
|
||||
#define S3C_DOEPMSK_OUTTknEPdisMsk (1 << 4)
|
||||
#define S3C_DOEPMSK_SetupMsk (1 << 3)
|
||||
#define S3C_DOEPMSK_AHBErrMsk (1 << 2)
|
||||
#define S3C_DOEPMSK_EPDisbldMsk (1 << 1)
|
||||
#define S3C_DOEPMSK_XferComplMsk (1 << 0)
|
||||
|
||||
#define S3C_DAINT S3C_HSOTG_REG(0x818)
|
||||
#define S3C_DAINTMSK S3C_HSOTG_REG(0x81C)
|
||||
|
||||
#define S3C_DAINT_OutEP_SHIFT (16)
|
||||
#define S3C_DAINT_OutEP(x) (1 << ((x) + 16))
|
||||
#define S3C_DAINT_InEP(x) (1 << (x))
|
||||
|
||||
#define S3C_DTKNQR1 S3C_HSOTG_REG(0x820)
|
||||
#define S3C_DTKNQR2 S3C_HSOTG_REG(0x824)
|
||||
#define S3C_DTKNQR3 S3C_HSOTG_REG(0x830)
|
||||
#define S3C_DTKNQR4 S3C_HSOTG_REG(0x834)
|
||||
|
||||
#define S3C_DVBUSDIS S3C_HSOTG_REG(0x828)
|
||||
#define S3C_DVBUSPULSE S3C_HSOTG_REG(0x82C)
|
||||
|
||||
#define S3C_DIEPCTL0 S3C_HSOTG_REG(0x900)
|
||||
#define S3C_DOEPCTL0 S3C_HSOTG_REG(0xB00)
|
||||
#define S3C_DIEPCTL(_a) S3C_HSOTG_REG(0x900 + ((_a) * 0x20))
|
||||
#define S3C_DOEPCTL(_a) S3C_HSOTG_REG(0xB00 + ((_a) * 0x20))
|
||||
|
||||
/* EP0 specialness:
|
||||
* bits[29..28] - reserved (no SetD0PID, SetD1PID)
|
||||
* bits[25..22] - should always be zero, this isn't a periodic endpoint
|
||||
* bits[10..0] - MPS setting differenct for EP0
|
||||
*/
|
||||
#define S3C_D0EPCTL_MPS_MASK (0x3 << 0)
|
||||
#define S3C_D0EPCTL_MPS_SHIFT (0)
|
||||
#define S3C_D0EPCTL_MPS_64 (0x0 << 0)
|
||||
#define S3C_D0EPCTL_MPS_32 (0x1 << 0)
|
||||
#define S3C_D0EPCTL_MPS_16 (0x2 << 0)
|
||||
#define S3C_D0EPCTL_MPS_8 (0x3 << 0)
|
||||
|
||||
#define S3C_DxEPCTL_EPEna (1 << 31)
|
||||
#define S3C_DxEPCTL_EPDis (1 << 30)
|
||||
#define S3C_DxEPCTL_SetD1PID (1 << 29)
|
||||
#define S3C_DxEPCTL_SetOddFr (1 << 29)
|
||||
#define S3C_DxEPCTL_SetD0PID (1 << 28)
|
||||
#define S3C_DxEPCTL_SetEvenFr (1 << 28)
|
||||
#define S3C_DxEPCTL_SNAK (1 << 27)
|
||||
#define S3C_DxEPCTL_CNAK (1 << 26)
|
||||
#define S3C_DxEPCTL_TxFNum_MASK (0xf << 22)
|
||||
#define S3C_DxEPCTL_TxFNum_SHIFT (22)
|
||||
#define S3C_DxEPCTL_TxFNum_LIMIT (0xf)
|
||||
#define S3C_DxEPCTL_TxFNum(_x) ((_x) << 22)
|
||||
|
||||
#define S3C_DxEPCTL_Stall (1 << 21)
|
||||
#define S3C_DxEPCTL_Snp (1 << 20)
|
||||
#define S3C_DxEPCTL_EPType_MASK (0x3 << 18)
|
||||
#define S3C_DxEPCTL_EPType_SHIFT (18)
|
||||
#define S3C_DxEPCTL_EPType_Control (0x0 << 18)
|
||||
#define S3C_DxEPCTL_EPType_Iso (0x1 << 18)
|
||||
#define S3C_DxEPCTL_EPType_Bulk (0x2 << 18)
|
||||
#define S3C_DxEPCTL_EPType_Intterupt (0x3 << 18)
|
||||
|
||||
#define S3C_DxEPCTL_NAKsts (1 << 17)
|
||||
#define S3C_DxEPCTL_DPID (1 << 16)
|
||||
#define S3C_DxEPCTL_EOFrNum (1 << 16)
|
||||
#define S3C_DxEPCTL_USBActEp (1 << 15)
|
||||
#define S3C_DxEPCTL_NextEp_MASK (0xf << 11)
|
||||
#define S3C_DxEPCTL_NextEp_SHIFT (11)
|
||||
#define S3C_DxEPCTL_NextEp_LIMIT (0xf)
|
||||
#define S3C_DxEPCTL_NextEp(_x) ((_x) << 11)
|
||||
|
||||
#define S3C_DxEPCTL_MPS_MASK (0x7ff << 0)
|
||||
#define S3C_DxEPCTL_MPS_SHIFT (0)
|
||||
#define S3C_DxEPCTL_MPS_LIMIT (0x7ff)
|
||||
#define S3C_DxEPCTL_MPS(_x) ((_x) << 0)
|
||||
|
||||
#define S3C_DIEPINT(_a) S3C_HSOTG_REG(0x908 + ((_a) * 0x20))
|
||||
#define S3C_DOEPINT(_a) S3C_HSOTG_REG(0xB08 + ((_a) * 0x20))
|
||||
|
||||
#define S3C_DxEPINT_INEPNakEff (1 << 6)
|
||||
#define S3C_DxEPINT_Back2BackSetup (1 << 6)
|
||||
#define S3C_DxEPINT_INTknEPMis (1 << 5)
|
||||
#define S3C_DxEPINT_INTknTXFEmp (1 << 4)
|
||||
#define S3C_DxEPINT_OUTTknEPdis (1 << 4)
|
||||
#define S3C_DxEPINT_Timeout (1 << 3)
|
||||
#define S3C_DxEPINT_Setup (1 << 3)
|
||||
#define S3C_DxEPINT_AHBErr (1 << 2)
|
||||
#define S3C_DxEPINT_EPDisbld (1 << 1)
|
||||
#define S3C_DxEPINT_XferCompl (1 << 0)
|
||||
|
||||
#define S3C_DIEPTSIZ0 S3C_HSOTG_REG(0x910)
|
||||
|
||||
#define S3C_DIEPTSIZ0_PktCnt_MASK (0x3 << 19)
|
||||
#define S3C_DIEPTSIZ0_PktCnt_SHIFT (19)
|
||||
#define S3C_DIEPTSIZ0_PktCnt_LIMIT (0x3)
|
||||
#define S3C_DIEPTSIZ0_PktCnt(_x) ((_x) << 19)
|
||||
|
||||
#define S3C_DIEPTSIZ0_XferSize_MASK (0x7f << 0)
|
||||
#define S3C_DIEPTSIZ0_XferSize_SHIFT (0)
|
||||
#define S3C_DIEPTSIZ0_XferSize_LIMIT (0x7f)
|
||||
#define S3C_DIEPTSIZ0_XferSize(_x) ((_x) << 0)
|
||||
|
||||
|
||||
#define DOEPTSIZ0 S3C_HSOTG_REG(0xB10)
|
||||
#define S3C_DOEPTSIZ0_SUPCnt_MASK (0x3 << 29)
|
||||
#define S3C_DOEPTSIZ0_SUPCnt_SHIFT (29)
|
||||
#define S3C_DOEPTSIZ0_SUPCnt_LIMIT (0x3)
|
||||
#define S3C_DOEPTSIZ0_SUPCnt(_x) ((_x) << 29)
|
||||
|
||||
#define S3C_DOEPTSIZ0_PktCnt (1 << 19)
|
||||
#define S3C_DOEPTSIZ0_XferSize_MASK (0x7f << 0)
|
||||
#define S3C_DOEPTSIZ0_XferSize_SHIFT (0)
|
||||
|
||||
#define S3C_DIEPTSIZ(_a) S3C_HSOTG_REG(0x910 + ((_a) * 0x20))
|
||||
#define S3C_DOEPTSIZ(_a) S3C_HSOTG_REG(0xB10 + ((_a) * 0x20))
|
||||
|
||||
#define S3C_DxEPTSIZ_MC_MASK (0x3 << 29)
|
||||
#define S3C_DxEPTSIZ_MC_SHIFT (29)
|
||||
#define S3C_DxEPTSIZ_MC_LIMIT (0x3)
|
||||
#define S3C_DxEPTSIZ_MC(_x) ((_x) << 29)
|
||||
|
||||
#define S3C_DxEPTSIZ_PktCnt_MASK (0x3ff << 19)
|
||||
#define S3C_DxEPTSIZ_PktCnt_SHIFT (19)
|
||||
#define S3C_DxEPTSIZ_PktCnt_GET(_v) (((_v) >> 19) & 0x3ff)
|
||||
#define S3C_DxEPTSIZ_PktCnt_LIMIT (0x3ff)
|
||||
#define S3C_DxEPTSIZ_PktCnt(_x) ((_x) << 19)
|
||||
|
||||
#define S3C_DxEPTSIZ_XferSize_MASK (0x7ffff << 0)
|
||||
#define S3C_DxEPTSIZ_XferSize_SHIFT (0)
|
||||
#define S3C_DxEPTSIZ_XferSize_GET(_v) (((_v) >> 0) & 0x7ffff)
|
||||
#define S3C_DxEPTSIZ_XferSize_LIMIT (0x7ffff)
|
||||
#define S3C_DxEPTSIZ_XferSize(_x) ((_x) << 0)
|
||||
|
||||
|
||||
#define S3C_DIEPDMA(_a) S3C_HSOTG_REG(0x914 + ((_a) * 0x20))
|
||||
#define S3C_DOEPDMA(_a) S3C_HSOTG_REG(0xB14 + ((_a) * 0x20))
|
||||
|
||||
#define S3C_EPFIFO(_a) S3C_HSOTG_REG(0x1000 + ((_a) * 0x1000))
|
||||
|
||||
#endif /* __PLAT_S3C64XX_REGS_USB_HSOTG_H */
|
|
@ -15,10 +15,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial thread structure. Must be aligned on an 8192-byte boundary.
|
||||
*/
|
||||
|
|
|
@ -1,21 +1,6 @@
|
|||
#ifndef _ASM_KMAP_TYPES_H
|
||||
#define _ASM_KMAP_TYPES_H
|
||||
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_BIO_SRC_IRQ,
|
||||
KM_BIO_DST_IRQ,
|
||||
KM_PTE0,
|
||||
KM_PTE1,
|
||||
KM_IRQ0,
|
||||
KM_IRQ1,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#endif
|
||||
|
|
|
@ -35,10 +35,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial task structure.
|
||||
*
|
||||
|
|
|
@ -5,21 +5,6 @@
|
|||
* is actually used on cris.
|
||||
*/
|
||||
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_BIO_SRC_IRQ,
|
||||
KM_BIO_DST_IRQ,
|
||||
KM_PTE0,
|
||||
KM_PTE1,
|
||||
KM_IRQ0,
|
||||
KM_IRQ1,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#endif
|
||||
|
|
|
@ -38,10 +38,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial thread structure.
|
||||
*
|
||||
|
|
|
@ -12,10 +12,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial thread structure.
|
||||
*
|
||||
|
|
|
@ -1,21 +1,6 @@
|
|||
#ifndef _ASM_H8300_KMAP_TYPES_H
|
||||
#define _ASM_H8300_KMAP_TYPES_H
|
||||
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_BIO_SRC_IRQ,
|
||||
KM_BIO_DST_IRQ,
|
||||
KM_PTE0,
|
||||
KM_PTE1,
|
||||
KM_IRQ0,
|
||||
KM_IRQ1,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#endif
|
||||
|
|
|
@ -14,10 +14,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial task structure.
|
||||
*
|
||||
|
|
|
@ -1131,7 +1131,7 @@ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp
|
|||
#ifdef CONFIG_NUMA
|
||||
{
|
||||
struct page *page;
|
||||
page = alloc_pages_node(ioc->node == MAX_NUMNODES ?
|
||||
page = alloc_pages_exact_node(ioc->node == MAX_NUMNODES ?
|
||||
numa_node_id() : ioc->node, flags,
|
||||
get_order(size));
|
||||
|
||||
|
|
|
@ -1,30 +1,12 @@
|
|||
#ifndef _ASM_IA64_KMAP_TYPES_H
|
||||
#define _ASM_IA64_KMAP_TYPES_H
|
||||
|
||||
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
# define D(n) __KM_FENCE_##n ,
|
||||
#else
|
||||
# define D(n)
|
||||
#define __WITH_KM_FENCE
|
||||
#endif
|
||||
|
||||
enum km_type {
|
||||
D(0) KM_BOUNCE_READ,
|
||||
D(1) KM_SKB_SUNRPC_DATA,
|
||||
D(2) KM_SKB_DATA_SOFTIRQ,
|
||||
D(3) KM_USER0,
|
||||
D(4) KM_USER1,
|
||||
D(5) KM_BIO_SRC_IRQ,
|
||||
D(6) KM_BIO_DST_IRQ,
|
||||
D(7) KM_PTE0,
|
||||
D(8) KM_PTE1,
|
||||
D(9) KM_IRQ0,
|
||||
D(10) KM_IRQ1,
|
||||
D(11) KM_SOFTIRQ0,
|
||||
D(12) KM_SOFTIRQ1,
|
||||
D(13) KM_TYPE_NR
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#undef D
|
||||
#undef __WITH_KM_FENCE
|
||||
|
||||
#endif /* _ASM_IA64_KMAP_TYPES_H */
|
||||
|
|
|
@ -19,10 +19,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial task structure.
|
||||
*
|
||||
|
|
|
@ -1829,8 +1829,7 @@ ia64_mca_cpu_init(void *cpu_data)
|
|||
data = mca_bootmem();
|
||||
first_time = 0;
|
||||
} else
|
||||
data = page_address(alloc_pages_node(numa_node_id(),
|
||||
GFP_KERNEL, get_order(sz)));
|
||||
data = __get_free_pages(GFP_KERNEL, get_order(sz));
|
||||
if (!data)
|
||||
panic("Could not allocate MCA memory for cpu %d\n",
|
||||
cpu);
|
||||
|
|
|
@ -5595,7 +5595,7 @@ pfm_interrupt_handler(int irq, void *arg)
|
|||
(*pfm_alt_intr_handler->handler)(irq, arg, regs);
|
||||
}
|
||||
|
||||
put_cpu_no_resched();
|
||||
put_cpu();
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
@ -98,7 +98,8 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid)
|
|||
|
||||
/* attempt to allocate a granule's worth of cached memory pages */
|
||||
|
||||
page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
|
||||
page = alloc_pages_exact_node(nid,
|
||||
GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
|
||||
IA64_GRANULE_SHIFT-PAGE_SHIFT);
|
||||
if (!page) {
|
||||
mutex_unlock(&uc_pool->add_chunk_mutex);
|
||||
|
|
|
@ -90,7 +90,8 @@ static void *sn_dma_alloc_coherent(struct device *dev, size_t size,
|
|||
*/
|
||||
node = pcibus_to_node(pdev->bus);
|
||||
if (likely(node >=0)) {
|
||||
struct page *p = alloc_pages_node(node, flags, get_order(size));
|
||||
struct page *p = alloc_pages_exact_node(node,
|
||||
flags, get_order(size));
|
||||
|
||||
if (likely(p))
|
||||
cpuaddr = page_address(p);
|
||||
|
|
|
@ -2,28 +2,11 @@
|
|||
#define __M32R_KMAP_TYPES_H
|
||||
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
# define D(n) __KM_FENCE_##n ,
|
||||
#else
|
||||
# define D(n)
|
||||
#define __WITH_KM_FENCE
|
||||
#endif
|
||||
|
||||
enum km_type {
|
||||
D(0) KM_BOUNCE_READ,
|
||||
D(1) KM_SKB_SUNRPC_DATA,
|
||||
D(2) KM_SKB_DATA_SOFTIRQ,
|
||||
D(3) KM_USER0,
|
||||
D(4) KM_USER1,
|
||||
D(5) KM_BIO_SRC_IRQ,
|
||||
D(6) KM_BIO_DST_IRQ,
|
||||
D(7) KM_PTE0,
|
||||
D(8) KM_PTE1,
|
||||
D(9) KM_IRQ0,
|
||||
D(10) KM_IRQ1,
|
||||
D(11) KM_SOFTIRQ0,
|
||||
D(12) KM_SOFTIRQ1,
|
||||
D(13) KM_TYPE_NR
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#undef D
|
||||
#undef __WITH_KM_FENCE
|
||||
|
||||
#endif /* __M32R_KMAP_TYPES_H */
|
||||
|
|
|
@ -13,10 +13,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial thread structure.
|
||||
*
|
||||
|
|
|
@ -154,9 +154,9 @@ unsigned long __init zone_sizes_init(void)
|
|||
* Use all area of internal RAM.
|
||||
* see __alloc_pages()
|
||||
*/
|
||||
NODE_DATA(1)->node_zones->pages_min = 0;
|
||||
NODE_DATA(1)->node_zones->pages_low = 0;
|
||||
NODE_DATA(1)->node_zones->pages_high = 0;
|
||||
NODE_DATA(1)->node_zones->watermark[WMARK_MIN] = 0;
|
||||
NODE_DATA(1)->node_zones->watermark[WMARK_LOW] = 0;
|
||||
NODE_DATA(1)->node_zones->watermark[WMARK_HIGH] = 0;
|
||||
|
||||
return holes;
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ static void shutdown_m32104ut_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type m32104ut_irq_type =
|
||||
static struct irq_chip m32104ut_irq_type =
|
||||
{
|
||||
.typename = "M32104UT-IRQ",
|
||||
.startup = startup_m32104ut_irq,
|
||||
|
|
|
@ -69,7 +69,7 @@ static void shutdown_m32700ut_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type m32700ut_irq_type =
|
||||
static struct irq_chip m32700ut_irq_type =
|
||||
{
|
||||
.typename = "M32700UT-IRQ",
|
||||
.startup = startup_m32700ut_irq,
|
||||
|
@ -146,7 +146,7 @@ static void shutdown_m32700ut_pld_irq(unsigned int irq)
|
|||
outw(PLD_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type m32700ut_pld_irq_type =
|
||||
static struct irq_chip m32700ut_pld_irq_type =
|
||||
{
|
||||
.typename = "M32700UT-PLD-IRQ",
|
||||
.startup = startup_m32700ut_pld_irq,
|
||||
|
@ -215,7 +215,7 @@ static void shutdown_m32700ut_lanpld_irq(unsigned int irq)
|
|||
outw(PLD_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type m32700ut_lanpld_irq_type =
|
||||
static struct irq_chip m32700ut_lanpld_irq_type =
|
||||
{
|
||||
.typename = "M32700UT-PLD-LAN-IRQ",
|
||||
.startup = startup_m32700ut_lanpld_irq,
|
||||
|
@ -284,7 +284,7 @@ static void shutdown_m32700ut_lcdpld_irq(unsigned int irq)
|
|||
outw(PLD_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type m32700ut_lcdpld_irq_type =
|
||||
static struct irq_chip m32700ut_lcdpld_irq_type =
|
||||
{
|
||||
.typename = "M32700UT-PLD-LCD-IRQ",
|
||||
.startup = startup_m32700ut_lcdpld_irq,
|
||||
|
|
|
@ -63,7 +63,7 @@ static void shutdown_mappi_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type mappi_irq_type =
|
||||
static struct irq_chip mappi_irq_type =
|
||||
{
|
||||
.typename = "MAPPI-IRQ",
|
||||
.startup = startup_mappi_irq,
|
||||
|
|
|
@ -70,7 +70,7 @@ static void shutdown_mappi2_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type mappi2_irq_type =
|
||||
static struct irq_chip mappi2_irq_type =
|
||||
{
|
||||
.typename = "MAPPI2-IRQ",
|
||||
.startup = startup_mappi2_irq,
|
||||
|
|
|
@ -70,7 +70,7 @@ static void shutdown_mappi3_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type mappi3_irq_type =
|
||||
static struct irq_chip mappi3_irq_type =
|
||||
{
|
||||
.typename = "MAPPI3-IRQ",
|
||||
.startup = startup_mappi3_irq,
|
||||
|
|
|
@ -61,7 +61,7 @@ static void shutdown_oaks32r_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type oaks32r_irq_type =
|
||||
static struct irq_chip oaks32r_irq_type =
|
||||
{
|
||||
.typename = "OAKS32R-IRQ",
|
||||
.startup = startup_oaks32r_irq,
|
||||
|
|
|
@ -70,7 +70,7 @@ static void shutdown_opsput_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type opsput_irq_type =
|
||||
static struct irq_chip opsput_irq_type =
|
||||
{
|
||||
.typename = "OPSPUT-IRQ",
|
||||
.startup = startup_opsput_irq,
|
||||
|
@ -147,7 +147,7 @@ static void shutdown_opsput_pld_irq(unsigned int irq)
|
|||
outw(PLD_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type opsput_pld_irq_type =
|
||||
static struct irq_chip opsput_pld_irq_type =
|
||||
{
|
||||
.typename = "OPSPUT-PLD-IRQ",
|
||||
.startup = startup_opsput_pld_irq,
|
||||
|
@ -216,7 +216,7 @@ static void shutdown_opsput_lanpld_irq(unsigned int irq)
|
|||
outw(PLD_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type opsput_lanpld_irq_type =
|
||||
static struct irq_chip opsput_lanpld_irq_type =
|
||||
{
|
||||
.typename = "OPSPUT-PLD-LAN-IRQ",
|
||||
.startup = startup_opsput_lanpld_irq,
|
||||
|
@ -285,7 +285,7 @@ static void shutdown_opsput_lcdpld_irq(unsigned int irq)
|
|||
outw(PLD_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type opsput_lcdpld_irq_type =
|
||||
static struct irq_chip opsput_lcdpld_irq_type =
|
||||
{
|
||||
"OPSPUT-PLD-LCD-IRQ",
|
||||
startup_opsput_lcdpld_irq,
|
||||
|
|
|
@ -61,7 +61,7 @@ static void shutdown_mappi_irq(unsigned int irq)
|
|||
outl(M32R_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type mappi_irq_type =
|
||||
static struct irq_chip mappi_irq_type =
|
||||
{
|
||||
.typename = "M32700-IRQ",
|
||||
.startup = startup_mappi_irq,
|
||||
|
@ -134,7 +134,7 @@ static void shutdown_m32700ut_pld_irq(unsigned int irq)
|
|||
outw(PLD_ICUCR_ILEVEL7, port);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type m32700ut_pld_irq_type =
|
||||
static struct irq_chip m32700ut_pld_irq_type =
|
||||
{
|
||||
.typename = "USRV-PLD-IRQ",
|
||||
.startup = startup_m32700ut_pld_irq,
|
||||
|
|
|
@ -1,21 +1,6 @@
|
|||
#ifndef __ASM_M68K_KMAP_TYPES_H
|
||||
#define __ASM_M68K_KMAP_TYPES_H
|
||||
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_BIO_SRC_IRQ,
|
||||
KM_BIO_DST_IRQ,
|
||||
KM_PTE0,
|
||||
KM_PTE1,
|
||||
KM_IRQ0,
|
||||
KM_IRQ1,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#endif /* __ASM_M68K_KMAP_TYPES_H */
|
||||
|
|
|
@ -42,10 +42,6 @@
|
|||
*/
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
union thread_union init_thread_union
|
||||
__attribute__((section(".data.init_task"), aligned(THREAD_SIZE)))
|
||||
= { INIT_THREAD_INFO(init_task) };
|
||||
|
|
|
@ -14,10 +14,6 @@
|
|||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
||||
EXPORT_SYMBOL(init_mm);
|
||||
|
||||
/*
|
||||
* Initial task structure.
|
||||
*
|
||||
|
|
|
@ -1,29 +1,6 @@
|
|||
/*
|
||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_MICROBLAZE_KMAP_TYPES_H
|
||||
#define _ASM_MICROBLAZE_KMAP_TYPES_H
|
||||
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_BIO_SRC_IRQ,
|
||||
KM_BIO_DST_IRQ,
|
||||
KM_PTE0,
|
||||
KM_PTE1,
|
||||
KM_IRQ0,
|
||||
KM_IRQ1,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR,
|
||||
};
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#endif /* _ASM_MICROBLAZE_KMAP_TYPES_H */
|
||||
|
|
|
@ -618,6 +618,8 @@ config CAVIUM_OCTEON_REFERENCE_BOARD
|
|||
select SYS_HAS_EARLY_PRINTK
|
||||
select SYS_HAS_CPU_CAVIUM_OCTEON
|
||||
select SWAP_IO_SPACE
|
||||
select HW_HAS_PCI
|
||||
select ARCH_SUPPORTS_MSI
|
||||
help
|
||||
This option supports all of the Octeon reference boards from Cavium
|
||||
Networks. It builds a kernel that dynamically determines the Octeon
|
||||
|
@ -851,6 +853,11 @@ config SYS_SUPPORTS_BIG_ENDIAN
|
|||
config SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_HUGETLBFS
|
||||
bool
|
||||
depends on CPU_SUPPORTS_HUGEPAGES && 64BIT
|
||||
default y
|
||||
|
||||
config IRQ_CPU
|
||||
bool
|
||||
|
||||
|
@ -1055,6 +1062,7 @@ config CPU_MIPS64_R1
|
|||
select CPU_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SUPPORTS_64BIT_KERNEL
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select CPU_SUPPORTS_HUGEPAGES
|
||||
help
|
||||
Choose this option to build a kernel for release 1 or later of the
|
||||
MIPS64 architecture. Many modern embedded systems with a 64-bit
|
||||
|
@ -1074,6 +1082,7 @@ config CPU_MIPS64_R2
|
|||
select CPU_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SUPPORTS_64BIT_KERNEL
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select CPU_SUPPORTS_HUGEPAGES
|
||||
help
|
||||
Choose this option to build a kernel for release 2 or later of the
|
||||
MIPS64 architecture. Many modern embedded systems with a 64-bit
|
||||
|
@ -1160,6 +1169,7 @@ config CPU_R5500
|
|||
select CPU_HAS_LLSC
|
||||
select CPU_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SUPPORTS_64BIT_KERNEL
|
||||
select CPU_SUPPORTS_HUGEPAGES
|
||||
help
|
||||
NEC VR5500 and VR5500A series processors implement 64-bit MIPS IV
|
||||
instruction set.
|
||||
|
@ -1245,6 +1255,7 @@ config CPU_CAVIUM_OCTEON
|
|||
select WEAK_ORDERING
|
||||
select WEAK_REORDERING_BEYOND_LLSC
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select CPU_SUPPORTS_HUGEPAGES
|
||||
help
|
||||
The Cavium Octeon processor is a highly integrated chip containing
|
||||
many ethernet hardware widgets for networking tasks. The processor
|
||||
|
@ -1364,6 +1375,8 @@ config CPU_SUPPORTS_32BIT_KERNEL
|
|||
bool
|
||||
config CPU_SUPPORTS_64BIT_KERNEL
|
||||
bool
|
||||
config CPU_SUPPORTS_HUGEPAGES
|
||||
bool
|
||||
|
||||
#
|
||||
# Set to y for ptrace access to watch registers.
|
||||
|
@ -2121,6 +2134,10 @@ endmenu
|
|||
|
||||
menu "Power management options"
|
||||
|
||||
config ARCH_HIBERNATION_POSSIBLE
|
||||
def_bool y
|
||||
depends on !SMP
|
||||
|
||||
config ARCH_SUSPEND_POSSIBLE
|
||||
def_bool y
|
||||
depends on !SMP
|
||||
|
|
|
@ -167,7 +167,6 @@ libs-$(CONFIG_ARC) += arch/mips/fw/arc/
|
|||
libs-$(CONFIG_CFE) += arch/mips/fw/cfe/
|
||||
libs-$(CONFIG_SNIPROM) += arch/mips/fw/sni/
|
||||
libs-y += arch/mips/fw/lib/
|
||||
libs-$(CONFIG_SIBYTE_CFE) += arch/mips/sibyte/cfe/
|
||||
|
||||
#
|
||||
# Board-dependent options and extra files
|
||||
|
@ -184,7 +183,6 @@ load-$(CONFIG_MACH_JAZZ) += 0xffffffff80080000
|
|||
# Common Alchemy Au1x00 stuff
|
||||
#
|
||||
core-$(CONFIG_SOC_AU1X00) += arch/mips/alchemy/common/
|
||||
cflags-$(CONFIG_SOC_AU1X00) += -I$(srctree)/arch/mips/include/asm/mach-au1x00
|
||||
|
||||
#
|
||||
# AMD Alchemy Pb1000 eval board
|
||||
|
@ -282,6 +280,10 @@ load-$(CONFIG_MIPS_MTX1) += 0xffffffff80100000
|
|||
libs-$(CONFIG_MIPS_XXS1500) += arch/mips/alchemy/xxs1500/
|
||||
load-$(CONFIG_MIPS_XXS1500) += 0xffffffff80100000
|
||||
|
||||
# must be last for Alchemy systems for GPIO to work properly
|
||||
cflags-$(CONFIG_SOC_AU1X00) += -I$(srctree)/arch/mips/include/asm/mach-au1x00
|
||||
|
||||
|
||||
#
|
||||
# Cobalt Server
|
||||
#
|
||||
|
@ -675,6 +677,9 @@ core-y += arch/mips/kernel/ arch/mips/mm/ arch/mips/math-emu/
|
|||
|
||||
drivers-$(CONFIG_OPROFILE) += arch/mips/oprofile/
|
||||
|
||||
# suspend and hibernation support
|
||||
drivers-$(CONFIG_PM) += arch/mips/power/
|
||||
|
||||
ifdef CONFIG_LASAT
|
||||
rom.bin rom.sw: vmlinux
|
||||
$(Q)$(MAKE) $(build)=arch/mips/lasat/image $@
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
# au1000-style gpio
|
||||
config ALCHEMY_GPIO_AU1000
|
||||
bool
|
||||
|
||||
# select this in your board config if you don't want to use the gpio
|
||||
# namespace as documented in the manuals. In this case however you need
|
||||
# to create the necessary gpio_* functions in your board code/headers!
|
||||
# see arch/mips/include/asm/mach-au1x00/gpio.h for more information.
|
||||
config ALCHEMY_GPIO_INDIRECT
|
||||
def_bool n
|
||||
|
||||
choice
|
||||
prompt "Machine type"
|
||||
depends on MACH_ALCHEMY
|
||||
|
@ -108,22 +119,27 @@ endchoice
|
|||
config SOC_AU1000
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
|
||||
config SOC_AU1100
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
|
||||
config SOC_AU1500
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
|
||||
config SOC_AU1550
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
|
||||
config SOC_AU1200
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
|
||||
config SOC_AU1X00
|
||||
bool
|
||||
|
@ -134,4 +150,5 @@ config SOC_AU1X00
|
|||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_APM_EMULATION
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select GENERIC_GPIO
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
|
|
|
@ -7,7 +7,14 @@
|
|||
|
||||
obj-y += prom.o irq.o puts.o time.o reset.o \
|
||||
clocks.o platform.o power.o setup.o \
|
||||
sleeper.o dma.o dbdma.o gpio.o
|
||||
sleeper.o dma.o dbdma.o
|
||||
|
||||
# optional gpiolib support
|
||||
ifeq ($(CONFIG_ALCHEMY_GPIO_INDIRECT),)
|
||||
ifeq ($(CONFIG_GPIOLIB),y)
|
||||
obj-$(CONFIG_ALCHEMY_GPIO_AU1000) += gpiolib-au1000.o
|
||||
endif
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_PCI) += pci.o
|
||||
|
||||
|
|
|
@ -1,201 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2007-2009, OpenWrt.org, Florian Fainelli <florian@openwrt.org>
|
||||
* Architecture specific GPIO support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* Notes :
|
||||
* au1000 SoC have only one GPIO line : GPIO1
|
||||
* others have a second one : GPIO2
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/gpio.h>
|
||||
|
||||
struct au1000_gpio_chip {
|
||||
struct gpio_chip chip;
|
||||
void __iomem *regbase;
|
||||
};
|
||||
|
||||
#if !defined(CONFIG_SOC_AU1000)
|
||||
static int au1000_gpio2_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
struct au1000_gpio_chip *gpch;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
return readl(gpch->regbase + AU1000_GPIO2_ST) & mask;
|
||||
}
|
||||
|
||||
static void au1000_gpio2_set(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
u32 mask = ((GPIO2_OUT_EN_MASK << offset) | (!!value << offset));
|
||||
struct au1000_gpio_chip *gpch;
|
||||
unsigned long flags;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
|
||||
local_irq_save(flags);
|
||||
writel(mask, gpch->regbase + AU1000_GPIO2_OUT);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int au1000_gpio2_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
u32 tmp;
|
||||
struct au1000_gpio_chip *gpch;
|
||||
unsigned long flags;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
|
||||
local_irq_save(flags);
|
||||
tmp = readl(gpch->regbase + AU1000_GPIO2_DIR);
|
||||
tmp &= ~mask;
|
||||
writel(tmp, gpch->regbase + AU1000_GPIO2_DIR);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int au1000_gpio2_direction_output(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
u32 out_mask = ((GPIO2_OUT_EN_MASK << offset) | (!!value << offset));
|
||||
u32 tmp;
|
||||
struct au1000_gpio_chip *gpch;
|
||||
unsigned long flags;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
|
||||
local_irq_save(flags);
|
||||
tmp = readl(gpch->regbase + AU1000_GPIO2_DIR);
|
||||
tmp |= mask;
|
||||
writel(tmp, gpch->regbase + AU1000_GPIO2_DIR);
|
||||
writel(out_mask, gpch->regbase + AU1000_GPIO2_OUT);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* !defined(CONFIG_SOC_AU1000) */
|
||||
|
||||
static int au1000_gpio1_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
struct au1000_gpio_chip *gpch;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
return readl(gpch->regbase + AU1000_GPIO1_ST) & mask;
|
||||
}
|
||||
|
||||
static void au1000_gpio1_set(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
u32 reg_offset;
|
||||
struct au1000_gpio_chip *gpch;
|
||||
unsigned long flags;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
|
||||
if (value)
|
||||
reg_offset = AU1000_GPIO1_OUT;
|
||||
else
|
||||
reg_offset = AU1000_GPIO1_CLR;
|
||||
|
||||
local_irq_save(flags);
|
||||
writel(mask, gpch->regbase + reg_offset);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int au1000_gpio1_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
struct au1000_gpio_chip *gpch;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
writel(mask, gpch->regbase + AU1000_GPIO1_ST);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int au1000_gpio1_direction_output(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
struct au1000_gpio_chip *gpch;
|
||||
|
||||
gpch = container_of(chip, struct au1000_gpio_chip, chip);
|
||||
|
||||
writel(mask, gpch->regbase + AU1000_GPIO1_TRI_OUT);
|
||||
au1000_gpio1_set(chip, offset, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct au1000_gpio_chip au1000_gpio_chip[] = {
|
||||
[0] = {
|
||||
.regbase = (void __iomem *)SYS_BASE,
|
||||
.chip = {
|
||||
.label = "au1000-gpio1",
|
||||
.direction_input = au1000_gpio1_direction_input,
|
||||
.direction_output = au1000_gpio1_direction_output,
|
||||
.get = au1000_gpio1_get,
|
||||
.set = au1000_gpio1_set,
|
||||
.base = 0,
|
||||
.ngpio = 32,
|
||||
},
|
||||
},
|
||||
#if !defined(CONFIG_SOC_AU1000)
|
||||
[1] = {
|
||||
.regbase = (void __iomem *)GPIO2_BASE,
|
||||
.chip = {
|
||||
.label = "au1000-gpio2",
|
||||
.direction_input = au1000_gpio2_direction_input,
|
||||
.direction_output = au1000_gpio2_direction_output,
|
||||
.get = au1000_gpio2_get,
|
||||
.set = au1000_gpio2_set,
|
||||
.base = AU1XXX_GPIO_BASE,
|
||||
.ngpio = 32,
|
||||
},
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init au1000_gpio_init(void)
|
||||
{
|
||||
gpiochip_add(&au1000_gpio_chip[0].chip);
|
||||
#if !defined(CONFIG_SOC_AU1000)
|
||||
gpiochip_add(&au1000_gpio_chip[1].chip);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(au1000_gpio_init);
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue