Re: [PATCH 19/19] lockd: clean up 64-bit alignment fix in nsm_init_private()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Apr 28, 2009, at 6:52 PM, Måns Rullgård wrote:
Chuck Lever <chuck.lever@xxxxxxxxxx> writes:
On Apr 28, 2009, at 6:31 PM, Måns Rullgård wrote:
Chuck Lever <chuck.lever@xxxxxxxxxx> writes:
On Apr 28, 2009, at 5:36 PM, J. Bruce Fields wrote:

On Tue, Apr 28, 2009 at 01:24:24PM -0400, Chuck Lever wrote:
On Apr 28, 2009, at 12:40 PM, J. Bruce Fields wrote:
On Tue, Apr 28, 2009 at 12:35:50PM -0400, Chuck Lever wrote:
On Apr 28, 2009, at 12:31 PM, J. Bruce Fields wrote:
On Thu, Apr 23, 2009 at 07:33:40PM -0400, Chuck Lever wrote:
Recently, commit ad5b365c fixed a data type alignment issue in
nsm_init_private() by introducing put_unaligned().  We don't
actually _require_ an unaligned access to nsm_private here.

Instead, we should always use memcpy/memcmp to access the
contents of RPC opaque data types.  This permits us to
continue to define these as simple character arrays, as most
legacy RPC code does, and to rely on gcc to pack the fields in
in-core structures optimally without breaking on platforms
that require strict alignment.

OK, I'm confused. What structures will get packed differently?

Any struct that has an nsm_private embedded in it, such as struct
nlm_reboot.

I don't see how that or any structure is changed by this patch.

It's not. Note the phrase above in the description: "permits us to
_continue_ to define these" -- meaning, I'm not changing the
structures.

Err, but that's not right either, is it?:  We don't need to apply
this
patch in order to continue to define the structures as they're
currently
defined.

Help! I'm confused!

This patch is simply a clean up. We don't need to use put_unaligned
in nsm_init_private.  There is absolutely nothing special about the
nsm_private data type that would require this. It should be accessed

The "special" thing is has not guaranteed alignment.  Hence, any
access to it must use unaligned-safe methods.

and modified the way all other RPC opaques are, via memset/memcpy.

What is so special about put_unaligned() that you insist on
replacing it?

Take a look at http://thread.gmane.org/gmane.linux.nfs/25607 and
commit ad5b365c.

The controversy is over how to define opaques so they are accessible
on both 32- and 64-bit hardware platforms.  My first pass at
nsm_init_private worked on 32-bit systems, but broke on 64-bit
systems.  An expedient fix for this was to add the put_unaligned in
there so 64-bit systems could access the field no matter how it was
aligned. I argue this is unneeded complexity, and inconsistent with
the way most other RPC opaques are treated in the kernel.

Andrew Morton proposed making RPC opaques a union of u8, u32 (or
__be32), and u64 -- the u8 would allow us to treat an opaque as a
byte
array when needed, the u32 would allow access via XDR quads, and the
u64 would force 64-bit alignment.  The issues with this are:

1. Defined this way, opaque fields in data structures will force the
encompassing structures to be large enough to honor the alignment
requirements of the fields, and

2.  Most other RPC opaques are already defined as character
arrays, so we would have to visit all of them to see if there were
issues.

If we insist on accessing opaques only via memset() and memcpy()
problem 1 goes away and we remain compatible with the traditional
definition of an RPC opaque as an array of bytes, on both 64- and 32-
bit systems.

I still don't see what problem put_unaligned() poses. Think of it as
a more efficient memcpy().  We don't want the code to be larger and
slower than necessary, do we?

The problem put_unaligned() poses is that it's harder to read and
comprehend this code.  Why call put_unaligned() here, but not for
other RPC opaques, such as nfs4_verifier?  With put_unaligned()
readers have to chase down asm/unaligned.h.  With memcpy() it is
precisely clear what is going on.

I thought put_unaligned() was precisely clear when I wrote that code.

In fact it wasn't. Your patch description and code were so unclear that Andrew Morton chastised all of us for not recognizing that this was a _fix_ that also belonged in -stable:

  --- Quote ---
> A patch just went upstream for 2.6.30 that addresses that
[ ... commit ad5b365c snipped ... ]

Is this the best way of fixing it?  We'll crash again if some other
code starts to access .data with non-byte-sized accesses.  What makes
this especially risky is that the code will pass testing on x86.

__aligned would be one way.  But it would be far far cleaner to just do


--- a/include/linux/lockd/xdr.h~a
+++ a/include/linux/lockd/xdr.h
@@ -17,7 +17,7 @@
#define SM_PRIV_SIZE		16

struct nsm_private {
-	unsigned char		data[SM_PRIV_SIZE];
+	u64 data[SM_PRIV_SIZE/sizeof(u64)];
};

struct svc_rqst;

all the typecasting and the put_unaligned()s just go away then.
> but did not mention that it fixed an oops.
That was a fairly significant failing. Guys, please please do remember that we're also maintaining the stable kernels. When merging a patch please always think whether it needs to be backported.

  --- End Quote ---

It appears that Andrew did not find your patch to be sufficient.

The fact that you have repeated the "what if SM_PRIV_SIZE changes" argument suggests that you still haven't become familiar with the body of this code to see what it does, how it works, and what would be a consistent and correct fix.

I would have thought anyone working on the kernel would be familiar
with it, or at the very least be able to guess what it did.

Your reasoning above is the kind of thing I'd expect in some silly
corporate environment, not from Linux kernel developers.

How adorable!

We are striving for a code base that is easier to review by people who are outside our small community. I find that goal to be perfectly aligned with the stated goals of Linux kernel developers.

Again, this is just a clean up.  The current code works.  But I think
it's inconsistent with other areas of the code, and harder to
understand.

I'll leave the decision to the maintainers of the code.

Bruce, please drop patch 19. A simple clean up like this is not worth the heartburn.

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux