Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
/*
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
* Copyright 2010 Luis R. Rodriguez <lrodriguez@atheros.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*
* Compile simply with:
* cc -o cpudmalatency cpudmalatency.c
*
* Some unpatched buggy BIOSes create excessive C-state transition latencies
* which can affect DMA on some devices. Instead of patching each and every
* Linux kernel driver to account for these inefficiencies - lets punt these
* work arounds to userspace. Linux distributions will hopefully have a way
* to automatically detect these buggy platforms and call this. Note that
* this app will hold the file open.
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int32_t v;
int fd;
if (argc != 2) {
fprintf(stderr, "Usage: %s <latency [us]>\n", argv[0]);
fprintf(stderr, "\n");
fprintf(stderr, " latency: the maximum tolerable CPU DMA you\n");
fprintf(stderr, " are willing to put up with [in microseconds]\n");
fprintf(stderr, "\n");
fprintf(stderr, "This program will block until you hit Ctrl-C, at which point\n");
fprintf(stderr, "the file descriptor is closed and the latency requirement is\n");
fprintf(stderr, "unregistered again.\n");
fprintf(stderr, "Hint: if you have an platform with a buggy BIOS that has\n");
fprintf(stderr, "issues with excessive C-state transition latencies try value 55\n");
return 2;
}
v = atoi(argv[1]);
printf("setting latency to %d.%.6d seconds\n", v/1000000, v % 1000000);
fd = open("/dev/cpu_dma_latency", O_WRONLY);
if (fd < 0) {
perror("open /dev/cpu_dma_latency");
return 1;
}
if (write(fd, &v, sizeof(v)) != sizeof(v)) {
perror("write to /dev/cpu_dma_latency");
return 1;
}
while (1) sleep(10);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment