From 46c9f6ebeb2dbeddcccc0aa58561ff89c1c8a22b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Dejean?= Date: Sat, 24 Jun 2006 17:16:53 +0000 Subject: [PATCH] Don't use kvm anymore. Patch by hua.zhang@sun.com. Closes #345811. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2006-06-24 Benoît Dejean * msg_limits.c: (glibtop_init_msg_limits_p), (glibtop_get_msg_limits_p): * open_suid.c: (glibtop_open_p): * sem_limits.c: (glibtop_init_sem_limits_p), (glibtop_get_sem_limits_p): * shm_limits.c: (glibtop_init_shm_limits_p), (glibtop_get_shm_limits_p): Don't use kvm anymore. Patch by hua.zhang@sun.com. Closes #345811. --- sysdeps/solaris/ChangeLog | 14 ++++++++++ sysdeps/solaris/msg_limits.c | 54 +++++++++++++++++++++++++++++++----- sysdeps/solaris/open_suid.c | 4 +++ sysdeps/solaris/sem_limits.c | 48 ++++++++++++++++++++++++++++---- sysdeps/solaris/shm_limits.c | 41 +++++++++++++++++++++++---- 5 files changed, 142 insertions(+), 19 deletions(-) diff --git a/sysdeps/solaris/ChangeLog b/sysdeps/solaris/ChangeLog index 8ee05f4e..2887769f 100644 --- a/sysdeps/solaris/ChangeLog +++ b/sysdeps/solaris/ChangeLog @@ -1,3 +1,17 @@ +2006-06-24 Benoît Dejean + + * msg_limits.c: (glibtop_init_msg_limits_p), + (glibtop_get_msg_limits_p): + * open_suid.c: (glibtop_open_p): + * sem_limits.c: (glibtop_init_sem_limits_p), + (glibtop_get_sem_limits_p): + * shm_limits.c: (glibtop_init_shm_limits_p), + (glibtop_get_shm_limits_p): + + Don't use kvm anymore. + Patch by hua.zhang@sun.com. + Closes #345811. + 2005-08-12 Benoît Dejean * glibtop_server.h: diff --git a/sysdeps/solaris/msg_limits.c b/sysdeps/solaris/msg_limits.c index 51719038..b943fdfe 100644 --- a/sysdeps/solaris/msg_limits.c +++ b/sysdeps/solaris/msg_limits.c @@ -26,28 +26,37 @@ #include #include +#include #include -static const struct nlist nlst[] = { {"msginfo"}, {NULL} }; +static const struct nlist nlst[] = { {"glibtop_msg_limits"}, {NULL} }; +#if GLIBTOP_SOLARIS_RELEASE < 51000 static const unsigned long _glibtop_sysdeps_msg_limits = -#if GLIBTOP_SOLARIS_RELEASE <= 570 +#if GLIBTOP_SOLARIS_RELEASE <= 50700 (1L << GLIBTOP_IPC_MSGMAP) + (1L << GLIBTOP_IPC_MSGSSZ) + #endif (1L << GLIBTOP_IPC_MSGPOOL) + (1L << GLIBTOP_IPC_MSGMAX) + (1L << GLIBTOP_IPC_MSGMNB) + (1L << GLIBTOP_IPC_MSGMNI) + (1L << GLIBTOP_IPC_MSGTQL); +#else +static const unsigned long _glibtop_sysdeps_msg_limits = 0; +#endif + /* Init function. */ void glibtop_init_msg_limits_p (glibtop *server) { +#if GLIBTOP_SOLARIS_RELEASE < 51000 + kvm_t *kd = server->machine.kd; if(kd && !kvm_nlist(kd, nlst)) server->sysdeps.msg_limits = _glibtop_sysdeps_msg_limits; else server->sysdeps.msg_limits = 0; +#endif } /* Provides information about sysv ipc limits. */ @@ -55,18 +64,22 @@ glibtop_init_msg_limits_p (glibtop *server) void glibtop_get_msg_limits_p (glibtop *server, glibtop_msg_limits *buf) { +#if GLIBTOP_SOLARIS_RELEASE < 51000 + kvm_t *kd = server->machine.kd; - struct msginfo minfo; + glibtop_msg_limits minfo; + memset (buf, 0, sizeof (glibtop_msg_limits)); if(!(server->sysdeps.msg_limits)) return; if(kvm_read(kd, nlst[0].n_value, (void *)&minfo, - sizeof(struct msginfo)) != sizeof(struct msginfo)) + sizeof(glibtop_msg_limits)) != sizeof(glibtop_msg_limits)) + return; -#if GLIBTOP_SOLARIS_RELEASE <= 570 +#if GLIBTOP_SOLARIS_RELEASE <= 50700 /* These fields don't exist anymore in Solaris 8. * Thanks to Laszlo PETER . */ buf->msgmap = minfo.msgmap; @@ -76,6 +89,33 @@ glibtop_get_msg_limits_p (glibtop *server, glibtop_msg_limits *buf) buf->msgmnb = minfo.msgmnb; buf->msgmni = minfo.msgmni; buf->msgtql = minfo.msgtql; - buf->msgpool = minfo.msgmni * minfo.msgmnb >> 10; - buf->flags = _glibtop_sysdeps_msg_limits; +#endif +#if GLIBTOP_SOLARIS_RELEASE >= 51000 + rctlblk_t *rblk; + if ((rblk = malloc(rctlblk_size())) == NULL) + return; + + if (getrctl("project.max-msg-qbytes", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->msgmnb = rctlblk_get_value(rblk); + + if (getrctl("project.max-msg-ids", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->msgmni = rctlblk_get_value(rblk); + + if (getrctl("project.max-msg-messages", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->msgtql = rctlblk_get_value(rblk); + /* this is the maximum size of a system V message, which has been obsoleted as a kernel tunable value now */ + /* and it should always be 65535 instead, so I list it here, if needed, can be removed */ + buf->msgmax = 65535; + +#endif + + buf->msgpool = buf->msgmni * buf->msgmnb >> 10; + buf->flags = _glibtop_sysdeps_msg_limits; + } diff --git a/sysdeps/solaris/open_suid.c b/sysdeps/solaris/open_suid.c index d9a5306c..e6cdbd60 100644 --- a/sysdeps/solaris/open_suid.c +++ b/sysdeps/solaris/open_suid.c @@ -69,9 +69,13 @@ glibtop_open_p (glibtop *server, const char *program_name, server->machine.gid = getgid (); server->machine.egid = getegid (); +#if GLIBTOP_SOLARIS_RELEASE < 51000 + server->machine.kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL); if(!server->machine.kd) glibtop_warn_io_r(server, "kvm_open()"); + +#endif /* Drop priviledges; we only become root when necessary. diff --git a/sysdeps/solaris/sem_limits.c b/sysdeps/solaris/sem_limits.c index d48892da..4367c046 100644 --- a/sysdeps/solaris/sem_limits.c +++ b/sysdeps/solaris/sem_limits.c @@ -26,11 +26,13 @@ #include #include +#include #include -static const struct nlist nlst[] = { {"seminfo"}, {NULL} }; +static const struct nlist nlst[] = { {"glibtop_sem_limits"}, {NULL} }; +#if GLIBTOP_SOLARIS_RELEASE < 51000 static const unsigned long _glibtop_sysdeps_sem_limits = -#if GLIBTOP_SOLARIS_RELEASE <= 570 +#if GLIBTOP_SOLARIS_RELEASE <= 50700 (1L << GLIBTOP_IPC_SEMMAP) + #endif (1L << GLIBTOP_IPC_SEMMNI) + (1L << GLIBTOP_IPC_SEMMNS) + @@ -38,18 +40,25 @@ static const unsigned long _glibtop_sysdeps_sem_limits = (1L << GLIBTOP_IPC_SEMOPM) + (1L << GLIBTOP_IPC_SEMUME) + (1L << GLIBTOP_IPC_SEMUSZ) + (1L << GLIBTOP_IPC_SEMVMX) + (1L << GLIBTOP_IPC_SEMAEM); +#else +static const unsigned long _glibtop_sysdeps_sem_limits = 0; +#endif + /* Init function. */ void glibtop_init_sem_limits_p (glibtop *server) { +#if GLIBTOP_SOLARIS_RELEASE < 51000 + kvm_t *kd = server->machine.kd; if(kd && !kvm_nlist(kd, nlst)) server->sysdeps.sem_limits = _glibtop_sysdeps_sem_limits; else server->sysdeps.sem_limits = 0; +#endif } /* Provides information about sysv sem limits. */ @@ -57,18 +66,20 @@ glibtop_init_sem_limits_p (glibtop *server) void glibtop_get_sem_limits_p (glibtop *server, glibtop_sem_limits *buf) { +#if GLIBTOP_SOLARIS_RELEASE < 51000 kvm_t *kd = server->machine.kd; - struct seminfo sinfo; + glibtop_sem_limits sinfo; memset (buf, 0, sizeof (glibtop_sem_limits)); if(!(server->sysdeps.sem_limits)) return; if(kvm_read(kd, nlst[0].n_value, (void *)&sinfo, - sizeof(struct seminfo)) != sizeof(struct seminfo)) + sizeof(glibtop_sem_limits)) != sizeof(glibtop_sem_limits)) + return; -#if GLIBTOP_SOLARIS_RELEASE <= 570 +#if GLIBTOP_SOLARIS_RELEASE <= 50700 /* This field don't exist anymore in Solaris 8. * Thanks to Laszlo PETER . */ buf->semmap = sinfo.semmap; @@ -82,5 +93,30 @@ glibtop_get_sem_limits_p (glibtop *server, glibtop_sem_limits *buf) buf->semusz = sinfo.semusz; buf->semvmx = sinfo.semvmx; buf->semaem = sinfo.semaem; - buf->flags = _glibtop_sysdeps_sem_limits; +#endif + +#if GLIBTOP_SOLARIS_RELEASE >= 51000 + rctlblk_t *rblk; + if ((rblk = malloc(rctlblk_size())) == NULL) + return; + + if (getrctl("process.max-sem-ops", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->semopm = rctlblk_get_value(rblk); + + if (getrctl("process.max-sem-nsems", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->semmsl = rctlblk_get_value(rblk); + + if (getrctl("project.max-sem-ids", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->semmni = rctlblk_get_value(rblk); + /* there are only 3 fields, the remaining ones have been obsoleted in S10 + and no longer have system-wide limits */ +#endif + buf->flags = _glibtop_sysdeps_sem_limits; + } diff --git a/sysdeps/solaris/shm_limits.c b/sysdeps/solaris/shm_limits.c index f009f390..4e7463bc 100644 --- a/sysdeps/solaris/shm_limits.c +++ b/sysdeps/solaris/shm_limits.c @@ -26,18 +26,23 @@ #include #include +#include #include -static const struct nlist nlst[] = { {"shminfo"}, {NULL} }; +static const struct nlist nlst[] = { {"glibtop_shm_limits"}, {NULL} }; -#if GLIBTOP_SOLARIS_RELEASE < 590 +#if GLIBTOP_SOLARIS_RELEASE >=51000 +static const unsigned long _glibtop_sysdeps_shm_limits = 0; +#else +# if GLIBTOP_SOLARIS_RELEASE < 50900 static const unsigned long _glibtop_sysdeps_shm_limits = (1L << GLIBTOP_IPC_SHMMAX) + (1L << GLIBTOP_IPC_SHMMIN); -#else +# else static const unsigned long _glibtop_sysdeps_shm_limits = (1L << GLIBTOP_IPC_SHMMAX) + (1L << GLIBTOP_IPC_SHMMIN) + (1L << GLIBTOP_IPC_SHMMNI) + (1L << GLIBTOP_IPC_SHMSEG); +# endif #endif /* Init function. */ @@ -45,12 +50,15 @@ static const unsigned long _glibtop_sysdeps_shm_limits = void glibtop_init_shm_limits_p (glibtop *server) { +#if GLIBTOP_SOLARIS_RELEASE < 51000 + kvm_t * const kd = server->machine.kd; if(kd && !kvm_nlist(kd, nlst)) server->sysdeps.shm_limits = _glibtop_sysdeps_shm_limits; else server->sysdeps.shm_limits = 0; +#endif } /* Provides information about sysv ipc limits. */ @@ -58,8 +66,11 @@ glibtop_init_shm_limits_p (glibtop *server) void glibtop_get_shm_limits_p (glibtop *server, glibtop_shm_limits *buf) { +#if GLIBTOP_SOLARIS_RELEASE < 51000 + kvm_t * const kd = server->machine.kd; - struct shminfo sinfo; + glibtop_shm_limits sinfo; + memset (buf, 0, sizeof (glibtop_shm_limits)); @@ -67,14 +78,32 @@ glibtop_get_shm_limits_p (glibtop *server, glibtop_shm_limits *buf) return; if(kvm_read(kd, nlst[0].n_value, (void *)&sinfo, - sizeof(struct shminfo)) != sizeof(struct shminfo)) + sizeof(glibtop_shm_limits)) != sizeof(glibtop_shm_limits)) + return; buf->shmmax = sinfo.shmmax; buf->shmmni = sinfo.shmmni; -#if GLIBTOP_SOLARIS_RELEASE < 590 +#if GLIBTOP_SOLARIS_RELEASE < 50900 buf->shmmin = sinfo.shmmin; buf->shmseg = sinfo.shmseg; +# endif +#endif +#if GLIBTOP_SOLARIS_RELEASE >= 51000 + rctlblk_t *rblk; + if ((rblk = malloc(rctlblk_size())) == NULL) + return; + + if (getrctl("project.max-shm-memory", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->shmmax = rctlblk_get_value(rblk); + + if (getrctl("project.max-shm-ids", NULL, rblk, RCTL_FIRST) == -1) + return; + else + buf->shmmni = rctlblk_get_value(rblk); + #endif buf->flags = _glibtop_sysdeps_shm_limits; }