On Fri, Apr 04, 2003 at 06:07:12PM -0600, Glenn Johnson wrote:
> On Fri, Apr 04, 2003 at 03:54:05PM -0800, Julian Elischer wrote:
> 
> > yes..
> >
> > The entire process structure and it's surrounding enviroment has been 
> > through a blender.                                                    
> >
> > What do you wnat to do?
> 
> I would like to learn what I need to do to get the software to compile
> on FreeBSD-5.  I guess the question is, what information do I need to
> provide?  The software in question is OpenPBS (http://www.openpbs.org),
> so it nothing proprietary.  There were a whole bunch of dependency
> problems that I worked through manually and finally got to the point
> of the kp_proc failure.  Here is a snippet of code that produces the
> failure:

Here are untested patches I made for this a while ago.  There's also a
port PR somewhere.

--- src/resmom/freebsd/mom_mach.c.orig  Tue Dec  4 16:38:48 2001
+++ src/resmom/freebsd/mom_mach.c       Wed Jan 15 21:04:15 2003
@@ -368,11 +368,21 @@
                        continue;
 
                nps++;
+#if __FreeBSD_version < 500000
                cputime += tvk(pp->kp_proc.p_rtime);
-
-               if (pp->kp_proc.p_ru == NULL) {
+#else
+               cputime += tvk(pp->ki_runtime);
+#endif
+
+#if __FreeBSD_version < 500000
+               if (pp->kp_proc.p_ru == NULL)
+#else
+               if (&pp->ki_rusage == NULL)
+#endif
+                 {
                        struct  pstats  ps;
 
+#if __FreeBSD_version < 500000
                        DBPRT(("%s: p_stats 0x%lx\n", id,
                                (u_long)pp->kp_proc.p_stats))
                        if (pp->kp_proc.p_stats == NULL)
@@ -387,10 +397,27 @@
                                tv(ps.p_ru.ru_stime) +
                                tv(ps.p_cru.ru_utime) +
                                tv(ps.p_cru.ru_stime);
+#else
+                       DBPRT(("%s: p_stats 0x%lx\n", id,
+                               (u_long)pp->ki_user->u_stats))
+                       if (&pp->ki_addr->u_stats == NULL)
+                               continue;
+
+                       if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+                                       sizeof(ps)) != sizeof(ps)) {
+                               log_err(errno, id, "kvm_read(u_stats)");
+                               continue;
+                       }
+                       cputime += tv(ps.p_ru.ru_utime) +
+                               tv(ps.p_ru.ru_stime) +
+                               tv(ps.p_cru.ru_utime) +
+                               tv(ps.p_cru.ru_stime);
+#endif
                }
                else {
                        struct  rusage  ru;
 
+#if __FreeBSD_version < 500000
                        DBPRT(("%s: p_ru 0x%lx\n", id,
                                (u_long)pp->kp_proc.p_ru))
                        if (kvm_read(kd, (u_long)pp->kp_proc.p_ru, &ru,
@@ -402,6 +429,19 @@
                }
                DBPRT(("%s: ses %d pid %d cputime %d\n", id,
                                sess_tbl[i], pp->kp_proc.p_pid, cputime))
+#else
+                       DBPRT(("%s: p_ru 0x%lx\n", id,
+                               (u_long)pp->ki_rusage))
+                       if (kvm_read(kd, (u_long)&pp->ki_rusage, &ru,
+                                       sizeof(ru)) != sizeof(ru)) {
+                               log_err(errno, id, "kvm_read(session)");
+                               continue;
+                       }
+                       cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
+               }
+               DBPRT(("%s: ses %d pid %d cputime %d\n", id,
+                               sess_tbl[i], pp->ki_pid, cputime))
+#endif
        }
 
        if (nps == 0)
@@ -429,12 +469,19 @@
 
                if (!injob(pjob, sess_tbl[i]))
                        continue;
-
+#if __FreeBSD_version < 500000
                memsize += ctob(pp->kp_eproc.e_vm.vm_tsize +
                        pp->kp_eproc.e_vm.vm_dsize +
                        pp->kp_eproc.e_vm.vm_ssize);
                DBPRT(("%s: ses %d pid=%d totmem=%lu\n", id,
                       sess_tbl[i], pp->kp_proc.p_pid, memsize))
+#else
+               memsize += ctob(pp->ki_tsize +
+                       pp->ki_dsize +
+                       pp->ki_ssize);
+               DBPRT(("%s: ses %d pid=%d totmem=%lu\n", id,
+                      sess_tbl[i], pp->ki_pid, memsize))
+#endif
        }
 
        return (memsize);
@@ -457,10 +504,17 @@
                if (!injob(pjob, sess_tbl[i]))
                        continue;
 
+#if __FreeBSD_version < 500000
                memsize += ctob(pp->kp_eproc.e_vm.vm_rssize);
                DBPRT(("%s: pid=%d ses=%d mem=%d totmem=%d\n", id,
                        pp->kp_proc.p_pid, sess_tbl[i],
                        pp->kp_eproc.e_vm.vm_rssize, memsize))
+#else
+               memsize += ctob(pp->ki_rssize);
+               DBPRT(("%s: pid=%d ses=%d mem=%d totmem=%d\n", id,
+                       pp->ki_pid, sess_tbl[i],
+                       pp->ki_rssize, memsize))
+#endif
        }
 
        return (memsize);
@@ -481,10 +535,18 @@
                if (!injob(pjob, sess_tbl[i]))
                        continue;
 
+#if __FreeBSD_version < 500000
                if (ctob(pp->kp_eproc.e_vm.vm_tsize +
                                pp->kp_eproc.e_vm.vm_dsize +
                                pp->kp_eproc.e_vm.vm_ssize) > limit)
                        return (TRUE);
+#else
+               if (ctob(pp->ki_tsize +
+                               pp->ki_dsize +
+                               pp->ki_ssize) > limit)
+                       return (TRUE);
+#endif
+
        }
 
        return (FALSE);
@@ -722,7 +784,12 @@
     struct     kinfo_proc      *a;
     struct     kinfo_proc      *b;
 {
+#if __FreeBSD_version < 500000
        return((int)a->kp_eproc.e_paddr - (int)b->kp_eproc.e_paddr);
+#else
+       return((int)a->ki_paddr - (int)b->ki_paddr);
+#endif
+
 }
 
 int
@@ -730,7 +797,12 @@
     struct     session         *key;
     struct     kinfo_proc      *member;
 {
+
+#if __FreeBSD_version < 500000
        return((int)key->s_leader - (int)member->kp_eproc.e_paddr);
+#else
+       return((int)key->s_leader - (int)member->ki_paddr);
+#endif
 }
 
 /*
@@ -775,13 +847,20 @@
        qsort(proc_tbl, nproc, sizeof(struct kinfo_proc), qs_cmp);
 
        for (i=0, kp=proc_tbl; i<nproc; i++, kp++) {
+#if __FreeBSD_version < 500000
                if (kvm_read(kd, (u_long)kp->kp_eproc.e_sess, &ss, sizeof(ss))
-                               != sizeof(ss)) {
+                               != sizeof(ss))
+#else
+               if (kvm_read(kd, (u_long)kp->ki_paddr->p_pgrp->pg_session, &ss, 
sizeof(ss))
+                               != sizeof(ss))
+#endif
+                 {
                        sprintf(log_buffer,
                                "kvm_read: %s", kvm_geterr(kd));
                        log_err(errno, id, log_buffer);
                        return (PBSE_SYSTEM);
                }
+#if __FreeBSD_version < 500000
                if (ss.s_leader == kp->kp_eproc.e_paddr ||
                                ss.s_leader == NULL) {
                        sid = kp->kp_proc.p_pid;
@@ -791,6 +870,17 @@
                                sizeof(struct kinfo_proc), bs_cmp);
                        sid = leader ? leader->kp_proc.p_pid : 0;
                }
+#else
+               if (ss.s_leader == kp->ki_paddr ||
+                               ss.s_leader == NULL) {
+                       sid = kp->ki_pid;
+               }
+               else {
+                       leader = bsearch(&ss, proc_tbl, nproc,
+                               sizeof(struct kinfo_proc), bs_cmp);
+                       sid = leader ? leader->ki_pid : 0;
+               }
+#endif
                sess_tbl[i] = sid;
        }
 
@@ -995,9 +1085,16 @@
                if (sesid != sess_tbl[i])
                        continue;
 
+#if __FreeBSD_version < 500000
                DBPRT(("%s: send signal %d to pid %d\n", id,
                                sig, pp->kp_proc.p_pid))
                (void)kill(pp->kp_proc.p_pid, sig);
+#else
+               DBPRT(("%s: send signal %d to pid %d\n", id,
+                               sig, pp->ki_pid))
+               (void)kill(pp->ki_pid, sig);
+
+#endif
                ++ct;
        }
        return ct;
@@ -1102,8 +1199,13 @@
                if (jobid != sess_tbl[i])
                        continue;
 
+#if __FreeBSD_version < 500000
                cputime += tvk(pp->kp_proc.p_rtime);
+#else
+
+#endif
 
+#if __FreeBSD_version < 500000
                if (pp->kp_proc.p_ru == NULL) {
                        struct  pstats  ps;
 
@@ -1132,6 +1234,36 @@
                }
                DBPRT(("%s: ses %d pid %d cputime %d\n", id,
                                jobid, pp->kp_proc.p_pid, cputime))
+#else
+               if (&pp->ki_rusage == NULL) {
+                       struct  pstats  ps;
+
+                       if (&pp->ki_addr->u_stats == NULL)
+                               continue;
+
+                       if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+                                       sizeof(ps)) != sizeof(ps)) {
+                               log_err(errno, id, "kvm_read(u_stats)");
+                               continue;
+                       }
+                       cputime += tv(ps.p_ru.ru_utime) +
+                               tv(ps.p_ru.ru_stime) +
+                               tv(ps.p_cru.ru_utime) +
+                               tv(ps.p_cru.ru_stime);
+               }
+               else {
+                       struct  rusage  ru;
+
+                       if (kvm_read(kd, (u_long)pp->ki_paddr->p_ru, &ru,
+                                       sizeof(ru)) != sizeof(ru)) {
+                               log_err(errno, id, "kvm_read(session)");
+                               continue;
+                       }
+                       cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
+               }
+               DBPRT(("%s: ses %d pid %d cputime %d\n", id,
+                               jobid, pp->ki_pid, cputime))
+#endif
 
        }
 
@@ -1150,6 +1282,7 @@
        for (i=0; i<nproc; i++) {
                struct kinfo_proc       *pp = &proc_tbl[i];
 
+#if __FreeBSD_version < 500000
                if (pid != pp->kp_proc.p_pid)
                        continue;
 
@@ -1180,9 +1313,41 @@
                                break;
                        }
                        cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
-               }
                DBPRT(("%s: pid %d cputime %d\n", id, pid, cputime))
+#else
+               if (pid != pp->ki_pid)
+                       continue;
+
+               cputime = tvk(pp->ki_runtime);
+
+               if (&pp->ki_rusage == NULL) {
+                       struct  pstats  ps;
+
+                       if (&pp->ki_addr->u_stats == NULL)
+                               break;
 
+                       if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+                                       sizeof(ps)) != sizeof(ps)) {
+                               log_err(errno, id, "kvm_read(u_stats)");
+                               break;
+                       }
+                       cputime += tv(ps.p_ru.ru_utime) +
+                               tv(ps.p_ru.ru_stime) +
+                               tv(ps.p_cru.ru_utime) +
+                               tv(ps.p_cru.ru_stime);
+               }
+               else {
+                       struct  rusage  ru;
+
+                       if (kvm_read(kd, (u_long)&pp->ki_rusage, &ru,
+                                       sizeof(ru)) != sizeof(ru)) {
+                               log_err(errno, id, "kvm_read(session)");
+                               break;
+                       }
+                       cputime += tv(ru.ru_utime) + tv(ru.ru_stime);
+               }
+#endif
+               DBPRT(("%s: pid %d cputime %d\n", id, pid, cputime))
                sprintf(ret_string, "%.2f", (double)cputime * cputfactor);
                return ret_string;
        }
@@ -1245,9 +1410,16 @@
                        continue;
 
                found = 1;
+
+#if __FreeBSD_version < 500000
                addmem = pp->kp_eproc.e_vm.vm_tsize +
                                pp->kp_eproc.e_vm.vm_dsize +
                                pp->kp_eproc.e_vm.vm_ssize;
+#else
+               addmem = pp->ki_tsize +
+                               pp->ki_dsize +
+                               pp->ki_ssize;
+#endif
                memsize += addmem;
        }
        if (found) {
@@ -1273,12 +1445,24 @@
        for (i=0; i<nproc; i++) {
                struct kinfo_proc       *pp = &proc_tbl[i];
 
+#if __FreeBSD_version < 500000
                if (pid != pp->kp_proc.p_pid)
                        continue;
+#else
+               if (pid != pp->ki_pid)
+                       continue;
+#endif
 
+
+#if __FreeBSD_version < 500000
                memsize = pp->kp_eproc.e_vm.vm_tsize +
                                pp->kp_eproc.e_vm.vm_dsize +
                                pp->kp_eproc.e_vm.vm_ssize;
+#else
+               memsize = pp->ki_tsize +
+                               pp->ki_dsize +
+                               pp->ki_ssize;
+#endif
                sprintf(ret_string, "%ukb", ctob(memsize) >> 10); /* KB */
                return ret_string;
        }
@@ -1342,7 +1526,11 @@
                        continue;
 
                found = 1;
+#if __FreeBSD_version < 500000
                resisize += pp->kp_eproc.e_vm.vm_rssize;
+#else
+               resisize += pp->ki_rssize;
+#endif
        }
        if (found) {
                sprintf(ret_string, "%ukb", ctob(resisize) >> 10); /* KB */
@@ -1369,10 +1557,19 @@
        for (i=0; i<nproc; i++) {
                struct kinfo_proc       *pp = &proc_tbl[i];
 
+#if __FreeBSD_version < 500000
                if (pid != pp->kp_proc.p_pid)
                        continue;
+#else
+               if (pid != pp->ki_pid)
+                       continue;
+#endif
 
+#if __FreeBSD_version < 500000
                resisize = pp->kp_eproc.e_vm.vm_rssize;
+#else
+               resisize = pp->ki_rssize;
+#endif
                sprintf(ret_string, "%ukb", ctob(resisize) >> 10); /* KB */
                return ret_string;
        }
@@ -1446,12 +1643,22 @@
        for (i=0; i<nproc; i++) {
                struct kinfo_proc       *pp = &proc_tbl[i];
 
+#if __FreeBSD_version < 500000
                if (pp->kp_eproc.e_pcred.p_ruid == 0)
                        continue;
+#else
+               if (pp->ki_ruid == 0)
+                       continue;
+#endif
 
                jobid = sess_tbl[i];
+#if __FreeBSD_version < 500000
                DBPRT(("%s: pid %d sid %u\n",
                       id, (int)pp->kp_proc.p_pid, jobid))
+#else
+               DBPRT(("%s: pid %d sid %u\n",
+                      id, (int)pp->ki_pid, jobid))
+#endif
                for (j=0; j<njids; j++) {
                        if (jids[j] == jobid)
                                break;
@@ -1531,13 +1738,22 @@
        for (i=0; i<nproc; i++) {
                struct kinfo_proc       *pp = &proc_tbl[i];
 
+#if __FreeBSD_version < 500000
                DBPRT(("%s[%d]: pid %d sid %u\n",
                       id, num_pids, pp->kp_proc.p_pid, sess_tbl[i]))
+#else
+               DBPRT(("%s[%d]: pid %d sid %u\n",
+                      id, num_pids, pp->ki_pid, sess_tbl[i]))
+#endif
                if (jobid != sess_tbl[i])
                        continue;
 
                checkret(&fmt, 100);
+#if __FreeBSD_version < 500000
                sprintf(fmt, " %d", pp->kp_proc.p_pid);
+#else
+               sprintf(fmt, " %d", pp->ki_pid);
+#endif
                fmt += strlen(fmt);
                num_pids++;
        }
@@ -1575,11 +1791,20 @@
        for (i=0; i<nproc; i++) {
                struct kinfo_proc       *pp = &proc_tbl[i];
 
+#if __FreeBSD_version < 500000
                if ((uid = pp->kp_eproc.e_pcred.p_ruid) == 0)
                        continue;
 
                DBPRT(("%s: pid %d uid %u\n",
                       id, (int)pp->kp_proc.p_pid, uid))
+#else
+               if ((uid = pp->ki_ruid) == 0)
+                       continue;
+
+               DBPRT(("%s: pid %d uid %u\n",
+                      id, (int)pp->ki_pid, uid))
+#endif
+
                for (j=0; j<nuids; j++) {
                        if (uids[j] == uid)
                                break;
@@ -1842,10 +2067,16 @@
                                continue;
                }
                else {
+#if __FreeBSD_version < 500000
                        if (value != pp->kp_proc.p_pid)
                                continue;
+#else
+                       if (value != pp->ki_pid)
+                               continue;
+#endif
                }
 
+#if __FreeBSD_version < 500000
                if (pp->kp_proc.p_stats == NULL) {
                        rm_errno = RM_ERR_SYSTEM;
                        return NULL;
@@ -1857,6 +2088,19 @@
                        rm_errno = RM_ERR_SYSTEM;
                        return NULL;
                }
+#else
+               if (&pp->ki_addr->u_stats == NULL) {
+                       rm_errno = RM_ERR_SYSTEM;
+                       return NULL;
+               }
+
+               if (kvm_read(kd, (u_long)&pp->ki_addr->u_stats, &ps,
+                               sizeof(ps)) != sizeof(ps)) {
+                       log_err(errno, id, "kvm_read(u_stats)");
+                       rm_errno = RM_ERR_SYSTEM;
+                       return NULL;
+               }
+#endif
                found = 1;
                start = MIN(start, ps.p_start.tv_sec);
        }

Attachment: pgp00000.pgp
Description: PGP signature

Reply via email to