mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: musl@lists.openwall.com
Subject: Re: Stdio resource usage
Date: Tue, 19 Feb 2019 21:43:13 -0500	[thread overview]
Message-ID: <20190220024313.GA23599@brightrain.aerifal.cx> (raw)
In-Reply-To: <CANmYxDvCe7o8Xy0A1nyx=RqCnLt6ERPBYrqH54ki0PzOtUyEWw@mail.gmail.com>

On Tue, Feb 19, 2019 at 03:34:52PM -0800, Nick Bray wrote:
> Other that compiler warnings, the main pain point I ran into porting a
> subset of Musl into a resource constrained environment was the resource
> usage of stdio.

For what it's worth, I think this is better described as "printf" than
"stdio". The rest of stdio is utterly tiny.

> I don't expect any of these modifications to make it
> upstream.  Talking out loud as a FYI / user feedback.  Also curious to see
> if there's any wisdom out there.
> 
> Stack usage of stdio was an issue.  On arm64, printf takes 8k of stack
> which is a rough when you only have 4-12k of stack.  This is because fmt_fp
> allocates stack space proportional O(log(MAX_LONG_DOUBLE)).  It also gets
> inlined into printf so you always take the hit.  (noinline fmt_fp is a

This is a known compiler flaw, hoisting large stack allocations, and
one I've complained a lot about but with little luck. It might be
possible to work around it by making the array a VLA, whose size is 1
or the proper size depending on some condition the compiler can't
easily see, but that's rather awful. It might be worth doing though,
given the lack of progress fixing the bug.

> Faustian bargain that makes stack usage worse in the worst case... hmmm.)
> On arm64, long double is defined as 128 bits, which not only increases
> stack size because of the larger mantisa, but also pulls in software
> emulation for fp128.  In terms of spec compliance, Musl is doing the right
> thing.  But as a practical matter, none of the programs I care about will
> ever use long double.  So my rough first pass was to reduce the max float
> size from long double to double.  In a later pass, I'll also add a knob to
> remove floating point formatting entirely.

It's kinda unfortunate that aarch64 defined long double as IEEE quad
without hardware implementation of it, but it's probably the right
future-facing choice. I was under the impression that aarch64 was
intended mostly for "large" systems, and that you'd use 32-bit arm
(with much smaller code due to thumb) for tiny space-constrained
systems, though.

> %m calls strerror which pulls in a string table, so removing support for %m
> lets static linking and DCE work its magic.

Yes. Note that %m is needed for a confirming syslog(), which was the
motivation for supporting it in printf.

> I also eliminated %n for
> security hardening reasons.

This actually introduces security bugs by breaking the contract. At
some point I believe there may even have been some parts of musl you
would have broken in dangerous ways, though I'm not sure if that's the
case now. If you have a situation where the format string is
non-constant, that, not %n, is the problem.

> The "states" structure is sparse and takes a little more memory than I'd
> like -  464b of rodata.  I don't see any workarounds without deeper
> changes, so for now I am living with it.

I think you'd have a hard time fitting the code to use a more
space-efficient data structure (e.g. binary search of a sorted
non-sparse table with pairs rather than just outputs) in less than the
size difference.

Rich


  reply	other threads:[~2019-02-20  2:43 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-19 23:34 Nick Bray
2019-02-20  2:43 ` Rich Felker [this message]
2019-02-20 10:49   ` Szabolcs Nagy
2019-02-20 15:47     ` Markus Wichmann
2019-02-20 16:37       ` Szabolcs Nagy
2019-02-20 17:13         ` Rich Felker
2019-02-20 18:34       ` A. Wilcox
2019-02-20 19:11         ` Markus Wichmann
2019-02-20 19:24           ` Rich Felker
2019-02-21 16:09             ` Markus Wichmann
2019-02-21 16:27               ` Jens Gustedt
2019-02-21 17:02               ` Rich Felker

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=20190220024313.GA23599@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

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 NNTP newsgroup(s).