public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] RFC: getramsize() prototype and volatile qualifier
@ 2011-04-21  7:09 Albert ARIBAUD
  2011-04-21 17:02 ` Mike Frysinger
  0 siblings, 1 reply; 5+ messages in thread
From: Albert ARIBAUD @ 2011-04-21  7:09 UTC (permalink / raw)
  To: u-boot

Hi all,

Call it a detail, but I see that get_ram_size() calls sometime qualify 
their argument as volatile and sometimes not, and this makes checkpatch 
complain that volatiles are Bad(tm), which I would like to get fixed.

The prototype for get_ram_size() in is

	long	get_ram_size  (volatile long *, long);

While I understand that the way get_ram_size() works, it needs to 
perform volatile *accesses* to addresses computed from its arguments, I 
don't see why it requires one of the arguments themselves to be volatile.

Am I missing something here, particularly about some toolchain requiring 
the argument to be volatile? I see no reason it should, but better safe 
than sorry.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] RFC: getramsize() prototype and volatile qualifier
  2011-04-21  7:09 [U-Boot] RFC: getramsize() prototype and volatile qualifier Albert ARIBAUD
@ 2011-04-21 17:02 ` Mike Frysinger
  2011-04-21 17:50   ` Albert ARIBAUD
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Frysinger @ 2011-04-21 17:02 UTC (permalink / raw)
  To: u-boot

On Thu, Apr 21, 2011 at 3:09 AM, Albert ARIBAUD wrote:
> Call it a detail, but I see that get_ram_size() calls sometime qualify
> their argument as volatile and sometimes not, and this makes checkpatch
> complain that volatiles are Bad(tm), which I would like to get fixed.
>
> The prototype for get_ram_size() in is
>
> ? ? ? ?long ? ?get_ram_size ?(volatile long *, long);
>
> While I understand that the way get_ram_size() works, it needs to
> perform volatile *accesses* to addresses computed from its arguments, I
> don't see why it requires one of the arguments themselves to be volatile.
>
> Am I missing something here, particularly about some toolchain requiring
> the argument to be volatile? I see no reason it should, but better safe
> than sorry.

the argument isnt volatile, the memory it points to is.  since
get_ram_size() itself doesnt dereference the argument (only goes
through a local "addr"), the volatile marking in the prototype could
be dropped, but personally i dont see the point.  the prototype doesnt
require callers to add volatile markings to their own code, and i
could see someone using "base" in the future after the volatile being
dropped and people not noticing right away.  the current code is safe
and causes no problems by itself, so i see no value in changing it.

this sounds like useless "gotta be checkpatch clean" work by people
blindly following its output.
-mike

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] RFC: getramsize() prototype and volatile qualifier
  2011-04-21 17:02 ` Mike Frysinger
@ 2011-04-21 17:50   ` Albert ARIBAUD
  2011-04-21 22:28     ` Mike Frysinger
  0 siblings, 1 reply; 5+ messages in thread
From: Albert ARIBAUD @ 2011-04-21 17:50 UTC (permalink / raw)
  To: u-boot

Le 21/04/2011 19:02, Mike Frysinger a ?crit :
> On Thu, Apr 21, 2011 at 3:09 AM, Albert ARIBAUD wrote:
>> Call it a detail, but I see that get_ram_size() calls sometime qualify
>> their argument as volatile and sometimes not, and this makes checkpatch
>> complain that volatiles are Bad(tm), which I would like to get fixed.
>>
>> The prototype for get_ram_size() in is
>>
>>         long    get_ram_size  (volatile long *, long);
>>
>> While I understand that the way get_ram_size() works, it needs to
>> perform volatile *accesses* to addresses computed from its arguments, I
>> don't see why it requires one of the arguments themselves to be volatile.
>>
>> Am I missing something here, particularly about some toolchain requiring
>> the argument to be volatile? I see no reason it should, but better safe
>> than sorry.
>
> the argument isnt volatile, the memory it points to is.  since
> get_ram_size() itself doesnt dereference the argument (only goes
> through a local "addr"), the volatile marking in the prototype could
> be dropped, but personally i dont see the point.  the prototype doesnt
> require callers to add volatile markings to their own code, and i
> could see someone using "base" in the future after the volatile being
> dropped and people not noticing right away.  the current code is safe
> and causes no problems by itself, so i see no value in changing it.
>
> this sounds like useless "gotta be checkpatch clean" work by people
> blindly following its output.
> -mike

Just because checkpatch complains about something does not mean that 
particular complaint is without merit. :)

Yes, the code works as it is; but it'll work just as well if volatile is 
removed from the prototype and calls, and that'll make the code simpler 
and more homogeneous overall, plus it'll give checkpatch one less cause 
for complaint. We gain something there, if not a functional plus, an 
overal quality plus.

As for people fiddling with get_ram_size() *body* and removing the 
volatile 'addr' and use the non-volatile 'base' directly, why would 
they? They will plainly see that 'addr' is volatile and 'base' is not 
(all the more because removing the volatile' attribute from 'base' will 
require casting it to 'base+int' where it belongs), and the very role of 
the function makes it clear to them that the volatile attribute is 
required for 'addr', so they'll keep 'addr'.

Plus, get_ram_size() is pretty stable -- actually, it has changed only 
once in 2006 since its creation in 2004.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] RFC: getramsize() prototype and volatile qualifier
  2011-04-21 17:50   ` Albert ARIBAUD
@ 2011-04-21 22:28     ` Mike Frysinger
  2011-04-22  5:52       ` Albert ARIBAUD
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Frysinger @ 2011-04-21 22:28 UTC (permalink / raw)
  To: u-boot

On Thu, Apr 21, 2011 at 1:50 PM, Albert ARIBAUD wrote:
> Le 21/04/2011 19:02, Mike Frysinger a ?crit :
>> On Thu, Apr 21, 2011 at 3:09 AM, Albert ARIBAUD wrote:
>>> Call it a detail, but I see that get_ram_size() calls sometime qualify
>>> their argument as volatile and sometimes not, and this makes checkpatch
>>> complain that volatiles are Bad(tm), which I would like to get fixed.
>>>
>>> The prototype for get_ram_size() in is
>>>
>>> ? ? ? ?long ? ?get_ram_size ?(volatile long *, long);
>>>
>>> While I understand that the way get_ram_size() works, it needs to
>>> perform volatile *accesses* to addresses computed from its arguments, I
>>> don't see why it requires one of the arguments themselves to be volatile.
>>>
>>> Am I missing something here, particularly about some toolchain requiring
>>> the argument to be volatile? I see no reason it should, but better safe
>>> than sorry.
>>
>> the argument isnt volatile, the memory it points to is. ?since
>> get_ram_size() itself doesnt dereference the argument (only goes
>> through a local "addr"), the volatile marking in the prototype could
>> be dropped, but personally i dont see the point. ?the prototype doesnt
>> require callers to add volatile markings to their own code, and i
>> could see someone using "base" in the future after the volatile being
>> dropped and people not noticing right away. ?the current code is safe
>> and causes no problems by itself, so i see no value in changing it.
>>
>> this sounds like useless "gotta be checkpatch clean" work by people
>> blindly following its output.
>
> Just because checkpatch complains about something does not mean that
> particular complaint is without merit. :)

like ive said many times, "checkpatch clean" is not a hard rule.
review the output to see when it makes sense.  the general "volatile
is bad" check is there because people often screw it up.  this is not
one of those cases ... we absolutely want volatile accesses.

> Yes, the code works as it is; but it'll work just as well if volatile is
> removed from the prototype and calls

uhh, there is no "volatile in calls".  there is no requirement that
the call sites also use volatile markings.

>, and that'll make the code simpler and more homogeneous overall

i think you missed a fairly important qualifier.  this is your
opinion, and one i dont share in this particular instance.

> plus it'll give checkpatch one less cause for complaint. We gain
> something there, if not a functional plus, an overal quality plus.

there is absolutely no quality difference

> As for people fiddling with get_ram_size() *body* and removing the volatile
> 'addr' and use the non-volatile 'base' directly, why would they?

i have no idea.  i leave the door open to things that i dont happen to
think of rather than assuming absolutes.

> They will plainly see that 'addr' is volatile and 'base' is not

this sort of blind assumption is dangerous.  things that are plain to
you doesnt mean it's plain to everyone, and people make mistakes all
the time.  keeping the volatile markings on base protects from that
sort of screw up.

> (all the more because removing the volatile' attribute from 'base' will
> require casting it to 'base+int' where it belongs)

i dont know what you're talking about here ... there is no need for
casting regardless of the volatile markings of base.  casting is need
to ignore warnings when casting "down" from volatile to non-volatile,
not the other way around.  which is not the case here.
-mike

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] RFC: getramsize() prototype and volatile qualifier
  2011-04-21 22:28     ` Mike Frysinger
@ 2011-04-22  5:52       ` Albert ARIBAUD
  0 siblings, 0 replies; 5+ messages in thread
From: Albert ARIBAUD @ 2011-04-22  5:52 UTC (permalink / raw)
  To: u-boot

Le 22/04/2011 00:28, Mike Frysinger a ?crit :

> On Thu, Apr 21, 2011 at 1:50 PM, Albert ARIBAUD wrote:
>> Le 21/04/2011 19:02, Mike Frysinger a ?crit :
>>> On Thu, Apr 21, 2011 at 3:09 AM, Albert ARIBAUD wrote:
>>>> Call it a detail, but I see that get_ram_size() calls sometime qualify
>>>> their argument as volatile and sometimes not, and this makes checkpatch
>>>> complain that volatiles are Bad(tm), which I would like to get fixed.
>>>>
>>>> The prototype for get_ram_size() in is
>>>>
>>>>         long    get_ram_size  (volatile long *, long);
>>>>
>>>> While I understand that the way get_ram_size() works, it needs to
>>>> perform volatile *accesses* to addresses computed from its arguments, I
>>>> don't see why it requires one of the arguments themselves to be volatile.
>>>>
>>>> Am I missing something here, particularly about some toolchain requiring
>>>> the argument to be volatile? I see no reason it should, but better safe
>>>> than sorry.
>>>
>>> the argument isnt volatile, the memory it points to is.  since
>>> get_ram_size() itself doesnt dereference the argument (only goes
>>> through a local "addr"), the volatile marking in the prototype could
>>> be dropped, but personally i dont see the point.  the prototype doesnt
>>> require callers to add volatile markings to their own code, and i
>>> could see someone using "base" in the future after the volatile being
>>> dropped and people not noticing right away.  the current code is safe
>>> and causes no problems by itself, so i see no value in changing it.
>>>
>>> this sounds like useless "gotta be checkpatch clean" work by people
>>> blindly following its output.
>>
>> Just because checkpatch complains about something does not mean that
>> particular complaint is without merit. :)
>
> like ive said many times, "checkpatch clean" is not a hard rule.
> review the output to see when it makes sense.  the general "volatile
> is bad" check is there because people often screw it up.  this is not
> one of those cases ... we absolutely want volatile accesses.

Volatile accesses, yes, we want them, I said so. But that does not mean 
we need volatile *paramters* to the function or *arguments* to the calls.

>> Yes, the code works as it is; but it'll work just as well if volatile is
>> removed from the prototype and calls
>
> uhh, there is no "volatile in calls".  there is no requirement that
> the call sites also use volatile markings.

There *are* volatiles in the calls; just check the source code.

>> , and that'll make the code simpler and more homogeneous overall
>
> i think you missed a fairly important qualifier.  this is your
> opinion, and one i dont share in this particular instance.

Maybe you missed the fact that there are calls to get_ram_size() that 
don't have the volatile qualifier to 'base' and there are other who have 
it -- that's heterogeneity (I suspect it stems from various strictnesses 
in toolchains) and removing all volatiles objectively does remove that 
heterogeneity.

>> plus it'll give checkpatch one less cause for complaint. We gain
>> something there, if not a functional plus, an overal quality plus.
>
> there is absolutely no quality difference

Less error / warning messages from a tool we use counts as better 
quality for me.

>> As for people fiddling with get_ram_size() *body* and removing the volatile
>> 'addr' and use the non-volatile 'base' directly, why would they?
>
> i have no idea.  i leave the door open to things that i dont happen to
> think of rather than assuming absolutes.

I don't assume absolutes here I think. My assumtion is that 'people' 
will not blindly remove a volatile qualifier in a memory size test 
function which obviously requires its memory accesses to not be 
optimized in any way.

>> They will plainly see that 'addr' is volatile and 'base' is not
>
> this sort of blind assumption is dangerous.  things that are plain to
> you doesnt mean it's plain to everyone, and people make mistakes all
> the time.  keeping the volatile markings on base protects from that
> sort of screw up.

If things are not plain, then let's make them plain where they need to 
be. We do agree that the qualifier in the prototype and calls is useless 
from a functional viewpoint; we do agree that the volatile *access* in 
the function body is crucial; if you think people who want to modify the 
body of get_ram_size() need an explicit warning about keeping the 
accesses volatile then that warning should be given right near the 
accesses, for instance in the form of a Big Fat Comment (tm) right in 
the function's code, not elsewhere in calls.

>> (all the more because removing the volatile' attribute from 'base' will
>> require casting it to 'base+int' where it belongs)
>
> i dont know what you're talking about here ... there is no need for
> casting regardless of the volatile markings of base.  casting is need
> to ignore warnings when casting "down" from volatile to non-volatile,
> not the other way around.  which is not the case here.
> -mike

Correct: the cast to volatile is not needed. Still, removing the 'base' 
variable will remove a 'volatile' qualifier. However, I still think 
people who want to modify get_ram_size() know about volatiles and how 
the function works and won't make the mistake of removing the qualifier. 
And if they do, the change will be reviewed and NAKed anyway.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-04-22  5:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-21  7:09 [U-Boot] RFC: getramsize() prototype and volatile qualifier Albert ARIBAUD
2011-04-21 17:02 ` Mike Frysinger
2011-04-21 17:50   ` Albert ARIBAUD
2011-04-21 22:28     ` Mike Frysinger
2011-04-22  5:52       ` Albert ARIBAUD

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox