Masa Murayama wrote:
> Steven,
>
> Thank you very much for your review.
> I answer in lines.

My pleasure; I am glad I could help.

>> (the changes on lines 1140 - 1180 really bug me):
>>
>> 1146 tmp0 is not meaningful - why was the assignment broken out? IMHO
>>      having this broken apart makes the code more difficult to read.
>> 1147 tmp1 is not meaningful - see comments above (line 1146)
>> 1177 this line should not have changed; using a tmp variable here has
>>      no benefit
>> 1178 I would have handled this differently. On line 1170, I would
>>      have: 'mark |= dcp->dmac_size;', and then
>>      'tdp->d_cmdsts = LE_32(mark);' on line 1180.
> 
> The reason of changing line 1140 - 1180 is for performance.
> As LE_32() is a macro, LE_32(p->xxx) will cause several memory
> references to the same location by a pointer, that are difficult for
> compilers to optimize.

This is very interesting - I honestly would not have considered
dereferencing a pointer from within a macro to be a performance issue -
now that you have pointed it out, I can understand why the assignments
were broken apart.

>> 1243 See comments on line 1188
>>
>> 1256 & 1257  Don't break the statements apart; clutter
>
> The reason is for supporting big endian CPUs, i.e. sparc.
> LE_32(tdp->d_cmdsts) is not atomic in sparc. LE_32() macro
> generates several memory references to read the same word in the same
> descriptor.
> It will corrupt the result of LE_32() if the nic will update the
> descriptor at the same time.

Makes sense, I did not even consider the side-effects of the inline.

(Minor rant...)

It's cases like the ones above that really make me wonder if LE/BE_32
and friends should be amended.

It seems that the behavior would be far more consistent if LE_32 on a BE
system would simply call a function rather than attempt to convert the
value inline. Pass-by-value would insulate the caller from any
non-atomic side-effects of the inline (at the additional cost of
performing a function call).

Then again, I suppose it depends on what is considered acceptable
overhead when converting from LE to BE (and vice versa) and how often it
is performed.

Regards,

Steve

--
Yet magic and hierarchy
arise from the same source,
and this source has a null pointer.

Reference the NULL within NULL,
it is the gateway to all wizardry.
_______________________________________________
driver-discuss mailing list
driver-discuss@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/driver-discuss

Reply via email to