From: Boaz Harrosh <bharrosh@panasas.com>
To: Chris Leech <chris.leech@gmail.com>
Cc: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org,
Harvey Harrison <harvey.harrison@gmail.com>
Subject: Re: [PATCH 1/3] 24-bit types: typedef and macros for accessing 3-byte arrays as integers
Date: Sun, 07 Sep 2008 20:21:56 +0300 [thread overview]
Message-ID: <48C40DB4.5050007@panasas.com> (raw)
In-Reply-To: <41b516cb0809070856v2000b93bm5305236e4a98b81a@mail.gmail.com>
Chris Leech wrote:
> On Sun, Sep 7, 2008 at 2:36 AM, Boaz Harrosh <bharrosh@panasas.com> wrote:
>> Chris Leech wrote:
>>> Both iSCSI and Fibre Channel make use of 24-bit big-endian values in
>>> frame headers. This patch defines __be24 and __le24 typedefs for a
>>> structure wrapped around a 3-byte array, and macros to convert back and
>>> forth to a 32-bit integer.
>>>
>>> The undefs in iscsi_proto.h are because of the different calling
>>> convention for the existing hton24 macro in the iSCSI code. iSCSI will
>>> be converted in a subsequent patch.
>>>
>>> Signed-off-by: Chris Leech <christopher.leech@intel.com>
>> I like what this patch wants to accomplish, but I disagree with the
>> implementation.
>>
>> First why is the double definition, one in include/linux/byteorder.h
>> and one in include/linux/byteorder/generic.h ?
>
> Because there are currently two byteorder/swab implementations in the
> kernel. As you said Harvey Harrison has done a lot of work in this
> area, but right now only the arm and avr32 architectures make use of
> the new linux/byteorder.h. I could put the 24-bit support in it's own
> header instead.
>
>> Second and most important, in both these files all routines are inline's
>> not MACROs, and rightly so. There is no place for a macro and the MACRO
>> works bad for these.
>
> I understand the benefits of inline functions, but I disagree that a
> macro is a bad choice in this case. An inline implementation of
> cpu_to_be24/hton24 would require a different interface than the rest
> of the byteorder functions, looking more like the existing iSCSI
> hton24 macro by taking a pointer to a memory location to store the
> result in.
>
> By using a macro that expands to a compound literal, I was able to
> maintain the same calling convention of X = cpu_to_be24(Y);
> Attempting to do so with an inline results in a function definition
> that returns a structure by value, and even when inlined generates
> much worse assembly (yes, I tried it).
>
>> One - the definition of a local variable in a {} scope in the middle of anywhere.
>
> That was done in order to only evaluate the macro operand only once,
> making it safe to call with an expression that may have side effects.
> Macros that create scoped variables are all over the place, like min,
> max and container_of. I consider it necessary in creating a good
> macro implementation for this functionality, and my motivation for
> using macros was given above.
>
>> Second - type safety.
>
> Actually, the assignment to a locally scoped variable gives just as
> much type checking as an inline would :-)
>
> Chris
>
>> I CC: Harvey Harrison which did lots of work in these area's.
>>
>> For me this patch is totally unacceptable.
>>
>> Thanks for working on this
>> Boaz
I wanted to see what you're saying and tried this test code below:
<test.c>
#include "stdio.h"
typedef unsigned char __u8;
typedef unsigned int __u32;
typedef struct { __u8 b[3]; } __be24, __le24;
#define __be24_to_cpu(x) \
({ \
__be24 _x = (x); \
(__u32) ((_x.b[0] << 16) | (_x.b[1] << 8) | (_x.b[2])); \
})
static inline __u32 be24_to_cpu(__be24 _x)
{
return (__u32) ((_x.b[0] << 16) | (_x.b[1] << 8) | (_x.b[2]));
}
#define __cpu_to_be24(x) \
({ \
__u32 _x = (x); \
(__be24) { .b = { (_x >> 16) & 0xff, (_x >> 8) & 0xff, _x & 0xff } }; \
})
static inline __be24 cpu_to_be24(__u32 _x)
{
__be24 be = {
.b = { (_x >> 16) & 0xff, (_x >> 8) & 0xff, _x & 0xff }
};
return be;
}
int test1(__u32 r)
{
union {
__be24 be17;
__u32 be_as_u;
} be = {.be_as_u = 0};
be.be17 = cpu_to_be24(r);
__u32 cpu = be24_to_cpu(be.be17) + 1;
printf("cpu=%x be=%x\n",cpu, be.be_as_u);
return cpu;
}
int test2(__u32 r)
{
union {
__be24 be17;
__u32 be_as_u;
} be = {.be_as_u = 0};
be.be17 = __cpu_to_be24(r);
__u32 cpu = __be24_to_cpu(be.be17) + 1;
printf("cpu=%x be=%x\n",cpu, be.be_as_u);
return cpu;
}
int main()
{
__u32 r = rand();
test1(r);
test2(r);
return 0;
}
</test.c>
I compile it like this:
$ gcc -O1 test.c -o test
if I
$ gdb test
gdb> disass test1
gdb> disass test2
I get the exact same assembly.
What am I doing wrong ?
$ gcc --version
gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27)
Boaz
next prev parent reply other threads:[~2008-09-07 17:22 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-05 16:57 [PATCH 1/3] 24-bit types: typedef and macros for accessing 3-byte arrays as integers Chris Leech
2008-09-05 16:57 ` Chris Leech
[not found] ` <20080905165732.16689.50256.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2008-09-05 16:57 ` [PATCH 2/3] 24-bit types: convert iSCSI to use the __be24 type and macros Chris Leech
2008-09-05 16:57 ` Chris Leech
[not found] ` <20080905165738.16689.31487.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2008-09-05 17:03 ` Mike Christie
2008-09-05 17:03 ` [Open-FCoE] " Mike Christie
2008-09-05 16:57 ` [PATCH 3/3] 24-bit types: Convert Open-FCoE to use " Chris Leech
2008-09-05 16:57 ` Chris Leech
2008-09-07 9:36 ` [PATCH 1/3] 24-bit types: typedef and macros for accessing 3-byte arrays as integers Boaz Harrosh
2008-09-07 15:56 ` Chris Leech
2008-09-07 17:21 ` Boaz Harrosh [this message]
2008-09-07 17:52 ` Chris Leech
2008-09-09 22:59 ` [PATCH] 24-bit types: typedef and functions " Chris Leech
2008-09-10 12:57 ` Boaz Harrosh
2008-09-07 9:57 ` [PATCH 1/3] 24-bit types: typedef and macros " Boaz Harrosh
2008-09-10 14:07 ` Christoph Hellwig
2008-09-10 15:40 ` Dave Kleikamp
2008-09-10 16:11 ` [PATCH " Boaz Harrosh
2008-09-10 16:25 ` Boaz Harrosh
[not found] ` <48C7F19D.3080507-C4P08NqkoRlBDgjK7y7TUQ@public.gmane.org>
2008-09-10 19:20 ` Dave Kleikamp
2008-09-10 19:20 ` Dave Kleikamp
2008-09-11 8:30 ` Boaz Harrosh
2008-09-11 1:51 ` Chris Leech
2008-09-10 16:25 ` Chris Leech
2008-09-10 17:45 ` [Open-FCoE] " Chris Leech
2008-09-10 18:04 ` Boaz Harrosh
2008-09-10 18:04 ` Boaz Harrosh
2008-09-10 18:23 ` Dave Kleikamp
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48C40DB4.5050007@panasas.com \
--to=bharrosh@panasas.com \
--cc=chris.leech@gmail.com \
--cc=harvey.harrison@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.