1/* 2 * Copyright (c) 2008, The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google, Inc. nor the names of its contributors 15 * may be used to endorse or promote products derived from this 16 * software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 25 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32#include <stdio.h> 33#include <unistd.h> 34#include <stdlib.h> 35#include <sys/time.h> 36#include <sys/resource.h> 37#include <sched.h> 38#include <getopt.h> 39 40static void 41usage(const char *s) 42{ 43 fprintf(stderr, "USAGE: %s [[-r] [-t TYPE] priority pids ...] [-g pid]\n", s); 44 exit(EXIT_FAILURE); 45} 46 47void print_prio(pid_t pid) 48{ 49 int sched; 50 struct sched_param sp; 51 52 printf("pid %d's priority: %d\n", pid, getpriority(PRIO_PROCESS, pid)); 53 54 printf("scheduling class: "); 55 sched = sched_getscheduler(pid); 56 switch (sched) { 57 case SCHED_FIFO: 58 printf("FIFO\n"); 59 break; 60 case SCHED_RR: 61 printf("RR\n"); 62 break; 63 case SCHED_OTHER: 64 printf("Normal\n"); 65 break; 66 case -1: 67 perror("sched_getscheduler"); 68 break; 69 default: 70 printf("Unknown\n"); 71 } 72 73 sched_getparam(pid, &sp); 74 printf("RT prio: %d (of %d to %d)\n", sp.sched_priority, 75 sched_get_priority_min(sched), sched_get_priority_max(sched)); 76} 77 78int get_sched(char *str) 79{ 80 if (strcasecmp(str, "RR") == 0) 81 return SCHED_RR; 82 else if (strcasecmp(str, "FIFO") == 0) 83 return SCHED_FIFO; 84 else if (strcasecmp(str, "NORMAL") == 0) 85 return SCHED_OTHER; 86 else if (strcasecmp(str, "OTHER") == 0) 87 return SCHED_OTHER; 88 return SCHED_RR; 89} 90 91int renice_main(int argc, char *argv[]) 92{ 93 int prio; 94 int realtime = 0; 95 int opt; 96 int sched = SCHED_RR; 97 char *cmd = argv[0]; 98 99 do { 100 opt = getopt(argc, argv, "rt:g:"); 101 if (opt == -1) 102 break; 103 switch (opt) { 104 case 'r': 105 // do realtime priority adjustment 106 realtime = 1; 107 break; 108 case 't': 109 sched = get_sched(optarg); 110 break; 111 case 'g': 112 print_prio(atoi(optarg)); 113 return 0; 114 default: 115 usage(cmd); 116 } 117 } while (1); 118 119 argc -= optind; 120 argv += optind; 121 122 if (argc < 1) 123 usage(cmd); 124 125 prio = atoi(argv[0]); 126 argc--; 127 argv++; 128 129 if (argc < 1) 130 usage(cmd); 131 132 while(argc) { 133 pid_t pid; 134 135 pid = atoi(argv[0]); 136 argc--; 137 argv++; 138 139 if (realtime) { 140 struct sched_param sp = { .sched_priority = prio }; 141 int ret; 142 143 ret = sched_setscheduler(pid, sched, &sp); 144 if (ret) { 145 perror("sched_set_scheduler"); 146 exit(EXIT_FAILURE); 147 } 148 } else { 149 int ret; 150 151 ret = setpriority(PRIO_PROCESS, pid, prio); 152 if (ret) { 153 perror("setpriority"); 154 exit(EXIT_FAILURE); 155 } 156 } 157 } 158 159 return 0; 160} 161