X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fswap.c;h=de9b5f3de430ef08fa034df37aae168a9e0f1057;hb=bf90793e82989b1c36fe8f3b66b9c9fe05c9532d;hp=b8b5f09830629e57dd34c80b739a38e0e7e6cee3;hpb=bc7992ed0693313a2b1fe282a5bf23f1cc9f8e42;p=collectd.git diff --git a/src/swap.c b/src/swap.c index b8b5f098..de9b5f3d 100644 --- a/src/swap.c +++ b/src/swap.c @@ -1,6 +1,6 @@ /** * collectd - src/swap.c - * Copyright (C) 2005-2007 Florian octo Forster + * Copyright (C) 2005-2009 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -19,6 +19,16 @@ * Florian octo Forster **/ +#if HAVE_CONFIG_H +# include "config.h" +# undef HAVE_CONFIG_H +#endif +/* avoid swap.h error "Cannot use swapctl in the large files compilation environment" */ +#if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64 +# undef _FILE_OFFSET_BITS +# undef _LARGEFILE64_SOURCE +#endif + #include "collectd.h" #include "common.h" #include "plugin.h" @@ -26,12 +36,18 @@ #if HAVE_SYS_SWAP_H # include #endif +#if HAVE_VM_ANON_H +# include +#endif #if HAVE_SYS_PARAM_H # include #endif #if HAVE_SYS_SYSCTL_H # include #endif +#if HAVE_SYS_DKSTAT_H +# include +#endif #if HAVE_KVM_H # include #endif @@ -52,6 +68,10 @@ static unsigned long long pagesize; static kstat_t *ksp; /* #endif HAVE_LIBKSTAT */ +#elif HAVE_SWAPCTL +/* No global variables */ +/* #endif HAVE_SWAPCTL */ + #elif defined(VM_SWAPUSAGE) /* No global variables */ /* #endif defined(VM_SWAPUSAGE) */ @@ -82,6 +102,10 @@ static int swap_init (void) ksp = NULL; /* #endif HAVE_LIBKSTAT */ +#elif HAVE_SWAPCTL + /* No init stuff */ +/* #endif HAVE_SWAPCTL */ + #elif defined(VM_SWAPUSAGE) /* No init stuff */ /* #endif defined(VM_SWAPUSAGE) */ @@ -239,6 +263,84 @@ static int swap_read (void) swap_submit ("reserved", swap_resv); /* #endif HAVE_LIBKSTAT */ +#elif HAVE_SWAPCTL + struct swapent *swap_entries; + int swap_num; + int status; + int i; + + uint64_t used = 0; + uint64_t total = 0; + + /* + * XXX: This is the syntax for the *BSD `swapctl', which has the + * following prototype: + * swapctl (int cmd, void *arg, int misc); + * + * HP-UX and Solaris (and possibly other UNIXes) provide `swapctl', + * too, but with the following prototype: + * swapctl (int cmd, void *arg); + * + * Solaris is usually handled in the KSTAT case above. For other UNIXes + * a separate case for the other version of `swapctl' may be necessary. + */ + swap_num = swapctl (SWAP_NSWAP, NULL, 0); + if (swap_num < 0) + { + ERROR ("swap plugin: swapctl (SWAP_NSWAP) failed with status %i.", + swap_num); + return (-1); + } + else if (swap_num == 0) + return (0); + + swap_entries = calloc (swap_num, sizeof (*swap_entries)); + if (swap_entries == NULL) + { + ERROR ("swap plugin: calloc failed."); + return (-1); + } + + status = swapctl (SWAP_STATS, swap_entries, swap_num); + if (status != swap_num) + { + ERROR ("swap plugin: swapctl (SWAP_STATS) failed with status %i.", + status); + sfree (swap_entries); + return (-1); + } + +#if defined(DEV_BSIZE) && (DEV_BSIZE > 0) +# define C_SWAP_BLOCK_SIZE ((uint64_t) DEV_BSIZE) +#else +# define C_SWAP_BLOCK_SIZE ((uint64_t) 512) +#endif + + for (i = 0; i < swap_num; i++) + { + if ((swap_entries[i].se_flags & SWF_ENABLE) == 0) + continue; + + used += ((uint64_t) swap_entries[i].se_inuse) + * C_SWAP_BLOCK_SIZE; + total += ((uint64_t) swap_entries[i].se_nblks) + * C_SWAP_BLOCK_SIZE; + } + + if (total < used) + { + ERROR ("swap plugin: Total swap space (%"PRIu64") " + "is less than used swap space (%"PRIu64").", + total, used); + return (-1); + } + + swap_submit ("used", (gauge_t) used); + swap_submit ("free", (gauge_t) (total - used)); + + sfree (swap_entries); +/* #endif HAVE_SWAPCTL */ + #elif defined(VM_SWAPUSAGE) int mib[3]; size_t mib_len;