From: Jeff Garzik <jgarzik@pobox.com>
To: Tejun Heo <htejun@gmail.com>
Cc: alan@lxorguk.ukuu.org.uk, axboe@suse.de, albertcc@tw.ibm.com,
forrest.zhao@intel.com, efalk@google.com,
linux-ide@vger.kernel.org
Subject: Re: [PATCH 02/11] libata-eh: implement ata_ering
Date: Sat, 13 May 2006 21:32:56 -0400 [thread overview]
Message-ID: <446688C8.6020001@pobox.com> (raw)
In-Reply-To: <446685D1.4030607@gmail.com>
Tejun Heo wrote:
> Jeff Garzik wrote:
>> Tejun Heo wrote:
>>> Jeff Garzik wrote:
>>>> Tejun Heo wrote:
>>>>> +struct ata_ering {
>>>>> + int cursor;
>>>>> + int size;
>>>>> + struct ata_ering_entry ring[];
>>>>> +};
>>>>> +
>>>>> +#define DEFINE_ATA_ERING(name, size) \
>>>>> + struct ata_ering name; \
>>>>> + struct ata_ering_entry name_entries[size];
>>>>
>>>> ACK, but this is creeping dangerously close to C abuse :)
>>>>
>>>> This sort of code will confuse debuggers and source checkers.
>>>>
>>>
>>> Well, as ering is currently used in only one place and it will stay
>>> in libata in the future, it might be better to remove the macro and
>>> shove the allocation into where it's used; however, I prefer the
>>> macro because it's safer and I don't use any debuggers or source
>>> checkers.
>>>
>>> Linux source has lots of cpp macros like above and IMHO the above
>>> doesn't even rank among C abuses. lxr and sparse would be fine.
>>
>> I doubt you'll find another example of this at all. The reason why
>> its abuse is that the declaration and use are subtlely different. In
>> the above, the C compiler is free to insert padding between 'name' and
>> 'name_entries'.
>>
>> Other counterpoints:
>>
>> * Its important to support other people's use of debuggers and source
>> checkers.
>
> Agreed.
>
>> * I disagree that the macro is safer, simply because we are having
>> this conversation :) An allocation is easier to understand and less
>> prone to subtle breakage.
>>
>> This is the trap of the 0-element array: its handy for avoiding an
>> additional allocation, but if you look all over the kernel at its real
>> world uses (including SCSI and libata), you'll see a hodgepodge of
>> ugly casting, varied approaches, and yet similar bug patterns.
>
> With your comment about padding above, I'm a bit confused. No matter
> whether we put the name_entries in the macro or in struct ata_device,
> the compiler is free to insert padding inbetween. That's how
> zero/flexible-length array is supposed to be used. The only thing
> guaranteed is that there will be enough space to store the array
> members. Accessing the storage area directly will result in disaster. I
> consider it one another convention to learn about the great C.
>
> The alternatives here are...
>
> * leave it as it is
> * shove ering_entry allocation into ering (fixed size is ATM)
> * shove ering_entry allocation into ata_device
I would just declare that all erings have 32 entries, and revisit the
issue if/when pain appears. Hardcode 32, and make things easy.
Jeff
next prev parent reply other threads:[~2006-05-14 1:33 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-11 13:21 [PATCHSET 03/11] new EH implementation, take 3 Tejun Heo
2006-05-11 13:21 ` [PATCH 05/11] libata-eh: implement new EH Tejun Heo
2006-05-13 22:19 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 03/11] libata-eh: add per-dev ata_ering Tejun Heo
2006-05-11 13:21 ` [PATCH 04/11] libata-eh: implement ata_eh_info and ata_eh_context Tejun Heo
2006-05-11 13:21 ` [PATCH 01/11] libata-eh: add ATA and libata flags for new EH Tejun Heo
2006-05-13 22:15 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 02/11] libata-eh: implement ata_ering Tejun Heo
2006-05-13 22:16 ` Jeff Garzik
2006-05-13 23:36 ` Tejun Heo
2006-05-14 1:05 ` Jeff Garzik
2006-05-14 1:20 ` Tejun Heo
2006-05-14 1:32 ` Jeff Garzik [this message]
2006-05-14 1:38 ` Tejun Heo
2006-05-15 13:36 ` Alan Cox
2006-05-15 14:00 ` Tejun Heo
2006-05-15 14:25 ` Tejun Heo
2006-05-15 14:50 ` Alan Cox
2006-05-15 14:57 ` Tejun Heo
2006-05-15 15:19 ` Alan Cox
2006-05-15 15:19 ` Tejun Heo
2006-05-15 18:22 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 06/11] libata-eh: implement BMDMA EH Tejun Heo
2006-05-13 22:21 ` Jeff Garzik
2006-05-13 23:41 ` Tejun Heo
2006-05-15 13:38 ` Alan Cox
2006-05-15 13:59 ` Tejun Heo
2006-05-15 14:43 ` Alan Cox
2006-05-11 13:21 ` [PATCH 07/11] ata_piix: convert to new EH Tejun Heo
2006-05-13 22:23 ` Jeff Garzik
2006-05-11 13:21 ` [PATCH 08/11] sata_sil: " Tejun Heo
2006-05-11 14:22 ` Alan Cox
2006-05-11 14:39 ` Tejun Heo
2006-05-11 15:46 ` Alan Cox
2006-05-11 15:45 ` Tejun Heo
2006-05-11 16:12 ` Alan Cox
2006-05-11 16:10 ` Tejun Heo
2006-05-11 17:16 ` Alan Cox
2006-05-13 22:26 ` Jeff Garzik
2006-05-13 23:43 ` Tejun Heo
2006-05-11 13:21 ` [PATCH 10/11] ahci: add PIOS interim interrupt handling Tejun Heo
2006-05-11 13:21 ` [PATCH 11/11] sata_sil24: convert to new EH Tejun Heo
2006-05-11 13:21 ` [PATCH 09/11] ahci: " Tejun Heo
2006-05-13 10:53 ` Tejun Heo
2006-05-13 22:30 ` Jeff Garzik
2006-05-13 23:49 ` Tejun Heo
2006-05-13 22:34 ` [PATCHSET 03/11] new EH implementation, take 3 Jeff Garzik
2006-05-13 23:58 ` Tejun Heo
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=446688C8.6020001@pobox.com \
--to=jgarzik@pobox.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=albertcc@tw.ibm.com \
--cc=axboe@suse.de \
--cc=efalk@google.com \
--cc=forrest.zhao@intel.com \
--cc=htejun@gmail.com \
--cc=linux-ide@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.