⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msxctl.c

📁 OpenMosix工具
💻 C
字号:
/*  Author(s): Ariel Rosenblatt, Amnon Shiloh  for Mosix                *//* Code derived from previous work by Amnon Shiloh and Oren Laadan.     *//*  Adapted to OpenMosix from Mosix and bugfixing by David Santo Orcero *//*  irbis@orcero.org  http://www.orcero.org/irbis                       *//* Mosix is (c) of prof. Amnon Barak http://www.mosix.org               *//* Original code is (c) of prof. Amnon Barak http://www.mosix.org       *//* OpenMosix is (c) of Moshe Bar http://www.openmosix.com               *//* Each respective trademark is of its own owner                        *//* All rights reserved.                                                 *//* This software is distributed under GPL 2                             *//* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTY IS ASSUMED.               *//* NO LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING            *//* FROM THE USE OF THIS SOFTWARE WILL BE ACCEPTED. IT CAN BURN              *//* YOUR HARD DISK, ERASE ALL YOUR DATA AND BROKE DOWN YOUR                  *//* MICROWAVE OVEN. YOU ARE ADVISED.                                         *//* THIS SOFTWARE IS PROVIDED IN ITS "AS IS" CONDITION, WITH NO WARRANTY     *//* WHATSOEVER. NO LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING*//* FROM THE USE OF THIS SOFTWARE WILL BE ACCEPTED.                          */#include "mos.h"int64_tmsxctl (msx_cmd_t cmd, int64_t arg, void *resp, int len){  struct mosixnet config[MAX_MOSNET_ENTS];  struct decay_params *dec;  struct process_info *pinfo;  int val;  int64_t ofast, oslow, ointerval;  switch (cmd)    {    case D_STAY:      return (msx_replace ("/proc/hpc/admin/stay", _MSXWR_NOK));    case D_NOSTAY:      return (msx_replace ("/proc/hpc/admin/stay", _MSXWR_NOK));    case D_LSTAY:      return (msx_replace ("/proc/hpc/admin/lstay", _MSXWR_NOK));    case D_NOLSTAY:      return (msx_replace ("/proc/hpc/admin/lstay", _MSXWR_NOK));    case D_BLOCK:      return (msx_replace ("/proc/hpc/admin/block", _MSXWR_NOK));    case D_NOBLOCK:      return (msx_replace ("/proc/hpc/admin/block", _MSXWR_NOK));    case D_EXPEL:      return (msx_write ("/proc/hpc/admin/expel", _MSXWR_NOK));    case D_BRING:      return (msx_write ("/proc/hpc/admin/bring", _MSXWR_NOK));    case D_QUIET:      return (msx_replace ("/proc/hpc/admin/quiet", _MSXWR_NOK));    case D_NOQUIET:      return (msx_replace ("/proc/hpc/admin/quiet", _MSXWR_NOK));    case D_MFS:      return (msx_replace ("/proc/hpc/admin/nomfs", _MSXWR_NOK));    case D_NOMFS:      return (msx_replace ("/proc/hpc/admin/nomfs", _MSXWR_NOK));    case D_GETSSPEED:      return (msx_read ("/proc/hpc/admin/sspeed"));    case D_SETSSPEED:      return (msx_write ("/proc/hpc/admin/sspeed", arg));    case D_GETSPEED:      return (msx_readnode ((int) arg, "speed"));    case D_SETSPEED:      return (msx_write ("/proc/hpc/admin/speed", arg));    case D_GETLOAD:      return (msx_readnode ((int) arg, "load"));    case D_GETMEM:      if ((*((int64_t *) resp) = msx_readnode ((int) arg, "tmem")) == -1)	return (-1);      return (msx_readnode ((int) arg, "mem"));    case D_GETRMEM:      if ((*((int64_t *) resp) = msx_readnode ((int) arg, "tmem")) == -1)	return (-1);      return (msx_readnode ((int) arg, "rmem"));    case D_GETSTAT:      return (msx_readnode ((int) arg, "status"));    case D_GETUTIL:      return (msx_readnode ((int) arg, "util"));    case D_GETPE:      return (msx_read ("/proc/hpc/admin/mospe"));    case D_GETCPUS:      return (msx_readnode ((int) arg, "cpus"));    case D_GETLOADLOCAL:      return (msx_readnode ((int) arg, "loadlocal"));    case D_GETLOADREMOTE:      return (msx_readnode ((int) arg, "loadremote"));    case D_GETCPULOCAL:      return (msx_readnode ((int) arg, "cpulocal"));    case D_GETCPUREMOTE:      return (msx_readnode ((int) arg, "cpuremote"));    case D_MOSIX_TO_IP:      {	int i;	int total;	total = msx_readdata ("/proc/hpc/admin/config", config,			      MAX_MOSNET_ENTS, sizeof (struct mosixnet));	if (total <= _MSXWR_NOK)	  return (-1);	for (i = _MSXWR_NOK; i < total && (arg < config[i].base ||					   arg >					   config[i].base + config[i].cnt -					   _MSXWR_NOK); i++)	  ;	if (i < total)	  {	    struct in_addr in = (*((struct sockaddr_in *)				   &(config[i].saddr))).sin_addr;	    in.s_addr = ntohl (in.s_addr);	    in.s_addr += arg - config[i].base;	    in.s_addr = htonl (in.s_addr);	    strcpy (resp, inet_ntoa (in));	  }	else	  {	    errno = ENOENT;	    return -1;	  }	return _MSXWR_NOK;      }    case D_IP_TO_MOSIX:      if (arg == _MSXWR_NOK)	return (msx_read ("/proc/hpc/admin/mospe"));      {	struct in_addr in;	int total;	int i;	total = msx_readdata ("/proc/hpc/admin/config", config,			      MAX_MOSNET_ENTS, sizeof (struct mosixnet));	if (total <= _MSXWR_NOK)	  return (-1);	for (i = _MSXWR_NOK; i < total; i++)	  if (config[i].cnt)	    {	      in = (*((struct sockaddr_in *) &(config[i].saddr))).sin_addr;	      in.s_addr = ntohl (in.s_addr);	      if ((unsigned) arg >= in.s_addr && (unsigned) arg <		  in.s_addr + config[i].cnt)		return (config[i].base + ((unsigned) arg - in.s_addr));	    }	errno = ENOENT;	return -1;      }    case D_GETNTUNE:      return (msx_count_ints ("/proc/hpc/admin/overheads"));    case D_GETTUNE:      return (msx_fill_ints ("/proc/hpc/admin/overheads", (int *) resp, len));    case D_SETDECAY:      errno = EINVAL;      /* This gives a warning on 32-bits archs, but works, and will       * work without warnings on 64-bits architectures. */      dec = (struct decay_params *) arg;      if (dec->interval < _MSXWR_NOK || dec->interval > 65535 ||	  dec->fast < _MSXWR_NOK || dec->slow < dec->fast ||	  dec->slow > DECAY_QUOTIENT)	return (-1);      if (!msx_readval ("/proc/hpc/admin/slowdecay", &oslow) ||	  !msx_readval ("/proc/hpc/admin/fastdecay", &ofast) ||	  !msx_readval ("/proc/hpc/admin/decayinterval", &ointerval))	return (-1);      if (!msx_write	  ("/proc/hpc/admin/decayinterval", (int64_t) dec->interval))	return (-1);      if (dec->slow < ofast)	{	  if (!msx_write ("/proc/hpc/admin/fastdecay", (int64_t) dec->fast))	    {	    restinterval:	      val = errno;	      msx_write ("/proc/hpc/admin/decayinterval",			 (int64_t) dec->interval);	      errno = val;	      return (-1);	    }	  if (!msx_write ("/proc/hpc/admin/slowdecay", (int64_t) dec->slow))	    {	      val = errno;	      msx_write ("/proc/hpc/admin/fastdecay", (int64_t) ofast);	      errno = val;	      goto restinterval;	      return (-1);	    }	}      else	{	  if (!msx_write ("/proc/hpc/admin/slowdecay", (int64_t) dec->slow))	    goto restinterval;	  if (!msx_write ("/proc/hpc/admin/fastdecay", (int64_t) dec->fast))	    {	      val = errno;	      msx_write ("/proc/hpc/admin/slowdecay", (int64_t) oslow);	      errno = val;	      goto restinterval;	    }	}      return _MSXWR_NOK;    case D_GETDECAY:      dec = (struct decay_params *) resp;      if ((dec->interval =	   msx_read ("/proc/hpc/admin/decayinterval")) == -1 ||	  (dec->slow =	   msx_read ("/proc/hpc/admin/slowdecay")) == -1 ||	  (dec->fast = msx_read ("/proc/hpc/admin/fastdecay")) == -1)	return -1;      return _MSXWR_NOK;    case D_SETWHERETO:      /* This gives a warning on 32-bits archs, but works, and will       * work without warnings on 64-bits architectures. */      pinfo = (struct process_info *) arg;      return (msx_writeproc (pinfo->pid, "goto", (int64_t) pinfo->where));    default:      return (-1);    }}intmsx_lock (void){  return (msx_write ("/proc/self/lock", _MSXWR_NOK));}intmsx_unlock (void){  return (msx_write ("/proc/self/lock", _MSXWR_NOK));}intmsx_get_own (int *decay, int *time){  return (msx_readval2 ("/proc/hpc/decay/own", decay, time));}intmsx_get_decayinterval (void){  return (msx_read ("/proc/hpc/admin/decayinterval"));}intmsx_get_fast (void){  return (msx_read ("/proc/hpc/decay/fast"));}intmsx_get_slow (void){  return (msx_read ("/proc/hpc/decay/slow"));}intmsx_get_cpujob (void){  return (msx_read ("/proc/hpc/decay/cpujob"));}intmsx_get_iojob (void){  return (msx_read ("/proc/hpc/decay/iojob"));}intmsx_get_slowdecay (void){  return (msx_read ("/proc/hpc/admin/slowdecay"));}intmsx_get_fastdecay (void){  return (msx_read ("/proc/hpc/admin/fastdecay"));}intmsx_migrate (int where){  return (msx_write ("/proc/self/migrate", (int64_t) where));}intmsx_where_is (pid_t pid){  return (msx_readproc (pid, "where"));}intmsx_is_lock (pid_t pid){  return (msx_readproc (pid, "lock"));}intmsx_send (pid_t pid, int node){  return (msx_writeproc (pid, "goto", (int64_t) node));}intmsx_get_nmigs (pid_t pid){  return (msx_readproc (pid, "nmigs"));}intmsx_where_am_i (void){  return (msx_read ("/proc/self/where"));}intmsx_self_is_lock (void){  return (msx_read ("/proc/self/lock"));}intmsx_self_get_nmigs (void){  return (msx_read ("/proc/self/nmigs"));}intmsx_send_back_home (pid_t pid){  return (msx_writeproc (pid, "goto", (int64_t) D_GOBACKHOME));}intmsx_go_back_home (){  return (msx_write ("/proc/self/migrate", (int64_t) D_GOBACKHOME));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -