
Путь: Toys/Other, команды версии: Ver.4 Ver.9 uclampset Комментарии в файле uclampset.c : 
 
 Исходный текст в файле uclampset.c #define FOR_uclampset
#include "toys.h"
GLOBALS(
  long M, m, p;
)
// Added to 5.3 kernel (commit a509a7cd7974): too new to rely on headers
#ifndef SCHED_FLAG_RESET_ON_FORK
#define SCHED_FLAG_RESET_ON_FORK 0x01
#define SCHED_FLAG_KEEP_POLICY 0x08
#define SCHED_FLAG_KEEP_PARAMS 0x10
#define SCHED_FLAG_UTIL_CLAMP_MIN 0x20
#define SCHED_FLAG_UTIL_CLAMP_MAX 0x40
#endif
static void do_uclampset(pid_t pid)
{
  unsigned *sa = (void *)toybuf; // sa[12] is min, sa[13] is max
  char *comm, buf[32];
  if (FLAG(R)|FLAG(m)|FLAG(M)) {
    if (syscall(__NR_sched_setattr, pid, sa, 0))
      perror_exit("sched_setattr for pid %d", pid);
  } else {
    sprintf(buf, "/proc/%u/comm", pid);
    comm = chomp(xreadfile(buf, 0, 0));
    if (syscall(__NR_sched_getattr, pid, sa, *sa, 0))
      perror_exit("sched_getattr for pid %d", pid);
    printf("%s (%d) util_clamp: min: %u max: %u\n", comm, pid, sa[12], sa[13]);
    free(comm);
  }
}
static int task_callback(struct dirtree *new)
{
  if (!new->parent) return DIRTREE_RECURSE;
  if (isdigit(*new->name)) do_uclampset(atoi(new->name));
  return 0;
}
void uclampset_main(void)
{
  unsigned *sa = (void *)toybuf;
  long long *flags = (void *)(sa+2);
  char buf[32];
  sa[0]  = 14*4; // size
  sa[12] = TT.m;
  sa[13] = TT.M;
  *flags = SCHED_FLAG_KEEP_POLICY | SCHED_FLAG_KEEP_PARAMS;
  if (FLAG(R)) *flags |= SCHED_FLAG_RESET_ON_FORK;
  if (FLAG(m)) *flags |= SCHED_FLAG_UTIL_CLAMP_MIN;
  if (FLAG(M)) *flags |= SCHED_FLAG_UTIL_CLAMP_MAX;
  if (!FLAG(p)) {
    if (toys.optc < 1) error_exit("Need -p PID or CMD [ARG...]");
    do_uclampset(getpid());
    xexec(toys.optargs);
  } else if (FLAG(a)) {
    sprintf(buf, "/proc/%lu/task", TT.p);
    dirtree_read(buf, task_callback);
  } else do_uclampset(TT.p);
} | 
   ![]()  |