public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: "Martin Liška" <mliska@suse.cz>
To: Florian Weimer <fweimer@redhat.com>
Cc: Andreas Schwab <schwab@linux-m68k.org>, libc-alpha@sourceware.org
Subject: Re: [PATCH] Use size_t for mallinfo fields.
Date: Wed, 8 Jul 2020 09:24:28 +0200	[thread overview]
Message-ID: <093814cf-0b7d-1011-08e7-4d5c3e56b423@suse.cz> (raw)
In-Reply-To: <87lfjvxv58.fsf@oldenburg2.str.redhat.com>

[-- Attachment #1: Type: text/plain, Size: 1787 bytes --]

On 7/7/20 4:22 PM, Florian Weimer wrote:
> * Martin Liška:
> 
>> On 7/7/20 3:49 PM, Florian Weimer wrote:
>>> * Martin Liška:
>>>
>>>> On 7/7/20 2:17 PM, Andreas Schwab wrote:
>>>>> On Jul 07 2020, Martin Liška wrote:
>>>>>
>>>>>> The current int type can easily overflow for allocation of more
>>>>>> than 4GB.
>>>>>>
>>>>>> The following patch changes that to size_t. I guess I need to adjust
>>>>>> the API version of the function, right?
>>>>>
>>>>> Not only that, it breaks the ABI of mallinfo.
>>>>
>>>> Sure, so what options do I have? I'm new to glibc so a hint would be
>>>> appreciated.
>>>
>>> We need to add a new function.  Symbol versioning does not work because
>>> mallinfo is interposed by alternative mallocs (tcmalloc, Address
>>> Sanitizer, etc.).  Without the new function name, the interposer does
>>> not know which ABI the application expects, so it's going to be quite
>>> messy.
> 
>> All right, am I closer with the suggested patch?
> 
> If what I wrote above is right (we'd first gather consensus around
> that), we should probably add struct mallinfo2 and mallinfo2, deprecate
> the original mallinfo function, and eventually remove them from the
> public API (turning the original mallinfo into a compatibility symbol).

All right, I'm sending patch for that.

> 
> I suppose it would make sense to raise this issue with the tcmalloc, tbb
> and Address Sanitizer people, to see if they would be willing to
> implement mallinfo2 on their end.

Once we're done I can file issues to all these to inform them.

Thoughts?
Martin

> 
> The end result, having mallinfo2 and not mallinfo, is a bit ugly, but
> it's an improvement over the current state.  I do not see a need to get
> creative with symbol redirects or symbol versions.
> 
> Thanks,
> Florian
> 


[-- Attachment #2: 0001-Add-mallinfo2-function-that-support-sizes-4GB.patch --]
[-- Type: text/x-patch, Size: 8176 bytes --]

From c2e2da55d722450b65051e641b4b19ac81741a93 Mon Sep 17 00:00:00 2001
From: Martin Liska <mliska@suse.cz>
Date: Tue, 7 Jul 2020 13:58:24 +0200
Subject: [PATCH] Add mallinfo2 function that support sizes >= 4GB.

The current int type can easily overflow for allocation of more
than 4GB.
---
 malloc/malloc.c    | 35 ++++++++++++++++++++++++++++++-----
 malloc/malloc.h    | 21 +++++++++++++++++++++
 manual/memory.texi | 36 ++++++++++++++++++------------------
 3 files changed, 69 insertions(+), 23 deletions(-)

diff --git a/malloc/malloc.c b/malloc/malloc.c
index ee87ddbbf9..560fee2c31 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -638,6 +638,8 @@ libc_hidden_proto (__libc_mallopt)
   be kept as longs, the reported values may wrap around zero and
   thus be inaccurate.
 */
+struct mallinfo2 __libc_mallinfo2(void);
+
 struct mallinfo __libc_mallinfo(void);
 
 
@@ -4911,7 +4913,7 @@ __malloc_usable_size (void *m)
  */
 
 static void
-int_mallinfo (mstate av, struct mallinfo *m)
+int_mallinfo (mstate av, struct mallinfo2 *m)
 {
   size_t i;
   mbinptr b;
@@ -4974,10 +4976,10 @@ int_mallinfo (mstate av, struct mallinfo *m)
 }
 
 
-struct mallinfo
-__libc_mallinfo (void)
+struct mallinfo2
+__libc_mallinfo2 (void)
 {
-  struct mallinfo m;
+  struct mallinfo2 m;
   mstate ar_ptr;
 
   if (__malloc_initialized < 0)
@@ -4998,6 +5000,27 @@ __libc_mallinfo (void)
   return m;
 }
 
+struct mallinfo
+__libc_mallinfo (void)
+{
+  struct mallinfo m;
+  struct mallinfo2 m2 = __libc_mallinfo2 ();
+
+  m.arena = m2.arena;
+  m.ordblks = m2.ordblks;
+  m.smblks = m2.smblks;
+  m.hblks = m2.hblks;
+  m.hblkhd = m2.hblkhd;
+  m.usmblks = m2.usmblks;
+  m.fsmblks = m2.fsmblks;
+  m.uordblks = m2.uordblks;
+  m.fordblks = m2.fordblks;
+  m.keepcost = m2.keepcost;
+
+  return m;
+}
+
+
 /*
    ------------------------------ malloc_stats ------------------------------
  */
@@ -5016,7 +5039,7 @@ __malloc_stats (void)
   stderr->_flags2 |= _IO_FLAGS2_NOTCANCEL;
   for (i = 0, ar_ptr = &main_arena;; i++)
     {
-      struct mallinfo mi;
+      struct mallinfo2 mi;
 
       memset (&mi, 0, sizeof (mi));
       __libc_lock_lock (ar_ptr->mutex);
@@ -5632,6 +5655,8 @@ strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
 strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
 strong_alias (__libc_mallinfo, __mallinfo)
 weak_alias (__libc_mallinfo, mallinfo)
+strong_alias (__libc_mallinfo2, __mallinfo2)
+weak_alias (__libc_mallinfo2, mallinfo2)
 strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
 
 weak_alias (__malloc_stats, malloc_stats)
diff --git a/malloc/malloc.h b/malloc/malloc.h
index a6903fdd54..e8b5c1d736 100644
--- a/malloc/malloc.h
+++ b/malloc/malloc.h
@@ -97,9 +97,30 @@ struct mallinfo
   int keepcost; /* top-most, releasable (via malloc_trim) space */
 };
 
+/* SVID2/XPG mallinfo2 structure which can handle allocations
+   bigger than 4GB.  */
+
+struct mallinfo2
+{
+  size_t arena;    /* non-mmapped space allocated from system */
+  size_t ordblks;  /* number of free chunks */
+  size_t smblks;   /* number of fastbin blocks */
+  size_t hblks;    /* number of mmapped regions */
+  size_t hblkhd;   /* space in mmapped regions */
+  size_t usmblks;  /* always 0, preserved for backwards compatibility */
+  size_t fsmblks;  /* space available in freed fastbin blocks */
+  size_t uordblks; /* total allocated space */
+  size_t fordblks; /* total free space */
+  size_t keepcost; /* top-most, releasable (via malloc_trim) space */
+};
+
 /* Returns a copy of the updated current mallinfo. */
+__MALLOC_DEPRECATED;
 extern struct mallinfo mallinfo (void) __THROW;
 
+/* Returns a copy of the updated current mallinfo. */
+extern struct mallinfo2 mallinfo2 (void) __THROW;
+
 /* SVID2/XPG mallopt options */
 #ifndef M_MXFAST
 # define M_MXFAST  1    /* maximum request size for "fastbins" */
diff --git a/manual/memory.texi b/manual/memory.texi
index aa5011e4f9..e5ea71bc6d 100644
--- a/manual/memory.texi
+++ b/manual/memory.texi
@@ -1505,50 +1505,50 @@ installing such hooks.
 
 @cindex allocation statistics
 You can get information about dynamic memory allocation by calling the
-@code{mallinfo} function.  This function and its associated data type
+@code{mallinfo2} function.  This function and its associated data type
 are declared in @file{malloc.h}; they are an extension of the standard
 SVID/XPG version.
 @pindex malloc.h
 
-@deftp {Data Type} {struct mallinfo}
+@deftp {Data Type} {struct mallinfo2}
 @standards{GNU, malloc.h}
 This structure type is used to return information about the dynamic
 memory allocator.  It contains the following members:
 
 @table @code
-@item int arena
+@item size_t arena
 This is the total size of memory allocated with @code{sbrk} by
 @code{malloc}, in bytes.
 
-@item int ordblks
+@item size_t ordblks
 This is the number of chunks not in use.  (The memory allocator
-internally gets chunks of memory from the operating system, and then
+size_ternally gets chunks of memory from the operating system, and then
 carves them up to satisfy individual @code{malloc} requests;
 @pxref{The GNU Allocator}.)
 
-@item int smblks
+@item size_t smblks
 This field is unused.
 
-@item int hblks
+@item size_t hblks
 This is the total number of chunks allocated with @code{mmap}.
 
-@item int hblkhd
+@item size_t hblkhd
 This is the total size of memory allocated with @code{mmap}, in bytes.
 
-@item int usmblks
+@item size_t usmblks
 This field is unused and always 0.
 
-@item int fsmblks
+@item size_t fsmblks
 This field is unused.
 
-@item int uordblks
+@item size_t uordblks
 This is the total size of memory occupied by chunks handed out by
 @code{malloc}.
 
-@item int fordblks
+@item size_t fordblks
 This is the total size of memory occupied by free (not in use) chunks.
 
-@item int keepcost
+@item size_t keepcost
 This is the size of the top-most releasable chunk that normally
 borders the end of the heap (i.e., the high end of the virtual address
 space's data segment).
@@ -1556,7 +1556,7 @@ space's data segment).
 @end table
 @end deftp
 
-@deftypefun {struct mallinfo} mallinfo (void)
+@deftypefun {struct mallinfo2} mallinfo2 (void)
 @standards{SVID, malloc.h}
 @safety{@prelim{}@mtunsafe{@mtuinit{} @mtasuconst{:mallopt}}@asunsafe{@asuinit{} @asulock{}}@acunsafe{@acuinit{} @aculock{}}}
 @c Accessing mp_.n_mmaps and mp_.max_mmapped_mem, modified with atomics
@@ -1564,7 +1564,7 @@ space's data segment).
 @c mark the statistics as unsafe, rather than the fast-path functions
 @c that collect the possibly inconsistent data.
 
-@c __libc_mallinfo @mtuinit @mtasuconst:mallopt @asuinit @asulock @aculock
+@c __libc_mallinfo2 @mtuinit @mtasuconst:mallopt @asuinit @asulock @aculock
 @c  ptmalloc_init (once) dup @mtsenv @asulock @aculock @acsfd @acsmem
 @c  mutex_lock dup @asulock @aculock
 @c  int_mallinfo @mtasuconst:mallopt [mp_ access on main_arena]
@@ -1577,7 +1577,7 @@ space's data segment).
 @c  mutex_unlock @aculock
 
 This function returns information about the current dynamic memory usage
-in a structure of type @code{struct mallinfo}.
+in a structure of type @code{struct mallinfo2}.
 @end deftypefun
 
 @node Summary of Malloc
@@ -1644,7 +1644,7 @@ A pointer to a function that @code{free} uses whenever it is called.
 A pointer to a function that @code{aligned_alloc}, @code{memalign},
 @code{posix_memalign} and @code{valloc} use whenever they are called.
 
-@item struct mallinfo mallinfo (void)
+@item struct mallinfo2 mallinfo2 (void)
 Return information about the current dynamic memory usage.
 @xref{Statistics of Malloc}.
 @end table
@@ -1970,7 +1970,7 @@ In addition, very old applications may use the obsolete @code{cfree}
 function.
 
 Further @code{malloc}-related functions such as @code{mallopt} or
-@code{mallinfo} will not have any effect or return incorrect statistics
+@code{mallinfo2} will not have any effect or return incorrect statistics
 when a replacement @code{malloc} is in use.  However, failure to replace
 these functions typically does not result in crashes or other incorrect
 application behavior, but may result in static linking failures.
-- 
2.27.0


  parent reply	other threads:[~2020-07-08  7:24 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-07 12:00 Martin Liška
2020-07-07 12:17 ` Andreas Schwab
2020-07-07 13:07   ` Martin Liška
2020-07-07 13:19     ` H.J. Lu
2020-07-07 13:49     ` Florian Weimer
2020-07-07 13:52       ` Martin Liška
2020-07-07 14:22         ` Florian Weimer
2020-07-07 14:32           ` Andreas Schwab
2020-07-07 14:36             ` Florian Weimer
2020-07-08  7:25               ` Martin Liška
2020-07-08  7:24           ` Martin Liška [this message]
2020-07-23 10:23             ` Martin Liška
2020-07-23 14:38             ` Szabolcs Nagy
2020-07-27 12:08               ` Martin Liška
2020-07-27 12:21                 ` Florian Weimer
2020-07-27 12:45                   ` Martin Liška
2020-08-11 12:26                     ` Martin Liška
2020-08-11 13:44                     ` Florian Weimer
2020-08-11 17:08                       ` DJ Delorie
2020-08-12 12:29                         ` Martin Liška
2020-08-24  9:55                           ` Martin Liška
2020-08-28 19:05                             ` DJ Delorie
2020-08-31 13:35                               ` H.J. Lu
2020-08-31 13:56                                 ` Adhemerval Zanella
2020-08-31 14:00                                   ` H.J. Lu
2020-08-31 14:10                                     ` Adhemerval Zanella
2020-09-01 17:26                               ` Joseph Myers
2020-09-02 13:19                                 ` Martin Liška
2020-09-02 13:34                                   ` Adhemerval Zanella
2020-09-02 14:00                                   ` Carlos O'Donell
2020-09-02 16:11                                   ` DJ Delorie
2020-09-21  8:49                                     ` Martin Liška
2020-09-02 20:16                                 ` DJ Delorie
2020-09-02 20:24                                   ` Florian Weimer
2020-09-02 21:04                                     ` [PATCH/v2] " DJ Delorie
2020-09-03 11:17                                       ` Adhemerval Zanella
2020-09-03 21:33                                         ` DJ Delorie
2020-09-17 23:02                                         ` DJ Delorie
2020-09-02 20:25                                   ` [PATCH] " Joseph Myers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=093814cf-0b7d-1011-08e7-4d5c3e56b423@suse.cz \
    --to=mliska@suse.cz \
    --cc=fweimer@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=schwab@linux-m68k.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).