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

📄 mom_mach.c

📁 openPBS的开放源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		else			*rtn_limit = udblimit;	} else {		/* user specified an actual limit */		if (zlimit) {			if ((udblimit != MAXUE_LONG) && (rlimit > udblimit))				return (PBSE_EXLIMIT);		} else {			if (((udblimit != 0) || (udblimit != MAXUE_LONG)) &&			    (rlimit > udblimit))				return (PBSE_EXLIMIT);		}		*rtn_limit = rlimit;	}	return (0);}/* * Establish system-enforced limits for the tasks of a job. * *	Run through the resource list, checking the values for all items *	we recognize. * *	If set_mode is SET_LIMIT_SET, then also set hard limits for the *	system enforced limits (not-polled). *	If anything goes wrong with the process, return a PBS error code *	and print a message on standard error.  A zero-length resource list *	is not an error. * *	If set_mode is SET_LIMIT_SET the entry conditions are: *	    1.	MOM has already forked, and we are called from the child. *	    2.	The child is still running as root. *	    3.  Standard error is open to the user's file. * *	If set_mode is SET_LIMIT_ALTER, we are beening called to modify *	existing limits.  Unlike bsd based systems that use setrlimit, the *	Cray limit() call can set limits for another session.  Hence all *	limits can be adjusted. */int mom_set_limits(pjob, set_mode)    job			*pjob;    int			 set_mode;	/* unused here */{	static char	*id = "mom_set_limits";	int	        acid;	int		maxcput;	int		maxpcput;	int		maxmem;	int		maxmt[MAXUE_TAPETYPE];	int		maxpmem;	int		maxpf;	int		maxppf;	int		maxsds;	int		maxpsds;	int		maxnproc;	int		maxmppe;	int		maxmppt;	int		maxpmppt;	int		niceval;	int		num;	char		*pc;	char		*phost;	char		*pname;	struct udb	*pudb;	int		sessid;	int		retval;	attribute	*pat;	resource	*pres;	task		*ptask;	unsigned long	value;	/* place in which to build resource value */	DBPRT(("%s: entered\n", id))	assert(pjob != NULL);	assert(pjob->ji_wattr[(int)JOB_ATR_resource].at_type == ATR_TYPE_RESC);	/* initialize limits to values from user's UDB */	if (set_mode == SET_LIMIT_SET) {		getsysudb();	/* get the priviled (locked) udb */	}	pudb = getudbuid(pjob->ji_qs.ji_un.ji_momt.ji_exuid);	if (pudb == UDB_NULL)		return (PBSE_BADUSER);	if (set_mode == SET_LIMIT_SET) {		/* can this user run batch jobs */		if (pudb->ue_permbits & PERMBITS_NOBATCH) {			endudb();			return (PBSE_QACESS);		}		/* set Account ID: 1 - if supplied and is valid acid, */		/* or 2 - default acid from UDB 		      */		pat = &pjob->ji_wattr[(int)JOB_ATR_account];		if (pat->at_flags & ATR_VFLAG_SET) {			pname = pat->at_val.at_str;			if ((acid = nam2acid(pname)) == -1)  {			    for (pc = pname; *pc; ++pc) {				if ( !isdigit((int)*pc))				    return (error(pname, PBSE_BADACCT));			    }			    if (acid2nam(acid = atoi(pname)) == (char *)0)				    return (error(pname, PBSE_BADACCT));			}			for (num=0; num<MAXVIDS; ++num) {				if (pudb->ue_acids[num] == acid)					break;			}			if (num == MAXVIDS)				return (error(pname, PBSE_BADACCT));		} else {			acid = pudb->ue_acids[0];		}		if (acctid(0, acid) == -1) 			return (error("Account", PBSE_BADACCT));			 			 		/* lock and update the UDB with the batch host/time */		if (lockudb() < 0) {			log_err(udb_errno, id, "Unable to lock UDB");		} else {			pudb->ue_batchtime = time_now;			phost = arst_string("PBS_O_HOST",				     &pjob->ji_wattr[(int)JOB_ATR_variables]);			if ( (phost == (char *)0) ||			     ((phost=strchr(phost, (int)'=')) == (char *)0) ) 				log_err(-1, id, "PBS_O_HOST not set");			strncpy(pudb->ue_batchhost, phost+1, MAXUE_HOSTNAME);			pudb->ue_batchhost[MAXUE_HOSTNAME] = '\0';			if (rewriteudb(pudb) < 0)				log_err(udb_errno, id, "UDB Update failed");		}	}	endudb();/* *	set basic limits to values from the user's UDB entry;  later *	we have to check for values == MAXUE_LONG, meaning unlimited, *	where in the limit() call it must be changed to 0. *	A click is 512 words = 4096 bytes */	maxcput  = pudb->ue_jcpulim[UDBRC_BATCH];	/* seconds */	maxpcput = pudb->ue_pcpulim[UDBRC_BATCH];	/* seconds */	maxmem   = pudb->ue_jmemlim[UDBRC_BATCH];	/* clicks */	maxpmem  = pudb->ue_pmemlim[UDBRC_BATCH];	/* clicks */	maxpf    = pudb->ue_jfilelim[UDBRC_BATCH];	/* clicks */	maxppf   = pudb->ue_pfilelim[UDBRC_BATCH];	/* clicks */	maxsds   = pudb->ue_jsdslim[UDBRC_BATCH];	/* clicks */	maxpsds  = pudb->ue_psdslim[UDBRC_BATCH];	/* clicks */	maxnproc = pudb->ue_jproclim[UDBRC_BATCH];	maxmppe  = pudb->ue_jpelimit[UDBRC_BATCH];	maxmppt  = pudb->ue_jmpptime[UDBRC_BATCH];	maxpmppt = pudb->ue_pmpptime[UDBRC_BATCH];	niceval  = pudb->ue_nice[UDBRC_BATCH];	for (num = 0; num < MAXUE_TAPETYPE; ++num)		maxmt[num] = pudb->ue_jtapelim[UDBRC_BATCH][num];	pres = (resource *)	    GET_NEXT(pjob->ji_wattr[(int)JOB_ATR_resource].at_val.at_list);/* * Cycle through all the resource specifications, * setting limits appropriately. */	while (pres != NULL) {		assert(pres->rs_defin != NULL);		pname = pres->rs_defin->rs_name;		assert(pname != NULL);		assert(*pname != '\0');		if (strcmp(pname, "cput") == 0) {			retval = gettime(pres, &value);			value = (unsigned long)((double)value / cputfactor);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit(value, maxcput,					pres->rs_value.at_flags, 0, &maxcput);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "pcput") == 0) {			retval = gettime(pres, &value);			value = (unsigned long)((double)value / cputfactor);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit(value, maxpcput,					pres->rs_value.at_flags, 0, &maxpcput);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "mem") == 0) {			retval = getsize(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit((value+4095)/4096, maxmem,					pres->rs_value.at_flags, 0, &maxmem);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "pmem") == 0) {			retval = getsize(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit((value+4095)/4096, maxpmem,					pres->rs_value.at_flags, 0, &maxpmem);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "vmem")  == 0) {	/* ignore */		} else if (strcmp(pname, "pvmem") == 0) {	/* ignore */		} else if (strcmp(pname, "file")  == 0) {	/* ignore */		} else if ( (strcmp(pname, "mta") == 0) ||			    (strcmp(pname, "mtb") == 0) ||			    (strcmp(pname, "mtc") == 0) ||			    (strcmp(pname, "mtd") == 0) ||			    (strcmp(pname, "mte") == 0) ||			    (strcmp(pname, "mtf") == 0) ||			    (strcmp(pname, "mtg") == 0) ||			    (strcmp(pname, "mth") == 0) ) {			num = (int)*(pname+2) - (int)'a';			maxmt[num] = pres->rs_value.at_val.at_long;			retval = which_limit(pres->rs_value.at_val.at_long,					maxmt[num], 					pres->rs_value.at_flags,					0,					&maxmt[num]);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "pf") == 0) {			retval = getsize(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit((value+4095)/4096, maxpf,					pres->rs_value.at_flags,					0,					&maxpf);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "ppf") == 0) {			retval = getsize(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit((value+4095)/4096, maxppf,					pres->rs_value.at_flags,					0,					&maxppf);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "sds") == 0) {			retval = getsize(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit((value+4095)/4096, maxsds,					pres->rs_value.at_flags, 1, &maxsds);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "psds") == 0) {			retval = getsize(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit((value+4095)/4096, maxpsds,					pres->rs_value.at_flags, 1, &maxpsds);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "procs") == 0) {			retval = getlong(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit(value, maxnproc,					pres->rs_value.at_flags, 0, &maxnproc);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "mppe") == 0) {			retval = getlong(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit(value, maxmppe,					pres->rs_value.at_flags, 1, &maxmppe);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "mppt") == 0) {			retval = gettime(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit(value, maxmppt,					pres->rs_value.at_flags, 1, &maxmppt);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "pmppt") == 0) {			retval = gettime(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));			if (value > INT_MAX)				return (error(pname, PBSE_BADATVAL));			retval = which_limit(value, maxpmppt,					pres->rs_value.at_flags, 1, &maxpmppt);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "walltime") == 0) {			retval = gettime(pres, &value);			if (retval != PBSE_NONE)				return (error(pname, retval));		} else if (strcmp(pname, "nice") == 0) {			if (set_mode == SET_LIMIT_SET) {				niceval = (int)pres->rs_value.at_val.at_long;			}		} else if ((pres->rs_defin->rs_flags & ATR_DFLAG_RMOMIG) == 0)			/* don't recognize and nor marked as ignore by mom */			return (error(pname, PBSE_UNKRESC));		pres = (resource *)GET_NEXT(pres->rs_link);	}	/*	 * Set the limits	 *	 * If pcput, pmem, or ppf is unlimited but the corresponding session	 * limit is not, use the session limit for the process limit.	 */	for (ptask = (task *)GET_NEXT(pjob->ji_tasks);			ptask != NULL;			ptask = (task *)GET_NEXT(ptask->ti_jobtask)) {		sessid = ptask->ti_qs.ti_sid;		if (maxcput == MAXUE_LONG)	/* if unlimited */			maxcput = 0;		if (limit(C_JOB, sessid, L_CPU, maxcput) < 0)			return (error("cput", PBSE_SYSTEM));		if ((maxpcput == MAXUE_LONG) ||				(maxpcput == 0)) {	/* if unlimited */			if (maxcput != 0)				maxpcput = maxcput;			else				maxpcput = 0;		} else if ((maxpcput > maxcput) && (maxcput != 0)) {			maxpcput = maxcput;		}		if (limit(C_JOBPROCS, sessid, L_CPU, maxpcput) < 0)			return (error("pcput", PBSE_SYSTEM));		if (maxmem == MAXUE_LONG)	/* if unlimited */			maxmem = 0;		if (limit(C_JOB, sessid, L_MEM, maxmem) < 0)			return (error("mem", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_MPPM, maxmem) < 0)			return (error("mppm", PBSE_SYSTEM));		if ((maxpmem == MAXUE_LONG) ||				(maxpmem == 0)) {	/* if unlimited */			if (maxmem != 0)				maxpmem = maxmem;			else				maxpmem = 0;		} else if ((maxpmem > maxmem) && (maxmem != 0)) {			maxpmem = maxmem;		}		if (limit(C_JOBPROCS, sessid, L_MEM, maxpmem) < 0)			return (error("pmem", PBSE_SYSTEM));		if (maxpf == MAXUE_LONG)	/* if unlimited */			maxpf = 0;		if (limit(C_JOB, sessid, L_FSBLK, maxpf) < 0)			return (error("pf", PBSE_SYSTEM));		if ((maxppf == MAXUE_LONG) ||				(maxppf == 0)) {	/* if unlimited */			if (maxpf != 0)				maxppf = maxpf;			else				maxppf = 0;		} else if ((maxppf > maxpf) && (maxpf != 0)) {			maxppf = maxpf;		}		if (limit(C_JOBPROCS, sessid, L_FSBLK, maxppf) < 0)			return (error("ppf", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_SDS, maxsds) < 0)			return (error("sds", PBSE_SYSTEM));		if (limit(C_JOBPROCS, sessid, L_SDS, maxpsds) < 0)			return (error("psds", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_CPROC, maxnproc) < 0)			return (error("procs", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE0, maxmt[0]) < 0)			return (error("mta", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE1, maxmt[1]) < 0)			return (error("mtb", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE2, maxmt[2]) < 0)			return (error("mtc", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE3, maxmt[3]) < 0)			return (error("mtd", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE4, maxmt[4]) < 0)			return (error("mte", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE5, maxmt[5]) < 0)			return (error("mtf", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE6, maxmt[6]) < 0)			return (error("mtg", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_TAPE7, maxmt[7]) < 0)			return (error("mth", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_MPPE, maxmppe) < 0)			return (error("mppe", PBSE_SYSTEM));		if (limit(C_JOB, sessid, L_MPPT, maxmppt) < 0)			return (error("mppt", PBSE_SYSTEM));		if (limit(C_JOBPROCS, sessid, L_MPPT, maxpmppt) < 0)			return (error("pmppt", PBSE_SYSTEM));		if (set_mode == SET_LIMIT_SET) {			errno = 0;			if ((nice(niceval) == -1) && (errno != 0))				return (error("nice", PBSE_SYSTEM));		}	}	return (PBSE_NONE);}/* * State whether MOM main loop has to poll this job to determine if some * limits are being exceeded. * *	Sets flag TRUE if polling is necessary, FALSE otherwise.  Actual *	polling is done using the mom_over_limit machine-dependent function. */int mom_do_poll(pjob)    job			*pjob;{	static char	*id = "mom_do_poll";	char		*pname;	resource	*pres;	DBPRT(("%s: entered\n", id))	assert(pjob != NULL);	assert(pjob->ji_wattr[(int)JOB_ATR_resource].at_type == ATR_TYPE_RESC);	pres = (resource *)	    GET_NEXT(pjob->ji_wattr[(int)JOB_ATR_resource].at_val.at_list);	while (pres != NULL) {		assert(pres->rs_defin != NULL);		pname = pres->rs_defin->rs_name;		assert(pname != NULL);		assert(*pname != '\0');

⌨️ 快捷键说明

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