Re: CFS aware chrt in util linux

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 Hi Christian,

 we're currently in a feature freeze for v2.13. I'll postpone this to
 util-linux-ng-v2.14 (later on we'll backport it from 2.14 to 2.13.x
 when it will be really necessary for stable linux-2.6.23).

 Thanks!

    Karel

On Sat, Jul 21, 2007 at 07:46:27PM +0200, Christian Casteyde wrote:
> 
> 	I've made a little patch to take new schedulers policy in chrt.
> This will obviously be usefull, since CFS has been integrated
> in the upcoming 2.6.23.
> 
> 	Really simple changes + some options reordered. I had to resolve
> a conflict in short options between iso and idle (I took s for iSo and kept
> i for Idle).
> 
> 	I also add two lines to fix user and group ids, just in case the process
> is installed setuid (as it would be able to exec a shell and modify any 
> process priorities). Ok, this should not be done, but let's be secure
> in depth. This fix should also be applied to other tools, such as ionice btw
> (there are distros who patch ionice themselves, and they do things
> in the complex way).
> 
> Regards,
> CC

> --- chrt.c.orig	2007-07-16 15:21:29.000000000 +0200
> +++ chrt.c	2007-07-21 19:36:34.000000000 +0200
> @@ -26,6 +26,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <sched.h>
> +#include <sys/types.h>
>  #include <unistd.h>
>  #include <getopt.h>
>  #include <errno.h>
> @@ -37,24 +38,39 @@
>  # define SCHED_BATCH 3
>  #endif
>  
> +/* We have more scheduling classes since Linux 2.6.23
> + * these may not be defined so use the same temporary hack
> + */
> +
> +#ifndef SCHED_ISO
> +# define SCHED_ISO   4
> +#endif
> +#ifndef SCHED_IDLE
> +# define SCHED_IDLE  5
> +#endif
> +
>  static void show_usage(const char *cmd)
>  {
>  	fprintf(stderr, "chrt (%s)\n", PACKAGE_STRING);
>  	fprintf(stderr, "usage: %s [options] [prio] [pid | cmd [args...]]\n",
>  			cmd);
>  	fprintf(stderr, "manipulate real-time attributes of a process\n");
> -	fprintf(stderr, "  -b, --batch                        "
> -			"set policy to SCHED_BATCH\n");
>  	fprintf(stderr, "  -f, --fifo                         "
>  			"set policy to SCHED_FIFO\n");
> +	fprintf(stderr, "  -r, --rr                           "
> +			"set policy to SCHED_RR (default)\n");
> +	fprintf(stderr, "  -b, --batch                        "
> +			"set policy to SCHED_BATCH\n");
> +	fprintf(stderr, "  -s, --iso                          "
> +			"set policy to SCHED_ISO\n");
> +	fprintf(stderr, "  -i, --idle                         "
> +			"set policy to SCHED_IDLE\n");
> +	fprintf(stderr, "  -o, --other                        "
> +			"set policy to SCHED_OTHER (SCHED_NORMAL)\n");
>  	fprintf(stderr, "  -p, --pid                          "
>  			"operate on existing given pid\n");
>  	fprintf(stderr, "  -m, --max                          "
>  			"show min and max valid priorities\n");
> -	fprintf(stderr, "  -o, --other                        "
> -			"set policy to SCHED_OTHER\n");
> -	fprintf(stderr, "  -r, --rr                           "
> -			"set policy to SCHED_RR (default)\n");
>  	fprintf(stderr, "  -h, --help                         "
>  			"display this help\n");
>  	fprintf(stderr, "  -v, --verbose                      "
> @@ -95,6 +111,12 @@
>  	case SCHED_BATCH:
>  		printf("SCHED_BATCH\n");
>  		break;
> +	case SCHED_ISO:
> +		printf("SCHED_ISO\n");
> +		break;
> +	case SCHED_IDLE:
> +		printf("SCHED_IDLE\n");
> +		break;
>  	default:
>  		printf("unknown\n");
>  	}
> @@ -140,6 +162,20 @@
>  		printf("SCHED_BATCH min/max priority\t: %d/%d\n", min, max);
>  	else
>  		printf("SCHED_BATCH not supported?\n");
> +
> +	max = sched_get_priority_max(SCHED_ISO);
> +	min = sched_get_priority_min(SCHED_ISO);
> +	if (max >= 0 && min >= 0)
> +		printf("SCHED_ISO min/max priority\t: %d/%d\n", min, max);
> +	else
> +		printf("SCHED_ISO not supported?\n");
> +
> +	max = sched_get_priority_max(SCHED_IDLE);
> +	min = sched_get_priority_min(SCHED_IDLE);
> +	if (max >= 0 && min >= 0)
> +		printf("SCHED_IDLE min/max priority\t: %d/%d\n", min, max);
> +	else
> +		printf("SCHED_IDLE not supported?\n");
>  }
>  
>  int main(int argc, char *argv[])
> @@ -151,17 +187,25 @@
>  	struct option longopts[] = {
>  		{ "batch",	0, NULL, 'b' },
>  		{ "fifo",	0, NULL, 'f' },
> +		{ "rr",		0, NULL, 'r' },
> +		{ "iso",	0, NULL, 's' },
> +		{ "idle",	0, NULL, 'i' },
> +		{ "other",	0, NULL, 'o' },
>  		{ "pid",	0, NULL, 'p' },
>  		{ "help",	0, NULL, 'h' },
>  		{ "max",        0, NULL, 'm' },
> -		{ "other",	0, NULL, 'o' },
> -		{ "rr",		0, NULL, 'r' },
>  		{ "verbose",	0, NULL, 'v' },
>  		{ "version",	0, NULL, 'V' },
>  		{ NULL,		0, NULL, 0 }
>  	};
>  
> -	while((i = getopt_long(argc, argv, "+bfphmorvV", longopts, NULL)) != -1)
> +	/*
> +	 * Just in case we are setuid or setgid, drop all priviledges:
> +	 */
> +	seteuid(getuid());
> +	setgid(getgid());
> +
> +	while((i = getopt_long(argc, argv, "+bfrsiophmvV", longopts, NULL)) != -1)
>  	{
>  		int ret = 1;
>  
> @@ -172,9 +216,15 @@
>  		case 'f':
>  			policy = SCHED_FIFO;
>  			break;
> -		case 'm':
> -			show_min_max();
> -			return 0;
> +		case 'r':
> +			policy = SCHED_RR;
> +			break;
> +		case 's':
> +			policy = SCHED_ISO;
> +			break;
> +		case 'i':
> +			policy = SCHED_IDLE;
> +			break;
>  		case 'o':
>  			policy = SCHED_OTHER;
>  			break;
> @@ -187,9 +237,9 @@
>  				return 1;
>  			}
>  			break;
> -		case 'r':
> -			policy = SCHED_RR;
> -			break;
> +		case 'm':
> +			show_min_max();
> +			return 0;
>  		case 'v':
>  			verbose = 1;
>  			break;


-- 
 Karel Zak  <kzak@xxxxxxxxxx>
-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux