[PATCH] block: convert ata_port_for_each_link to use a while loop to reduce code size - Kernel

This is a discussion on [PATCH] block: convert ata_port_for_each_link to use a while loop to reduce code size - Kernel ; convert a for loop to a while loop in the ata_port_for_each_link macros to reduce code size. on x86_64 size reports reduction of text size in libata.ko : -272 bytes ahci.ko : -44 bytes Signed-off-by: Richard Kennedy ---- This patch is ...

+ Reply to Thread
Results 1 to 3 of 3

Thread: [PATCH] block: convert ata_port_for_each_link to use a while loop to reduce code size

  1. [PATCH] block: convert ata_port_for_each_link to use a while loop to reduce code size

    convert a for loop to a while loop in the ata_port_for_each_link macros
    to reduce code size.

    on x86_64 size reports reduction of text size in
    libata.ko : -272 bytes
    ahci.ko : -44 bytes

    Signed-off-by: Richard Kennedy

    ----
    This patch is against 2.6.27 git head.

    I've been running this patch on my AMD64 desktop machine for several
    days & have not seen any problems.
    regards
    Richard


    diff --git a/include/linux/libata.h b/include/linux/libata.h
    index 947cf84..bbe3b9d 100644
    --- a/include/linux/libata.h
    +++ b/include/linux/libata.h
    @@ -1283,12 +1283,12 @@ extern struct ata_link *__ata_port_next_link(struct ata_port *ap,
    bool dev_only);

    #define __ata_port_for_each_link(link, ap) \
    - for ((link) = __ata_port_next_link((ap), NULL, false); (link); \
    - (link) = __ata_port_next_link((ap), (link), false))
    + (link) = NULL; \
    + while (((link) = __ata_port_next_link((ap), (link), false)))

    #define ata_port_for_each_link(link, ap) \
    - for ((link) = __ata_port_next_link((ap), NULL, true); (link); \
    - (link) = __ata_port_next_link((ap), (link), true))
    + (link) = NULL; \
    + while (((link) = __ata_port_next_link((ap), (link), true)))

    #define ata_link_for_each_dev(dev, link) \
    for ((dev) = (link)->device; \


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: [PATCH] block: convert ata_port_for_each_link to use a while loop to reduce code size

    On Tue, 21 Oct 2008 21:24:32 +0100, "Richard Kennedy"
    said:
    > convert a for loop to a while loop in the ata_port_for_each_link macros
    > to reduce code size.
    >
    > on x86_64 size reports reduction of text size in
    > libata.ko : -272 bytes
    > ahci.ko : -44 bytes
    >
    > Signed-off-by: Richard Kennedy
    >
    > ----
    > This patch is against 2.6.27 git head.
    >
    > I've been running this patch on my AMD64 desktop machine for several
    > days & have not seen any problems.
    > regards
    > Richard
    >
    >
    > diff --git a/include/linux/libata.h b/include/linux/libata.h
    > index 947cf84..bbe3b9d 100644
    > --- a/include/linux/libata.h
    > +++ b/include/linux/libata.h
    > @@ -1283,12 +1283,12 @@ extern struct ata_link
    > *__ata_port_next_link(struct ata_port *ap,
    > bool dev_only);
    >
    > #define __ata_port_for_each_link(link, ap) \
    > - for ((link) = __ata_port_next_link((ap), NULL, false); (link); \
    > - (link) = __ata_port_next_link((ap), (link), false))
    > + (link) = NULL; \
    > + while (((link) = __ata_port_next_link((ap), (link), false)))


    Hi Richard,

    Please imagine how this expands...

    if (some_condition)
    __ata_port_for_each_link(link, ap)
    do_something(...)

    But it is probably possible to get the same size reduction by
    changing the for-loop like this (safety parentheses left out):

    for (link = NULL;
    link = __ata_port_next_link(ap, link, false), link; )

    Some programmers think this is abuse of the for-construct, though .

    Greetings,
    Alexander

    > #define ata_port_for_each_link(link, ap) \
    > - for ((link) = __ata_port_next_link((ap), NULL, true); (link); \
    > - (link) = __ata_port_next_link((ap), (link), true))
    > + (link) = NULL; \
    > + while (((link) = __ata_port_next_link((ap), (link), true)))
    >
    > #define ata_link_for_each_dev(dev, link) \
    > for ((dev) = (link)->device; \

    --
    Alexander van Heukelum
    heukelum@fastmail.fm

    --
    http://www.fastmail.fm - mmm... Fastmail...

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. Re: [PATCH] block: convert ata_port_for_each_link to use a while loop to reduce code size

    On Wed, 2008-10-22 at 08:17 +0200, Alexander van Heukelum wrote:
    > On Tue, 21 Oct 2008 21:24:32 +0100, "Richard Kennedy"
    > said:
    > > convert a for loop to a while loop in the ata_port_for_each_link macros
    > > to reduce code size.
    > >
    > > on x86_64 size reports reduction of text size in
    > > libata.ko : -272 bytes
    > > ahci.ko : -44 bytes
    > >
    > > Signed-off-by: Richard Kennedy
    > >
    > > ----
    > > This patch is against 2.6.27 git head.
    > >
    > > I've been running this patch on my AMD64 desktop machine for several
    > > days & have not seen any problems.
    > > regards
    > > Richard
    > >
    > >
    > > diff --git a/include/linux/libata.h b/include/linux/libata.h
    > > index 947cf84..bbe3b9d 100644
    > > --- a/include/linux/libata.h
    > > +++ b/include/linux/libata.h
    > > @@ -1283,12 +1283,12 @@ extern struct ata_link
    > > *__ata_port_next_link(struct ata_port *ap,
    > > bool dev_only);
    > >
    > > #define __ata_port_for_each_link(link, ap) \
    > > - for ((link) = __ata_port_next_link((ap), NULL, false); (link); \
    > > - (link) = __ata_port_next_link((ap), (link), false))
    > > + (link) = NULL; \
    > > + while (((link) = __ata_port_next_link((ap), (link), false)))

    >
    > Hi Richard,
    >
    > Please imagine how this expands...
    >
    > if (some_condition)
    > __ata_port_for_each_link(link, ap)
    > do_something(...)
    >
    > But it is probably possible to get the same size reduction by
    > changing the for-loop like this (safety parentheses left out):
    >
    > for (link = NULL;
    > link = __ata_port_next_link(ap, link, false), link; )
    >
    > Some programmers think this is abuse of the for-construct, though .
    >
    > Greetings,
    > Alexander
    >
    > > #define ata_port_for_each_link(link, ap) \
    > > - for ((link) = __ata_port_next_link((ap), NULL, true); (link); \
    > > - (link) = __ata_port_next_link((ap), (link), true))
    > > + (link) = NULL; \
    > > + while (((link) = __ata_port_next_link((ap), (link), true)))
    > >
    > > #define ata_link_for_each_dev(dev, link) \
    > > for ((dev) = (link)->device; \

    > --
    > Alexander van Heukelum
    > heukelum@fastmail.fm


    yes of course, that is the problem with this kind of macro

    IMHO, this particular macro doesn't improve the overall code readability
    so would be better being removed altogether. Whenever possible I much
    prefer being able to see a for or while loop in the code rather than
    hidden in a macro somewhere, but maybe that's just me
    regards
    Richard


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread