[lkml]   [2001]   [Jul]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    SubjectRe: [RFC] __initstr & __exitstr
    On Fri, Jul 06, 2001 at 11:17:44PM -0300, Arnaldo Carvalho de Melo wrote:
    > Hi,
    > Please comment on this approach to move strings in __init functions
    > from .rodata to .data.init so that it get discarded after initialization,
    > like the variables marked as __initdata and the functions marked as __init,
    > as well as move strings in __exit marked functions to .data.exit, that will
    > be discarded and not even get into the generated kernel image.
    > Please note that if possible the best approach was for gcc to move
    > those strings automatically if the function was marked with modified
    > __init/__exit macros, but we have to keep in mind that some of the strings
    > in those functions can not be discarded because they keep being referenced
    > by say register_chrdev and others, unlike, for example, proc functions and
    > others that copy the string passed to some malloc'ed data structure, so we
    > have to be selective marking exactly the ones that can indeed be discarded.

    .. or fix all registration functions to use a private copy of the string,
    which would avoid some common oopses.

    > I've also implemented helper functions for printk thats the most
    > common case, and leaved the other common case, panic, using
    > __initstr/__exitstr explicitely, so that people can comment on what is
    > better.

    > #define init_printk(fmt,arg...) printk(__initstr(fmt) , ##arg)

    I dislike init_printk; it combines variadic functions/macros with
    assumptions about how the first argument is specified (i.e. as a string
    constant), so it's potentially very confusing.

    Also, printk is used for debugging, and accidentally using init_printk
    instead of printk would result in no messages being printed at all if
    the driver is compiled into the kernel (while everything would work
    fine if the driver is compiled as a module, where init_printk and printk
    are identical). I think this would be very annoying to track down for
    less experienced kernel hackers.

    > #define __initstr(s) ({ static char __tmp_init_str[] __initdata=s;
    > __tmp_init_str;})

    I think this would fail if used in structure initialisations ?

    Philipp Rumpf
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at

     \ /
      Last update: 2005-03-22 12:56    [W:0.035 / U:1.204 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site