blob: 96fa1aa3f77e061d68035af15f885c3f38297b5a [file] [log] [blame]
/* Copyright (C) 2003,2004 Andi Kleen, SuSE Labs.
numactl 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; version
2.
numactl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should find a copy of v2 of the GNU General Public License somewhere
on your Linux system; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "numa.h"
#include "numaif.h"
#include "util.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
void printmask(char *name, struct bitmask *mask)
{
int i;
printf("%s: ", name);
for (i = 0; i < mask->size; i++)
if (numa_bitmask_isbitset(mask, i))
printf("%d ", i);
putchar('\n');
}
int find_first(struct bitmask *mask)
{
int i;
for (i = 0; i < mask->size; i++)
if (numa_bitmask_isbitset(mask, i))
return i;
return -1;
}
void complain(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "numactl: ");
vfprintf(stderr,fmt,ap);
putchar('\n');
va_end(ap);
exit(1);
}
void nerror(const char *fmt, ...)
{
int err = errno;
va_list ap;
va_start(ap,fmt);
fprintf(stderr, "numactl: ");
vfprintf(stderr, fmt, ap);
va_end(ap);
if (err)
fprintf(stderr,": %s\n", strerror(err));
else
fputc('\n', stderr);
exit(1);
}
long memsize(char *s)
{
char *end;
long length = strtoul(s,&end,0);
switch (toupper(*end)) {
case 'G': length *= 1024; /*FALL THROUGH*/
case 'M': length *= 1024; /*FALL THROUGH*/
case 'K': length *= 1024; break;
}
return length;
}
static struct policy {
char *name;
int policy;
int noarg;
} policies[] = {
{ "interleave", MPOL_INTERLEAVE, },
{ "membind", MPOL_BIND, },
{ "preferred", MPOL_PREFERRED, },
{ "default", MPOL_DEFAULT, 1 },
{ NULL },
};
static char *policy_names[] = { "default", "preferred", "bind", "interleave" };
char *policy_name(int policy)
{
static char buf[32];
if (policy >= array_len(policy_names)) {
sprintf(buf, "[%d]", policy);
return buf;
}
return policy_names[policy];
}
int parse_policy(char *name, char *arg)
{
int k;
struct policy *p = NULL;
if (!name)
return MPOL_DEFAULT;
for (k = 0; policies[k].name; k++) {
p = &policies[k];
if (!strcmp(p->name, name))
break;
}
if (!p || !p->name || (!arg && !p->noarg))
usage();
return p->policy;
}
void print_policies(void)
{
int i;
printf("Policies:");
for (i = 0; policies[i].name; i++)
printf(" %s", policies[i].name);
printf("\n");
}