Re: [PATCH 07/17] crypto: ansi_cprng - Shrink rand_read_pos & flags

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

 



On Tue, Dec 02, 2014 at 03:28:17PM -0500, George Spelvin wrote:
> >> --- a/crypto/ansi_cprng.c
> >> +++ b/crypto/ansi_cprng.c
> >> @@ -51,9 +51,9 @@ struct prng_context {
> >>  	unsigned char rand_data[DEFAULT_BLK_SZ];
> >>  	unsigned char DT[DEFAULT_BLK_SZ];
> >>  	unsigned char V[DEFAULT_BLK_SZ];
> >> -	u32 rand_read_pos;	/* Offset into rand_data[] */
> >> +	unsigned char rand_read_pos;	/* Offset into rand_data[] */
> 
> > u8 please.  Also, not sure if this helps much, as I think the padding
> > will just get you back to word alignment on each of these.
> 
> I noticed the "unsigned char" vs "u8" issue, but didn't make the change
> as I didn't think the readailility improvement was worth the code churn.
> 
You just sent a 17 patch series of clean up and were worried about code churn
converting an unsigned char to a u8?


> But I'd be happy to clean that up, too!
> 
> Should I convert all the buffers and function prototypes, or is there
> some criterion for distinguishing which gets which?   (E.g. buffers are
> "unsigned char" but control variables are "u8".)
> 
If you want to sure.  u8 probably makes more sense for the buffers here as our
intent is to treat them as an array of byte values.

> And actually, you do win.  spinlock_t is 16 bits on x86,
> and the buffers are all 16 bytes.   (80 bytes before my earlier
> patches, 48 bytes after.)
> 
> So the the structure goes from:
> 
> 32-bit		64-bit		Variable
> Offset	Size	Offset	Size
>  0	2	 0	2	spinlock_t prng_lock
>  2	16	 2	16	unsigned char rand_data[16]
> 18	16	18	16	unsigned char DT[16]
> 34	16	34	16	unsigned char V[16]
> 50	2	50	2	(alignemnt)
> 52	4	52	4	u32 rand_read_pos
> 56	4	56	8	struct crypto_cipher *tfm
> 60	4	64	4	u32 flags
> 		68	4	(alignment)
> 64		72		(structure size)
> 
> to
> 
> 32-bit		64-bit		Variable
> Offset	Size	Offset	Size
> 34	16	34	16	unsigned char V[16]
> 50	1	50	1	u8 rand_read_pos
> 51	1	51	1	u8 flags
> 		52	4	(alignment)
> 52	4	56	8	struct crypto_cipher *tfm
> 56		64		(structure size)
> 
> You still get 4 bytes of alignment padding on x86-64, but given that
> the structure has 60 bytes of payload, that's the minimum possible.
> 
> You save 6 bytes of variables and 2 bytes of padding on both
> 32- and 64-bit systems, for a total of 8 bytes, and that's enough
> to knock you into a smaller slab object bin on 64-bit.
> 
> 
> I forget where I read the terminology, but the most efficient
> wat to pack a structure is in an "organ pipe" configuraiton where
> the biggest (in terms of *alignment*) members are on the outside
> and the structre and the smaller elements are on the inside.
> Putting a 32-bit "flags" after a 64-bit pointer violates that.
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]

  Powered by Linux