110d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat#include <stdio.h>
210d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat#include <stdlib.h>
310d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat#include <unistd.h>
410d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat#include <errno.h>
510d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
610d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat#include <cutils/iosched_policy.h>
710d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
810d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehatstatic char *classes[] = {"none", "rt", "be", "idle", NULL};
910d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
1010d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehatint ionice_main(int argc, char *argv[])
1110d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat{
1210d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    IoSchedClass clazz = IoSchedClass_NONE;
1310d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    int ioprio = 0;
1410d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    int pid;
1510d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
1610d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    if(argc != 2 && argc != 4) {
1710d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        fprintf(stderr, "usage: ionice <pid> [none|rt|be|idle] [prio]\n");
1810d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        return 1;
1910d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    }
2010d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
2110d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    if (!(pid = atoi(argv[1]))) {
2210d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        fprintf(stderr, "Invalid pid specified\n");
2310d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        return 1;
2410d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    }
2510d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
2610d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    if (argc == 2) {
2710d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        if (android_get_ioprio(pid, &clazz, &ioprio)) {
2810d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat            fprintf(stderr, "Failed to read priority (%s)\n", strerror(errno));
2910d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat            return 1;
3010d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        }
3110d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        fprintf(stdout, "Pid %d, class %s (%d), prio %d\n", pid, classes[clazz], clazz, ioprio);
3210d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        return 0;
3310d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    }
3410d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
3510d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    if (!strcmp(argv[2], "none")) {
3610d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        clazz = IoSchedClass_NONE;
3710d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    } else if (!strcmp(argv[2], "rt")) {
3810d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        clazz = IoSchedClass_RT;
3910d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    } else if (!strcmp(argv[2], "be")) {
4010d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        clazz = IoSchedClass_BE;
4110d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    } else if (!strcmp(argv[2], "idle")) {
4210d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        clazz = IoSchedClass_IDLE;
4310d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    } else {
4410d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        fprintf(stderr, "Unsupported class '%s'\n", argv[2]);
4510d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        return 1;
4610d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    }
4710d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
4810d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    ioprio = atoi(argv[3]);
4910d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
5010d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    printf("Setting pid %d i/o class to %d, prio %d\n", pid, clazz, ioprio);
5110d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    if (android_set_ioprio(pid, clazz, ioprio)) {
5210d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        fprintf(stderr, "Failed to set priority (%s)\n", strerror(errno));
5310d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat        return 1;
5410d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    }
5510d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat
5610d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat    return 0;
5710d469bff9031e857c7a290dae7d6ccf7b3a18f8San Mehat}
58