• Rasmus Villemoes's avatar
    printf: add support for printing symbolic error names · 57f5677e
    Rasmus Villemoes authored
    It has been suggested several times to extend vsnprintf() to be able
    to convert the numeric value of ENOSPC to print "ENOSPC". This
    implements that as a %p extension: With %pe, one can do
    
      if (IS_ERR(foo)) {
        pr_err("Sorry, can't do that: %pe\n", foo);
        return PTR_ERR(foo);
      }
    
    instead of what is seen in quite a few places in the kernel:
    
      if (IS_ERR(foo)) {
        pr_err("Sorry, can't do that: %ld\n", PTR_ERR(foo));
        return PTR_ERR(foo);
      }
    
    If the value passed to %pe is an ERR_PTR, but the library function
    errname() added here doesn't know about the value, the value is simply
    printed in decimal. If the value passed to %pe is not an ERR_PTR, we
    treat it as an ordinary %p and thus print the hashed value (passing
    non-ERR_PTR values to %pe indicates a bug in the caller, but we can't
    do much about that).
    
    With my embedded hat on, and because it's not very invasive to do,
    I've made it possible to remove this. The errname() function and
    associated lookup tables take up about 3K. For most, that's probably
    quite acceptable and a price worth paying for more readable
    dmesg (once this starts getting used), while for those that disable
    printk() it's of very little use - I don't see a
    procfs/sysfs/seq_printf() file reasonably making use of this - and
    they clearly want to squeeze vmlinux as much as possible. Hence the
    default y if PRINTK.
    
    The symbols to include have been found by massaging the output of
    
      find arch include -iname 'errno*.h' | xargs grep -E 'define\s*E'
    
    In the cases where some common aliasing exists
    (e.g. EAGAIN=EWOULDBLOCK on all platforms, EDEADLOCK=EDEADLK on most),
    I've moved the more popular one (in terms of 'git grep -w Efoo | wc)
    to the bottom so that one takes precedence.
    
    Link: http://lkml.kernel.org/r/20191015190706.15989-1-linux@rasmusvillemoes.dk
    
    
    To: "Jonathan Corbet" <corbet@lwn.net>
    To: linux-kernel@vger.kernel.org
    Cc: "Andy Shevchenko" <andy.shevchenko@gmail.com>
    Cc: "Andrew Morton" <akpm@linux-foundation.org>
    Cc: "Joe Perches" <joe@perches.com>
    Cc: linux-doc@vger.kernel.org
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Acked-by: default avatarUwe Kleine-König <uwe@kleine-koenig.org>
    Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
    [andy.shevchenko@gmail.com: use abs()]
    Acked-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    57f5677e