int stat_fd;
pid_t pid;
int terminate;
- int ddir;
- int ioprio;
- int sequential;
- int bs;
- int odirect;
- int delay_sleep;
+ unsigned int ddir;
+ unsigned int ioprio;
+ unsigned int sequential;
+ unsigned int bs;
+ unsigned int odirect;
+ unsigned int delay_sleep;
cpu_set_t cpumask;
unsigned int rate;
else
ret = write(td->fd, buffer, td->bs);
- if (ret < td->bs) {
+ if (ret < (int) td->bs) {
if (ret == -1)
td->error = errno;
break;
} else
td->blocks = 1024 * 1024 * 1024 / td->bs;
- if (td->ioprio != -1) {
+ if (td->ioprio) {
if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) {
td->error = errno;
goto out;
printf("%s: <-s 0/1> <-b kb> <-t sec> <-w 0/1> <-c r,w,r...> file0... fileN\n", progname);
}
-void setup_rate(struct thread_data *td, int rate)
+void setup_rate(struct thread_data *td)
{
- int nr_reads_per_sec = rate * 1024 / td->bs;
+ int nr_reads_per_sec = td->rate * 1024 / td->bs;
- td->rate = rate;
td->rate_usec_cycle = 1000000 / nr_reads_per_sec;
td->rate_pending_usleep = 0;
}
-void add_job(const char *filename, int rw, int bs, int direct, int prio, int random, int delay, int rate, cpu_set_t cpumask)
+struct thread_data *get_new_job(void)
{
struct thread_data *td = &threads[thread_number++];
- strcpy(td->file_name, filename);
td->thread_number = thread_number;
+ td->ddir = DDIR_READ;
+ td->bs = global_bs;
+ td->odirect = 1;
+ td->delay_sleep = 0;
+ td->rate = 0;
+ td->sequential = sequential;
+ td->ioprio = 0;
+ memcpy(&td->cpumask, &def_cpumask, sizeof(td->cpumask));
+
+ return td;
+}
+
+void add_job(struct thread_data *td, const char *filename, int prioclass,
+ int prio)
+{
+ strcpy(td->file_name, filename);
td->stat_fd = -1;
sem_init(&td->mutex, 1, 1);
td->min_latency = 10000000;
- td->ddir = rw;
- td->ioprio = prio;
- td->sequential = !random;
- td->odirect = direct;
- td->bs = bs;
- td->delay_sleep = delay;
- memcpy(&td->cpumask, &cpumask, sizeof(cpumask));
-
- if (rate)
- setup_rate(td, rate);
-
- printf("Client%d: file=%s, rw=%d, prio=%d, seq=%d, odir=%d, bs=%d, rate=%d\n", thread_number, filename, rw, prio, !random, direct, bs, rate);
+ td->ioprio = (prioclass << IOPRIO_CLASS_SHIFT) | prio;
+
+ if (td->rate)
+ setup_rate(td);
+
+ printf("Client%d: file=%s, rw=%d, prio=%d, seq=%d, odir=%d, bs=%d, rate=%d\n", td->thread_number, filename, td->ddir, td->ioprio, td->sequential, td->odirect, td->bs, td->rate);
}
static void fill_cpu_mask(cpu_set_t cpumask, int cpu)
{
- int i;
+ unsigned int i;
CPU_ZERO(&cpumask);
*/
int parse_jobs_cmd(int argc, char *argv[], int index)
{
- int rw, bs, direct, prio, random, prioclass, delay, rate, cpu;
+ struct thread_data *td;
+ unsigned int prio, prioclass, cpu;
char *string, *filename, *p, *c;
- cpu_set_t cpumask;
int i;
string = malloc(256);
break;
filename[0] = 0;
- rw = DDIR_READ;
- bs = global_bs;
- direct = 1;
- prio = 4;
- random = !sequential;
+ td = get_new_job();
+
prioclass = 2;
- delay = 0;
- rate = 0;
- memcpy(&cpumask, &def_cpumask, sizeof(cpumask));
+ prio = 4;
+ cpu = 0;
c = strstr(p, "rw=");
if (c) {
c += 3;
if (*c == '0')
- rw = DDIR_READ;
+ td->ddir = DDIR_READ;
else
- rw = DDIR_WRITE;
+ td->ddir = DDIR_WRITE;
}
c = strstr(p, "prio=");
if (c) {
c += 3;
fill_option(c, string);
- bs = strtoul(string, NULL, 10);
- bs <<= 10;
+ td->bs = strtoul(string, NULL, 10);
+ td->bs <<= 10;
}
c = strstr(p, "direct=");
if (c) {
c += 7;
if (*c != '0')
- direct = 1;
+ td->odirect = 1;
else
- direct = 0;
+ td->odirect = 0;
}
c = strstr(p, "delay=");
if (c) {
c += 6;
fill_option(c, string);
- delay = strtoul(string, NULL, 10);
+ td->delay_sleep = strtoul(string, NULL, 10);
}
c = strstr(p, "rate=");
if (c) {
c += 5;
fill_option(c, string);
- rate = strtoul(string, NULL, 10);
+ td->rate = strtoul(string, NULL, 10);
}
c = strstr(p, "cpumask=");
c += 8;
fill_option(c, string);
cpu = strtoul(string, NULL, 10);
- fill_cpu_mask(cpumask, cpu);
+ fill_cpu_mask(td->cpumask, cpu);
}
c = strstr(p, "random");
if (c)
- random = 1;
+ td->sequential = 0;
c = strstr(p, "sequential");
if (c)
- random = 0;
+ td->sequential = 1;
- add_job(filename, rw, bs, direct, (prioclass << IOPRIO_CLASS_SHIFT) | prio, random, delay, rate, cpumask);
+ add_job(td, filename, prioclass, prio);
}
free(string);
return thread_number;
}
-int check_int(char *p, char *name, int *val)
+int check_int(char *p, char *name, unsigned int *val)
{
char str[128];
int parse_jobs_ini(char *file)
{
- int rw, bs, direct, prio, random, prioclass, delay, rate, jobs, cpu;
- cpu_set_t cpumask;
+ unsigned int prioclass, prio, cpu, jobs;
+ struct thread_data *td;
char *string, *name;
fpos_t off;
FILE *f;
name[strlen(name) - 1] = '\0';
- rw = DDIR_READ;
- bs = global_bs;
- direct = 1;
- prio = 4;
- random = !sequential;
+ td = get_new_job();
+
prioclass = 2;
- delay = 0;
- rate = 0;
- memcpy(&cpumask, &def_cpumask, sizeof(cpumask));
+ prio = 4;
cpu = 0;
fgetpos(f, &off);
while ((p = fgets(string, 4096, f)) != NULL) {
if (is_empty(p))
break;
- if (!check_int(p, "bs", &bs)) {
- bs <<= 10;
+ if (!check_int(p, "bs", &td->bs)) {
+ td->bs <<= 10;
fgetpos(f, &off);
continue;
}
- if (!check_int(p, "rw", &rw)) {
+ if (!check_int(p, "rw", &td->ddir)) {
fgetpos(f, &off);
continue;
}
fgetpos(f, &off);
continue;
}
- if (!check_int(p, "direct", &direct)) {
+ if (!check_int(p, "direct", &td->odirect)) {
fgetpos(f, &off);
continue;
}
- if (!check_int(p, "rate", &rate)) {
+ if (!check_int(p, "rate", &td->rate)) {
fgetpos(f, &off);
continue;
}
- if (!check_int(p, "delay", &delay)) {
+ if (!check_int(p, "delay", &td->delay_sleep)) {
fgetpos(f, &off);
continue;
}
if (!check_int(p, "cpumask", &cpu)) {
- fill_cpu_mask(cpumask, cpu);
+ fill_cpu_mask(td->cpumask, cpu);
fgetpos(f, &off);
continue;
}
if (!strcmp(p, "sequential")) {
- sequential = 1;
+ td->sequential = 1;
fgetpos(f, &off);
continue;
}
if (!strcmp(p, "random")) {
- sequential = 0;
+ td->sequential = 0;
fgetpos(f, &off);
continue;
}
}
fsetpos(f, &off);
- add_job(name, rw, bs, direct, (prioclass << IOPRIO_CLASS_SHIFT) | prio, random, delay, rate, cpumask);
+ add_job(td, name, prioclass, prio);
jobs++;
}