On Wed, Oct 18, 2023 at 11:54:06AM +0200, Martijn van Duren wrote:
> This diff adds the two entries from the hrSWRunPerfTable:
> hrSWRunPerfCPU, and hrSWRunPerfMem. This allows snmptop from the
> net-snmp package to work. Math stolen^Wcopied from top/machine.c.
> 
> OK?

ok

> 
> martijn@
> 
> Index: mib.c
> ===================================================================
> RCS file: /cvs/src/libexec/snmpd/snmpd_metrics/mib.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 mib.c
> --- mib.c     4 Jul 2023 11:34:19 -0000       1.4
> +++ mib.c     18 Oct 2023 09:52:07 -0000
> @@ -69,6 +69,10 @@ struct event                connev;
>  const char           *agentxsocket = NULL;
>  int                   agentxfd = -1;
>  
> +int                   pageshift;
> +#define pagetok(size) ((size) << pageshift)
> +
> +void          pageshift_init(void);
>  void          snmp_connect(struct agentx *, void *, int);
>  void          snmp_tryconnect(int, short, void *);
>  void          snmp_read(int, short, void *);
> @@ -89,6 +93,7 @@ struct agentx_object *hrProcessorLoad;
>  struct agentx_index *hrSWRunIdx;
>  struct agentx_object *hrSWRunIndex, *hrSWRunName, *hrSWRunID, *hrSWRunPath;
>  struct agentx_object *hrSWRunParameters, *hrSWRunType, *hrSWRunStatus;
> +struct agentx_object *hrSWRunPerfCPU, *hrSWRunPerfMem;
>  
>  void  mib_hrsystemuptime(struct agentx_varbind *);
>  void  mib_hrsystemdate(struct agentx_varbind *);
> @@ -634,6 +639,7 @@ mib_hrswrun(struct agentx_varbind *vb)
>       struct agentx_object            *obj;
>       enum agentx_request_type         req;
>       int32_t                          idx;
> +     int32_t                          time;
>       struct kinfo_proc               *kinfo;
>       char                            *s;
>  
> @@ -711,6 +717,13 @@ mib_hrswrun(struct agentx_varbind *vb)
>                       agentx_varbind_integer(vb, 4);
>                       break;
>               }
> +     } else if (obj == hrSWRunPerfCPU) {
> +             time = kinfo->p_rtime_sec * 100;
> +             time += (kinfo->p_rtime_usec + 5000) / 10000;
> +             agentx_varbind_integer(vb, time);
> +     } else if (obj == hrSWRunPerfMem) {
> +             agentx_varbind_integer(vb, pagetok(kinfo->p_vm_tsize +
> +                 kinfo->p_vm_dsize + kinfo->p_vm_ssize));
>       } else
>               fatal("%s: Unexpected object", __func__);
>  }
> @@ -3278,6 +3291,7 @@ main(int argc, char *argv[])
>       kr_init();
>       pf_init();
>       timer_init();
> +     pageshift_init();
>  
>       if (agentxsocket != NULL) {
>               if (strlcpy(agentxsocketdir, agentxsocket,
> @@ -3375,6 +3389,10 @@ main(int argc, char *argv[])
>           (hrSWRunType = agentx_object(host, AGENTX_OID(HRSWRUNTYPE),
>           &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL ||
>           (hrSWRunStatus = agentx_object(host, AGENTX_OID(HRSWRUNSTATUS),
> +         &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL ||
> +         (hrSWRunPerfCPU = agentx_object(host, AGENTX_OID(HRSWRUNPERFCPU),
> +         &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL ||
> +         (hrSWRunPerfMem = agentx_object(host, AGENTX_OID(HRSWRUNPERFMEM),
>           &hrSWRunIdx, 1, 0, mib_hrswrun)) == NULL)
>               fatal("agentx_object");
>  
> @@ -4318,6 +4336,22 @@ main(int argc, char *argv[])
>       log_setverbose(verbose);
>  
>       event_dispatch();
> +}
> +
> +#define LOG1024               10
> +void
> +pageshift_init(void)
> +{
> +     long pagesize;
> +
> +     if ((pagesize = sysconf(_SC_PAGESIZE)) == -1)
> +             fatal("sysconf(_SC_PAGESIZE)");
> +     while (pagesize > 1) {
> +             pageshift++;
> +             pagesize >>= 1;
> +     }
> +     /* we only need the amount of log(2)1024 for our conversion */
> +     pageshift -= LOG1024;
>  }
>  
>  void
> 

Reply via email to