Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 74522
b: refs/heads/master
c: 3b2d871
h: refs/heads/master
v: v3
  • Loading branch information
Stephen Rothwell authored and James committed Nov 7, 2007
1 parent ba4e80a commit ac501e8
Show file tree
Hide file tree
Showing 1,269 changed files with 15,998 additions and 20,163 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8002cedc1adbf51e2d56091534ef7551b88329b4
refs/heads/master: 3b2d871245357015cac621d7612b6ecf59f424df
2 changes: 0 additions & 2 deletions trunk/Documentation/00-INDEX
Original file line number Diff line number Diff line change
Expand Up @@ -262,8 +262,6 @@ mtrr.txt
- how to use PPro Memory Type Range Registers to increase performance.
mutex-design.txt
- info on the generic mutex subsystem.
namespaces/
- directory with various information about namespaces
nbd.txt
- info on a TCP implementation of a network block device.
netlabel/
Expand Down
2 changes: 1 addition & 1 deletion trunk/Documentation/DocBook/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
procfs-guide.xml writing_usb_driver.xml \
kernel-api.xml filesystems.xml lsm.xml usb.xml \
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
genericirq.xml s390-drivers.xml uio-howto.xml
genericirq.xml s390-drivers.xml

###
# The build process is as follows (targets):
Expand Down
90 changes: 58 additions & 32 deletions trunk/Documentation/DocBook/uio-howto.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,6 @@
</abstract>

<revhistory>
<revision>
<revnumber>0.4</revnumber>
<date>2007-11-26</date>
<authorinitials>hjk</authorinitials>
<revremark>Removed section about uio_dummy.</revremark>
</revision>
<revision>
<revnumber>0.3</revnumber>
<date>2007-04-29</date>
Expand Down Expand Up @@ -100,26 +94,6 @@ interested in translating it, please email me
user space. This simplifies development and reduces the risk of
serious bugs within a kernel module.
</para>
<para>
Please note that UIO is not an universal driver interface. Devices
that are already handled well by other kernel subsystems (like
networking or serial or USB) are no candidates for an UIO driver.
Hardware that is ideally suited for an UIO driver fulfills all of
the following:
</para>
<itemizedlist>
<listitem>
<para>The device has memory that can be mapped. The device can be
controlled completely by writing to this memory.</para>
</listitem>
<listitem>
<para>The device usually generates interrupts.</para>
</listitem>
<listitem>
<para>The device does not fit into one of the standard kernel
subsystems.</para>
</listitem>
</itemizedlist>
</sect1>

<sect1 id="thanks">
Expand Down Expand Up @@ -200,9 +174,8 @@ interested in translating it, please email me
For cards that don't generate interrupts but need to be
polled, there is the possibility to set up a timer that
triggers the interrupt handler at configurable time intervals.
This interrupt simulation is done by calling
<function>uio_event_notify()</function>
from the timer's event handler.
See <filename>drivers/uio/uio_dummy.c</filename> for an
example of this technique.
</para>

<para>
Expand Down Expand Up @@ -290,11 +263,63 @@ offset = N * getpagesize();
</sect1>
</chapter>

<chapter id="using-uio_dummy" xreflabel="Using uio_dummy">
<?dbhtml filename="using-uio_dummy.html"?>
<title>Using uio_dummy</title>
<para>
Well, there is no real use for uio_dummy. Its only purpose is
to test most parts of the UIO system (everything except
hardware interrupts), and to serve as an example for the
kernel module that you will have to write yourself.
</para>

<sect1 id="what_uio_dummy_does">
<title>What uio_dummy does</title>
<para>
The kernel module <filename>uio_dummy.ko</filename> creates a
device that uses a timer to generate periodic interrupts. The
interrupt handler does nothing but increment a counter. The
driver adds two custom attributes, <varname>count</varname>
and <varname>freq</varname>, that appear under
<filename>/sys/devices/platform/uio_dummy/</filename>.
</para>

<para>
The attribute <varname>count</varname> can be read and
written. The associated file
<filename>/sys/devices/platform/uio_dummy/count</filename>
appears as a normal text file and contains the total number of
timer interrupts. If you look at it (e.g. using
<function>cat</function>), you'll notice it is slowly counting
up.
</para>

<para>
The attribute <varname>freq</varname> can be read and written.
The content of
<filename>/sys/devices/platform/uio_dummy/freq</filename>
represents the number of system timer ticks between two timer
interrupts. The default value of <varname>freq</varname> is
the value of the kernel variable <varname>HZ</varname>, which
gives you an interval of one second. Lower values will
increase the frequency. Try the following:
</para>
<programlisting format="linespecific">
cd /sys/devices/platform/uio_dummy/
echo 100 > freq
</programlisting>
<para>
Use <function>cat count</function> to see how the interrupt
frequency changes.
</para>
</sect1>
</chapter>

<chapter id="custom_kernel_module" xreflabel="Writing your own kernel module">
<?dbhtml filename="custom_kernel_module.html"?>
<title>Writing your own kernel module</title>
<para>
Please have a look at <filename>uio_cif.c</filename> as an
Please have a look at <filename>uio_dummy.c</filename> as an
example. The following paragraphs explain the different
sections of this file.
</para>
Expand Down Expand Up @@ -329,8 +354,9 @@ See the description below for details.
interrupt, it's your modules task to determine the irq number during
initialization. If you don't have a hardware generated interrupt but
want to trigger the interrupt handler in some other way, set
<varname>irq</varname> to <varname>UIO_IRQ_CUSTOM</varname>.
If you had no interrupt at all, you could set
<varname>irq</varname> to <varname>UIO_IRQ_CUSTOM</varname>. The
uio_dummy module does this as it triggers the event mechanism in a timer
routine. If you had no interrupt at all, you could set
<varname>irq</varname> to <varname>UIO_IRQ_NONE</varname>, though this
rarely makes sense.
</para></listitem>
Expand Down
43 changes: 1 addition & 42 deletions trunk/Documentation/accounting/getdelays.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@

#include <linux/genetlink.h>
#include <linux/taskstats.h>
#include <linux/cgroupstats.h>

/*
* Generic macros for dealing with netlink sockets. Might be duplicated
Expand Down Expand Up @@ -79,7 +78,6 @@ static void usage(void)
fprintf(stderr, " -i: print IO accounting (works only with -p)\n");
fprintf(stderr, " -l: listen forever\n");
fprintf(stderr, " -v: debug on\n");
fprintf(stderr, " -C: container path\n");
}

/*
Expand Down Expand Up @@ -214,14 +212,6 @@ void task_context_switch_counts(struct taskstats *t)
t->nvcsw, t->nivcsw);
}

void print_cgroupstats(struct cgroupstats *c)
{
printf("sleeping %llu, blocked %llu, running %llu, stopped %llu, "
"uninterruptible %llu\n", c->nr_sleeping, c->nr_io_wait,
c->nr_running, c->nr_stopped, c->nr_uninterruptible);
}


void print_ioacct(struct taskstats *t)
{
printf("%s: read=%llu, write=%llu, cancelled_write=%llu\n",
Expand Down Expand Up @@ -249,14 +239,11 @@ int main(int argc, char *argv[])
int maskset = 0;
char *logfile = NULL;
int loop = 0;
int containerset = 0;
char containerpath[1024];
int cfd = 0;

struct msgtemplate msg;

while (1) {
c = getopt(argc, argv, "qdiw:r:m:t:p:vlC:");
c = getopt(argc, argv, "qdiw:r:m:t:p:vl");
if (c < 0)
break;

Expand All @@ -273,10 +260,6 @@ int main(int argc, char *argv[])
printf("printing task/process context switch rates\n");
print_task_context_switch_counts = 1;
break;
case 'C':
containerset = 1;
strncpy(containerpath, optarg, strlen(optarg) + 1);
break;
case 'w':
logfile = strdup(optarg);
printf("write to file %s\n", logfile);
Expand Down Expand Up @@ -351,11 +334,6 @@ int main(int argc, char *argv[])
}
}

if (tid && containerset) {
fprintf(stderr, "Select either -t or -C, not both\n");
goto err;
}

if (tid) {
rc = send_cmd(nl_sd, id, mypid, TASKSTATS_CMD_GET,
cmd_type, &tid, sizeof(__u32));
Expand All @@ -366,20 +344,6 @@ int main(int argc, char *argv[])
}
}

if (containerset) {
cfd = open(containerpath, O_RDONLY);
if (cfd < 0) {
perror("error opening container file");
goto err;
}
rc = send_cmd(nl_sd, id, mypid, CGROUPSTATS_CMD_GET,
CGROUPSTATS_CMD_ATTR_FD, &cfd, sizeof(__u32));
if (rc < 0) {
perror("error sending cgroupstats command");
goto err;
}
}

do {
int i;

Expand Down Expand Up @@ -458,9 +422,6 @@ int main(int argc, char *argv[])
}
break;

case CGROUPSTATS_TYPE_CGROUP_STATS:
print_cgroupstats(NLA_DATA(na));
break;
default:
fprintf(stderr, "Unknown nla_type %d\n",
na->nla_type);
Expand All @@ -482,7 +443,5 @@ int main(int argc, char *argv[])
close(nl_sd);
if (fd)
close(fd);
if (cfd)
close(cfd);
return 0;
}
9 changes: 9 additions & 0 deletions trunk/Documentation/feature-removal-schedule.txt
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,15 @@ Who: Nick Piggin <npiggin@suse.de>

---------------------------

What: Interrupt only SA_* flags
When: September 2007
Why: The interrupt related SA_* flags are replaced by IRQF_* to move them
out of the signal namespace.

Who: Thomas Gleixner <tglx@linutronix.de>

---------------------------

What: PHYSDEVPATH, PHYSDEVBUS, PHYSDEVDRIVER in the uevent environment
When: October 2008
Why: The stacking of class devices makes these values misleading and
Expand Down
31 changes: 0 additions & 31 deletions trunk/Documentation/hwmon/sysfs-interface
Original file line number Diff line number Diff line change
Expand Up @@ -328,37 +328,6 @@ curr[1-*]_input Current input value
Unit: milliampere
RO

*********
* Power *
*********

power[1-*]_average Average power use
Unit: microWatt
RO

power[1-*]_average_highest Historical average maximum power use
Unit: microWatt
RO

power[1-*]_average_lowest Historical average minimum power use
Unit: microWatt
RO

power[1-*]_input Instantaneous power use
Unit: microWatt
RO

power[1-*]_input_highest Historical maximum power use
Unit: microWatt
RO

power[1-*]_input_lowest Historical minimum power use
Unit: microWatt
RO

power[1-*]_reset_history Reset input_highest, input_lowest,
average_highest and average_lowest.
WO

**********
* Alarms *
Expand Down
26 changes: 11 additions & 15 deletions trunk/Documentation/lguest/lguest.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ typedef uint8_t u8;
#endif
/* We can have up to 256 pages for devices. */
#define DEVICE_PAGES 256
/* This will occupy 2 pages: it must be a power of 2. */
#define VIRTQUEUE_NUM 128
/* This fits nicely in a single 4096-byte page. */
#define VIRTQUEUE_NUM 127

/*L:120 verbose is both a global flag and a macro. The C preprocessor allows
* this, and although I wouldn't recommend it, it works quite nicely here. */
Expand Down Expand Up @@ -1036,22 +1036,16 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
void *p;

/* First we need some pages for this virtqueue. */
pages = (vring_size(num_descs, getpagesize()) + getpagesize() - 1)
/ getpagesize();
pages = (vring_size(num_descs) + getpagesize() - 1) / getpagesize();
p = get_pages(pages);

/* Initialize the virtqueue */
vq->next = NULL;
vq->last_avail_idx = 0;
vq->dev = dev;

/* Initialize the configuration. */
vq->config.num = num_descs;
vq->config.irq = devices.next_irq++;
vq->config.pfn = to_guest_phys(p) / getpagesize();

/* Initialize the vring. */
vring_init(&vq->vring, num_descs, p, getpagesize());
vring_init(&vq->vring, num_descs, p);

/* Add the configuration information to this device's descriptor. */
add_desc_field(dev, VIRTIO_CONFIG_F_VIRTQUEUE,
Expand All @@ -1062,6 +1056,9 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
for (i = &dev->vq; *i; i = &(*i)->next);
*i = vq;

/* Link virtqueue back to device. */
vq->dev = dev;

/* Set the routine to call when the Guest does something to this
* virtqueue. */
vq->handle_output = handle_output;
Expand Down Expand Up @@ -1095,7 +1092,6 @@ static struct device *new_device(const char *name, u16 type, int fd,
dev->desc = new_dev_desc(type);
dev->handle_input = handle_input;
dev->name = name;
dev->vq = NULL;
return dev;
}

Expand Down Expand Up @@ -1346,7 +1342,7 @@ static bool service_io(struct device *dev)
if (out->type & VIRTIO_BLK_T_SCSI_CMD) {
fprintf(stderr, "Scsi commands unsupported\n");
in->status = VIRTIO_BLK_S_UNSUPP;
wlen = sizeof(*in);
wlen = sizeof(in);
} else if (out->type & VIRTIO_BLK_T_OUT) {
/* Write */

Expand All @@ -1367,7 +1363,7 @@ static bool service_io(struct device *dev)
/* Die, bad Guest, die. */
errx(1, "Write past end %llu+%u", off, ret);
}
wlen = sizeof(*in);
wlen = sizeof(in);
in->status = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
} else {
/* Read */
Expand All @@ -1380,10 +1376,10 @@ static bool service_io(struct device *dev)
ret = readv(vblk->fd, iov+1, in_num-1);
verbose("READ from sector %llu: %i\n", out->sector, ret);
if (ret >= 0) {
wlen = sizeof(*in) + ret;
wlen = sizeof(in) + ret;
in->status = VIRTIO_BLK_S_OK;
} else {
wlen = sizeof(*in);
wlen = sizeof(in);
in->status = VIRTIO_BLK_S_IOERR;
}
}
Expand Down
Loading

0 comments on commit ac501e8

Please sign in to comment.