freebsd-ports/sysutils/sge60/files/sge-freebsd-pdc.diff

366 lines
12 KiB
Diff

--- daemons/common/pdc.c.orig Thu Sep 1 02:09:04 2005
+++ daemons/common/pdc.c Thu Apr 13 22:05:15 2006
@@ -118,6 +118,16 @@
#include "sge_unistd.h"
#endif
+#if defined(FREEBSD)
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
+
+#include <fcntl.h>
+#include <kvm.h>
+#include <limits.h>
+#endif
+
#if defined(LINUX) || defined(ALPHA) || defined(IRIX) || defined(SOLARIS) || defined(DARWIN) || defined (FREEBSD) || defined(NETBSD)
#include "sge_os.h"
@@ -188,12 +198,57 @@
}
#endif
-#if defined(LINUX) || defined(SOLARIS) || defined(ALPHA)
+#if defined(LINUX) || defined(SOLARIS) || defined(ALPHA) || defined(FREEBSD)
void pdc_kill_addgrpid(gid_t add_grp_id, int sig,
tShepherd_trace shepherd_trace)
{
+#if defined(LINUX) || defined(SOLARIS) || defined(ALPHA)
procfs_kill_addgrpid(add_grp_id, sig, shepherd_trace);
+#elif defined(FREEBSD)
+ kvm_t *kd;
+ int i, nprocs;
+ struct kinfo_proc *procs;
+ char kerrbuf[_POSIX2_LINE_MAX];
+
+ kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, kerrbuf);
+ if (kd == NULL) {
+#if DEBUG
+ fprintf(stderr, "kvm_getprocs: error %s\n", kerrbuf);
+#endif
+ return;
+ }
+
+ procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nprocs);
+ if (procs == NULL) {
+#if DEBUG
+ fprintf(stderr, "kvm_getprocs: error %s\n", kvm_geterr(kd));
+#endif
+ kvm_close(kd);
+ return;
+ }
+ for (; nprocs >= 0; nprocs--, procs++) {
+ for (i = 0; i < procs->ki_ngroups; i++) {
+ if (procs->ki_groups[i] == add_grp_id) {
+ char err_str[256];
+
+ if (procs->ki_uid != 0 && procs->ki_ruid != 0 &&
+ procs->ki_svuid != 0 &&
+ procs->ki_rgid != 0 && procs->ki_svgid != 0) {
+ kill(procs->ki_pid, sig);
+ sprintf(err_str, MSG_SGE_KILLINGPIDXY_UI ,
+ sge_u32c(procs->ki_pid), add_grp_id);
+ } else {
+ sprintf(err_str, MSG_SGE_DONOTKILLROOTPROCESSXY_UI ,
+ sge_u32c(procs->ki_pid), add_grp_id);
+ }
+ if (shepherd_trace)
+ shepherd_trace(err_str);
+ }
+ }
+ }
+ kvm_close(kd);
+#endif
}
#endif
@@ -1404,6 +1459,95 @@
;
pt_close();
}
+#elif defined(FREEBSD)
+ {
+ kvm_t *kd;
+ int i, nprocs;
+ struct kinfo_proc *procs;
+ char kerrbuf[_POSIX2_LINE_MAX];
+ job_elem_t *job_elem;
+ double old_time = 0.0;
+ uint64 old_vmem = 0;
+
+ kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, kerrbuf);
+ if (kd == NULL) {
+#if DEBUG
+ fprintf(stderr, "kvm_getprocs: error %s\n", kerrbuf);
+#endif
+ DEXIT;
+ return -1;
+ }
+
+ procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nprocs);
+ if (procs == NULL) {
+#if DEBUG
+ fprintf(stderr, "kvm_getprocs: error %s\n", kvm_geterr(kd));
+#endif
+ kvm_close(kd);
+ DEXIT;
+ return -1;
+ }
+ for (; nprocs >= 0; nprocs--, procs++) {
+ for (curr=job_list.next; curr != &job_list; curr=curr->next) {
+ job_elem = LNK_DATA(curr, job_elem_t, link);
+
+ for (i = 0; i < procs->ki_ngroups; i++) {
+ if (job_elem->job.jd_jid == procs->ki_groups[i]) {
+ lnk_link_t *curr2;
+ proc_elem_t *proc_elem;
+ int newprocess;
+
+ newprocess = 1;
+ if (job_elem->job.jd_proccount != 0) {
+ for (curr2=job_elem->procs.next; curr2 != &job_elem->procs; curr2=curr2->next) {
+ proc_elem = LNK_DATA(curr2, proc_elem_t, link);
+
+ if (proc_elem->proc.pd_pid == procs->ki_pid) {
+ newprocess = 0;
+ break;
+ }
+ }
+ }
+ if (newprocess) {
+ proc_elem = malloc(sizeof(proc_elem_t));
+ if (proc_elem == NULL) {
+ kvm_close(kd);
+ DEXIT;
+ return 0;
+ }
+
+ memset(proc_elem, 0, sizeof(proc_elem_t));
+ proc_elem->proc.pd_length = sizeof(psProc_t);
+ proc_elem->proc.pd_state = 1; /* active */
+ proc_elem->proc.pd_pstart = procs->ki_start.tv_sec;
+
+ LNK_ADD(job_elem->procs.prev, &proc_elem->link);
+ job_elem->job.jd_proccount++;
+ } else {
+ /* save previous usage data - needed to build delta usage */
+ old_time = proc_elem->proc.pd_utime + proc_elem->proc.pd_stime;
+ old_vmem = proc_elem->vmem;
+ }
+ proc_elem->proc.pd_tstamp = time_stamp;
+ proc_elem->proc.pd_pid = procs->ki_pid;
+
+ proc_elem->proc.pd_utime = procs->ki_rusage.ru_utime.tv_sec;
+ proc_elem->proc.pd_stime = procs->ki_rusage.ru_stime.tv_sec;
+
+ proc_elem->proc.pd_uid = procs->ki_uid;
+ proc_elem->proc.pd_gid = procs->ki_rgid;
+ proc_elem->vmem = procs->ki_size;
+ proc_elem->rss = procs->ki_rssize;
+
+ proc_elem->mem = ((proc_elem->proc.pd_stime + proc_elem->proc.pd_utime) - old_time) *
+ (( old_vmem + proc_elem->vmem)/2);
+ }
+ }
+ }
+ }
+
+ kvm_close(kd);
+ }
#elif defined(NECSX4) || defined(NECSX5)
{
for (curr=job_list.next; curr != &job_list; curr=curr->next) {
@@ -1951,7 +2095,7 @@
}
-#elif defined(ALPHA) || defined(LINUX) || defined(SOLARIS)
+#elif defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(FREEBSD)
{
int proccount;
lnk_link_t *currp, *nextp;
--- daemons/common/pdc.h.orig Mon Feb 9 06:06:49 2004
+++ daemons/common/pdc.h Thu Apr 13 22:00:01 2006
@@ -187,7 +187,7 @@
int sup_groups_in_proc(void);
#endif
-#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS)
+#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(FREEBSD)
void pdc_kill_addgrpid(gid_t, int, tShepherd_trace);
#endif
--- daemons/common/setosjobid.c.orig Tue May 3 02:18:19 2005
+++ daemons/common/setosjobid.c Thu Apr 13 22:00:01 2006
@@ -126,7 +126,7 @@
sprintf(err_str, "setosjobid: uid = "pid_t_fmt", euid = "pid_t_fmt, getuid(), geteuid());
shepherd_trace(err_str);
-# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
/* Read SgeId from config-File and create Addgrpid-File */
{
char *cp;
--- daemons/execd/exec_job.c.orig Wed Nov 23 03:03:59 2005
+++ daemons/execd/exec_job.c Thu Apr 13 22:06:17 2006
@@ -106,7 +106,7 @@
extern char execd_spool_dir[SGE_PATH_MAX];
#if COMPILE_DC
-#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
/* local functions */
static int addgrpid_already_in_use(long);
static long get_next_addgrpid(lList *, long);
@@ -143,7 +143,7 @@
}
#if COMPILE_DC
-#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
static long get_next_addgrpid(
lList *rlp,
long last_addgrpid
@@ -245,7 +245,7 @@
char dce_wrapper_cmd[128];
#if COMPILE_DC
-#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
static gid_t last_addgrpid;
#endif
#endif
@@ -778,7 +778,7 @@
#ifdef COMPILE_DC
-# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
{
lList *rlp = NULL;
--- daemons/execd/execd_ck_to_do.c.orig Wed Nov 2 08:03:13 2005
+++ daemons/execd/execd_ck_to_do.c Thu Apr 13 22:07:18 2006
@@ -913,7 +913,7 @@
FILE *fp;
SGE_STRUCT_STAT sb;
-#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
gid_t addgrpid;
dstring addgrpid_path = DSTRING_INIT;
#else
@@ -928,7 +928,7 @@
pe_task_id = lGetString(pe_task, PET_id);
}
-#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
/**
** read additional group id and use it as osjobid
**/
--- daemons/execd/ptf.c.orig Tue Nov 22 07:35:00 2005
+++ daemons/execd/ptf.c Thu Apr 13 22:08:27 2006
@@ -44,7 +44,7 @@
#if defined(COMPILE_DC) || defined(MODULE_TEST)
-#if defined(IRIX) || defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(NECSX4) || defined(NECSX5) || !defined(MODULE_TEST)
+#if defined(IRIX) || defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(NECSX4) || defined(NECSX5) || !defined(MODULE_TEST) || defined(FREEBSD)
# define USE_DC
#endif
@@ -82,7 +82,7 @@
# include <sys/category.h>
#endif
-#if defined(ALPHA) || defined(SOLARIS) || defined(LINUX)
+#if defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD)
# include <sys/resource.h>
#endif
@@ -217,7 +217,7 @@
static void ptf_setpriority_jobid(lListElem *job, lListElem *osjob, long pri);
-#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX)
+#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD)
static void ptf_setpriority_addgrpid(lListElem *job, lListElem *osjob,
long pri);
@@ -365,7 +365,7 @@
lSetDouble(usage, UA_value, 0);
lAppendElem(usage_list, usage);
-#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS)
+#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(FREBSD)
usage = lCreateElem(UA_Type);
lSetString(usage, UA_name, USAGE_ATTR_VMEM);
lSetDouble(usage, UA_value, 0);
@@ -494,7 +494,7 @@
ptf_setpriority_ash(job, osjob, pri);
#elif defined(CRAY) || defined(NECSX4) || defined(NECSX5)
ptf_setpriority_jobid(job, osjob, pri);
-#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX)
+#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD)
ptf_setpriority_addgrpid(job, osjob, pri);
#endif
}
@@ -713,7 +713,7 @@
DEXIT;
}
-#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX)
+#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD)
/****** execd/ptf/ptf_setpriority_addgrpid() **********************************
* NAME
@@ -724,9 +724,9 @@
* long *pri)
*
* FUNCTION
-* This function is only available for the architecture SOLARIS, ALPHA and
-* LINUX. All processes belonging to "job" and "osjob" will get a new i
-* priority.
+* This function is only available for the architecture SOLARIS, ALPHA,
+* LINUX, and FREEBSD. All processes belonging to "job" and "osjob" will
+* get a new priority.
*
* This function assumes the the "max" priority is smaller than the "min"
* priority.
@@ -1981,7 +1981,7 @@
}
}
-#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX)
+#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD)
if (getuid() == 0) {
if (setpriority(PRIO_PROCESS, getpid(), PTF_MAX_PRIORITY) < 0) {
ERROR((SGE_EVENT, MSG_PRIO_SETPRIOFAILED_S, strerror(errno)));
--- daemons/shepherd/shepherd.c.orig Mon Jan 1 05:44:56 2007
+++ daemons/shepherd/shepherd.c Mon Feb 5 10:07:37 2007
@@ -2478,9 +2478,9 @@
kill(pid, sig);
sge_switch2admin_user();
-#if defined(SOLARIS) || defined(LINUX) || defined(ALPHA) || defined(IRIX)
+#if defined(SOLARIS) || defined(LINUX) || defined(ALPHA) || defined(IRIX) || defined(FREEBSD)
if (first_kill == 0 || sig != SIGKILL || is_qrsh == false) {
-# if defined(SOLARIS) || defined(LINUX) || defined(ALPHA)
+# if defined(SOLARIS) || defined(LINUX) || defined(ALPHA) || defined(FREEBSD)
# ifdef COMPILE_DC
if (atoi(get_conf_val("enable_addgrp_kill")) == 1) {
gid_t add_grp_id;
--- libs/uti/sge_uidgid.c.orig Wed Nov 23 03:04:09 2005
+++ libs/uti/sge_uidgid.c Thu Apr 13 22:00:01 2006
@@ -850,7 +850,7 @@
#endif
#endif /* WIN32 */
-#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX)
+#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD)
/* add Additional group id to current list of groups */
if (add_grp) {
if (sge_add_group(add_grp, err_str) == -1) {