From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753428AbbKZVrV (ORCPT ); Thu, 26 Nov 2015 16:47:21 -0500 Received: from mail-wm0-f47.google.com ([74.125.82.47]:34098 "EHLO mail-wm0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751270AbbKZVrS (ORCPT ); Thu, 26 Nov 2015 16:47:18 -0500 From: Rasmus Villemoes To: Andy Shevchenko Cc: Andrew Morton , Maurizio Lombardi , Tejun Heo , Joe Perches , "linux-kernel\@vger.kernel.org" Subject: Re: [PATCH 04/14] lib/vsprintf.c: expand field_width to 24 bits Organization: D03 References: <1448314171-25856-1-git-send-email-linux@rasmusvillemoes.dk> <1448314171-25856-5-git-send-email-linux@rasmusvillemoes.dk> X-Hashcash: 1:20:151126:mlombard@redhat.com::G6lF+REotCqcY2mX:0000000000000000000000000000000000000000000Dvl X-Hashcash: 1:20:151126:linux-kernel@vger.kernel.org::0ewpCmwvGQRjzpS8:0000000000000000000000000000000000edP X-Hashcash: 1:20:151126:akpm@linux-foundation.org::YcnA8M5GCc1bkf9L:00000000000000000000000000000000000012C6 X-Hashcash: 1:20:151126:tj@kernel.org::8Ble/rdkZD89c5g0:00001FsX X-Hashcash: 1:20:151126:joe@perches.com::XgcPl/l7KzzDykBu:002Maa X-Hashcash: 1:20:151126:andy.shevchenko@gmail.com::aFZndIUAvTPiBxDX:0000000000000000000000000000000000003gc1 Date: Thu, 26 Nov 2015 22:47:15 +0100 In-Reply-To: (Andy Shevchenko's message of "Tue, 24 Nov 2015 01:05:08 +0200") Message-ID: <87oaegcu1o.fsf@rasmusvillemoes.dk> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Nov 24 2015, Andy Shevchenko wrote: > On Mon, Nov 23, 2015 at 11:29 PM, Rasmus Villemoes > wrote: >> Maurizio Lombardi reported a problem [1] with the %pb extension: It >> doesn't work for sufficiently large bitmaps, since the size is stashed >> in the field_width field of the struct printf_spec, which is currently >> an s16. Concretely, this manifested itself in >> /sys/bus/pseudo/drivers/scsi_debug/map being empty, since the bitmap >> printer got a size of 0, which is the 16 bit truncation of the actual >> bitmap size. >> >> We do want to keep struct printf_spec at 8 bytes so that it can >> cheaply be passed by value. The qualifier field is only used for >> internal bookkeeping in format_decode, so we might as well use a local >> variable for that. This gives us an additional 8 bits, which we can >> then use for the field width. >> >> To stay in 8 bytes, we need to do a little rearranging and make the >> type member a bitfield as well. For consistency, change all the >> members to bit fields. gcc doesn't generate much worse code with these >> changes (in fact, bloat-o-meter says we save 300 bytes - which I think >> is a little surprising). >> >> I didn't find a BUILD_BUG/compiletime_assertion/... which would work >> outside function context, so for now I just open-coded it. > > And any objections to put it into vsnprintf() ? I'd like to keep it close to the type definition. And I was hoping someone would come forward and say "yeah, that's been bugging me too, here's a patch I've been sitting on to fix that". Almost every compiler released this decade has _Static_assert, it's about time we start using that instead of the current mess of homegrown workarounds... Rasmus