Thread (22 messages) 22 messages, 6 authors, 2018-10-09

Re: [PATCH 09/11] UAPI: ndctl: Fix g++-unsupported initialisation in headers [ver #2]

From: Dan Williams <hidden>
Date: 2018-09-25 20:22:35
Also in: linux-kbuild, lkml, nvdimm

On Thu, Sep 6, 2018 at 2:19 AM David Howells [off-list ref] wrote:
The following code in the linux/ndctl header file:

        static inline const char *nvdimm_bus_cmd_name(unsigned cmd)
        {
                static const char * const names[] = {
                        [ND_CMD_ARS_CAP] = "ars_cap",
                        [ND_CMD_ARS_START] = "ars_start",
                        [ND_CMD_ARS_STATUS] = "ars_status",
                        [ND_CMD_CLEAR_ERROR] = "clear_error",
                        [ND_CMD_CALL] = "cmd_call",
                };

                if (cmd < ARRAY_SIZE(names) && names[cmd])
                        return names[cmd];
                return "unknown";
        }

is broken in a number of ways:

 (1) ARRAY_SIZE() is not generally defined.

 (2) g++ does not support "non-trivial" array initialisers fully yet.

 (3) Every file that calls this function will acquire a copy of names[].

The same goes for nvdimm_cmd_name().

Fix all three by converting to a switch statement where each case returns a
string.  That way if cmd is a constant, the compiler can trivially reduce it
and, if not, the compiler can use a shared lookup table if it thinks that is
more efficient.

A better way would be to remove these functions and their arrays from the
header entirely.

Signed-off-by: David Howells <redacted>
cc: Dan Williams <redacted>
Acked-by: Dan Williams <redacted>

...again let me know if you'll take this with g++ series or want me to
carry it directly.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help