[lkml]   [2007]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: swap-prefetch: 2.6.22 -mm merge plans
On Friday 04 May 2007 18:52, Ingo Molnar wrote:
> agreed. Con, IIRC you wrote a testcase for this, right? Could you please
> send us the results of that testing?

Yes, sorry it's a crappy test app but works on 32bit. Timed with prefetch
disabled and then enabled swap prefetch saves ~5 seconds on average hardware
on this one test case. I had many users try this and the results were between
2 and 10 seconds, but always showed a saving on this testcase. This effect
easily occurs on printing a big picture, editing a large file, compressing an
iso image or whatever in real world workloads. Smaller, but much more
frequent effects of this over the course of a day obviously also occur and do
add up.

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <time.h>

void fatal(const char *format, ...)
va_list ap;

if (format) {
va_start(ap, format);
vfprintf(stderr, format, ap);

fprintf(stderr, "Fatal error - exiting\n");

size_t get_ram(void)
unsigned long ramsize;
FILE *meminfo;
char aux[256];

if(!(meminfo = fopen("/proc/meminfo", "r")))

while( !feof(meminfo) && !fscanf(meminfo, "MemTotal: %lu kB", &ramsize) )
if (fclose(meminfo) == -1)
return ramsize * 1000;

unsigned long get_usecs(struct timespec *myts)
if (clock_gettime(CLOCK_REALTIME, myts))
return (myts->tv_sec * 1000000 + myts->tv_nsec / 1000 );

int main(void)
unsigned long current_time, time_diff;
struct timespec myts;
char *buf1, *buf2, *buf3, *buf4;
size_t size, full_size = get_ram();
int sleep_seconds = 600;

size = full_size * 7 / 10;
printf("Starting first malloc of %d bytes\n", size);
buf1 = malloc(size);
if (buf1 == (char *)-1)
fatal("Failed to malloc 1st buffer\n");
memset(buf1, 0, size);
printf("Completed first malloc and starting second malloc of %d bytes\n", full_size);

buf2 = malloc(full_size);
if (buf2 == (char *)-1)
fatal("Failed to malloc 2nd buffer\n");
memset(buf2, 0, full_size);
buf4 = malloc(1);
for (buf3 = buf2 + full_size; buf3 > buf2; buf3--)
*buf4 = *buf3;
printf("Completed second malloc and free\n");

printf("Sleeping for %d seconds\n", sleep_seconds);

printf("Important part - starting read of first malloc\n");
time_diff = current_time = get_usecs(&myts);
for (buf3 = buf1; buf3 < buf1 + size; buf3++)
*buf4 = *buf3;
current_time = get_usecs(&myts);
printf("Completed read and freeing of first malloc\n");
time_diff = current_time - time_diff;
printf("Timed portion %lu microseconds\n",time_diff);

return 0;
 \ /
  Last update: 2007-05-04 14:13    [W:0.196 / U:0.144 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site