xfs_scrub: move to mallinfo2 when available
Starting with glibc 2.35, the mallinfo library call has finally been
upgraded to return 64-bit memory usage quantities. Migrate to the new
call, since it also warns about mallinfo being deprecated.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
diff --git a/configure.ac b/configure.ac
index e24fb0c..b87cf40 100644
--- a/configure.ac
+++ b/configure.ac
@@ -192,6 +192,7 @@
AC_HAVE_MAP_SYNC
AC_HAVE_DEVMAPPER
AC_HAVE_MALLINFO
+AC_HAVE_MALLINFO2
AC_PACKAGE_WANT_ATTRIBUTES_H
AC_HAVE_LIBATTR
if test "$enable_scrub" = "yes"; then
diff --git a/include/builddefs.in b/include/builddefs.in
index 626db21..e0a2f3c 100644
--- a/include/builddefs.in
+++ b/include/builddefs.in
@@ -115,6 +115,7 @@
HAVE_MAP_SYNC = @have_map_sync@
HAVE_DEVMAPPER = @have_devmapper@
HAVE_MALLINFO = @have_mallinfo@
+HAVE_MALLINFO2 = @have_mallinfo2@
HAVE_LIBATTR = @have_libattr@
HAVE_LIBICU = @have_libicu@
HAVE_OPENAT = @have_openat@
diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4
index adab9bb..8d05dc4 100644
--- a/m4/package_libcdev.m4
+++ b/m4/package_libcdev.m4
@@ -368,6 +368,24 @@
])
#
+# Check if we have a mallinfo2 libc call
+#
+AC_DEFUN([AC_HAVE_MALLINFO2],
+ [ AC_MSG_CHECKING([for mallinfo2 ])
+ AC_TRY_COMPILE([
+#include <malloc.h>
+ ], [
+ struct mallinfo2 test;
+
+ test.arena = 0; test.hblkhd = 0; test.uordblks = 0; test.fordblks = 0;
+ test = mallinfo2();
+ ], have_mallinfo2=yes
+ AC_MSG_RESULT(yes),
+ AC_MSG_RESULT(no))
+ AC_SUBST(have_mallinfo2)
+ ])
+
+#
# Check if we have a openat call
#
AC_DEFUN([AC_HAVE_OPENAT],
diff --git a/scrub/Makefile b/scrub/Makefile
index 74492fb..aba14ed 100644
--- a/scrub/Makefile
+++ b/scrub/Makefile
@@ -77,6 +77,10 @@
LCFLAGS += -DHAVE_MALLINFO
endif
+ifeq ($(HAVE_MALLINFO2),yes)
+LCFLAGS += -DHAVE_MALLINFO2
+endif
+
ifeq ($(HAVE_SYNCFS),yes)
LCFLAGS += -DHAVE_SYNCFS
endif
diff --git a/scrub/xfs_scrub.c b/scrub/xfs_scrub.c
index 41839c2..7a0411b 100644
--- a/scrub/xfs_scrub.c
+++ b/scrub/xfs_scrub.c
@@ -282,6 +282,34 @@
return error;
}
+static inline unsigned long long
+kbytes(unsigned long long x)
+{
+ return (x + 1023) / 1024;
+}
+
+static void
+report_mem_usage(
+ const char *phase,
+ const struct phase_rusage *pi)
+{
+#if defined(HAVE_MALLINFO2) || defined(HAVE_MALLINFO)
+# ifdef HAVE_MALLINFO2
+ struct mallinfo2 mall_now = mallinfo2();
+# else
+ struct mallinfo mall_now = mallinfo();
+# endif
+ fprintf(stdout, _("%sMemory used: %lluk/%lluk (%lluk/%lluk), "),
+ phase,
+ kbytes(mall_now.arena), kbytes(mall_now.hblkhd),
+ kbytes(mall_now.uordblks), kbytes(mall_now.fordblks));
+#else
+ fprintf(stdout, _("%sMemory used: %lluk, "),
+ phase,
+ kbytes(((char *) sbrk(0)) - ((char *) pi->brk_start)));
+#endif
+}
+
/* Report usage stats. */
static int
phase_end(
@@ -289,9 +317,6 @@
unsigned int phase)
{
struct rusage ruse_now;
-#ifdef HAVE_MALLINFO
- struct mallinfo mall_now;
-#endif
struct timeval time_now;
char phasebuf[DESCR_BUFSZ];
double dt;
@@ -323,21 +348,7 @@
else
phasebuf[0] = 0;
-#define kbytes(x) (((unsigned long)(x) + 1023) / 1024)
-#ifdef HAVE_MALLINFO
-
- mall_now = mallinfo();
- fprintf(stdout, _("%sMemory used: %luk/%luk (%luk/%luk), "),
- phasebuf,
- kbytes(mall_now.arena), kbytes(mall_now.hblkhd),
- kbytes(mall_now.uordblks), kbytes(mall_now.fordblks));
-#else
- fprintf(stdout, _("%sMemory used: %luk, "),
- phasebuf,
- (unsigned long) kbytes(((char *) sbrk(0)) -
- ((char *) pi->brk_start)));
-#endif
-#undef kbytes
+ report_mem_usage(phasebuf, pi);
fprintf(stdout, _("time: %5.2f/%5.2f/%5.2fs\n"),
timeval_subtract(&time_now, &pi->time),