random: statically compute poolbitshift, poolbytes, poolbits
Use a macro to statically compute poolbitshift (will be used in a subsequent patch), poolbytes, and poolbits. On virtually all architectures the cost of a memory load with an offset is the same as the one of a memory load. It is still possible for this to generate worse code since the C compiler doesn't know the fixed relationship between these fields, but that is somewhat unlikely. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
85a1f77716
commit
9ed17b70b4
|
@ -309,46 +309,45 @@ static DEFINE_PER_CPU(int, trickle_count);
|
|||
* scaled squared error sum) except for the last tap, which is 1 to
|
||||
* get the twisting happening as fast as possible.
|
||||
*/
|
||||
|
||||
static struct poolinfo {
|
||||
int poolwords;
|
||||
int poolbitshift, poolwords, poolbytes, poolbits;
|
||||
#define S(x) ilog2(x)+5, (x), (x)*4, (x)*32
|
||||
int tap1, tap2, tap3, tap4, tap5;
|
||||
} poolinfo_table[] = {
|
||||
/* x^128 + x^103 + x^76 + x^51 +x^25 + x + 1 -- 105 */
|
||||
{ 128, 103, 76, 51, 25, 1 },
|
||||
{ S(128), 103, 76, 51, 25, 1 },
|
||||
/* x^32 + x^26 + x^20 + x^14 + x^7 + x + 1 -- 15 */
|
||||
{ 32, 26, 20, 14, 7, 1 },
|
||||
{ S(32), 26, 20, 14, 7, 1 },
|
||||
#if 0
|
||||
/* x^2048 + x^1638 + x^1231 + x^819 + x^411 + x + 1 -- 115 */
|
||||
{ 2048, 1638, 1231, 819, 411, 1 },
|
||||
{ S(2048), 1638, 1231, 819, 411, 1 },
|
||||
|
||||
/* x^1024 + x^817 + x^615 + x^412 + x^204 + x + 1 -- 290 */
|
||||
{ 1024, 817, 615, 412, 204, 1 },
|
||||
{ S(1024), 817, 615, 412, 204, 1 },
|
||||
|
||||
/* x^1024 + x^819 + x^616 + x^410 + x^207 + x^2 + 1 -- 115 */
|
||||
{ 1024, 819, 616, 410, 207, 2 },
|
||||
{ S(1024), 819, 616, 410, 207, 2 },
|
||||
|
||||
/* x^512 + x^411 + x^308 + x^208 + x^104 + x + 1 -- 225 */
|
||||
{ 512, 411, 308, 208, 104, 1 },
|
||||
{ S(512), 411, 308, 208, 104, 1 },
|
||||
|
||||
/* x^512 + x^409 + x^307 + x^206 + x^102 + x^2 + 1 -- 95 */
|
||||
{ 512, 409, 307, 206, 102, 2 },
|
||||
{ S(512), 409, 307, 206, 102, 2 },
|
||||
/* x^512 + x^409 + x^309 + x^205 + x^103 + x^2 + 1 -- 95 */
|
||||
{ 512, 409, 309, 205, 103, 2 },
|
||||
{ S(512), 409, 309, 205, 103, 2 },
|
||||
|
||||
/* x^256 + x^205 + x^155 + x^101 + x^52 + x + 1 -- 125 */
|
||||
{ 256, 205, 155, 101, 52, 1 },
|
||||
{ S(256), 205, 155, 101, 52, 1 },
|
||||
|
||||
/* x^128 + x^103 + x^78 + x^51 + x^27 + x^2 + 1 -- 70 */
|
||||
{ 128, 103, 78, 51, 27, 2 },
|
||||
{ S(128), 103, 78, 51, 27, 2 },
|
||||
|
||||
/* x^64 + x^52 + x^39 + x^26 + x^14 + x + 1 -- 15 */
|
||||
{ 64, 52, 39, 26, 14, 1 },
|
||||
{ S(64), 52, 39, 26, 14, 1 },
|
||||
#endif
|
||||
};
|
||||
|
||||
#define POOLBITS poolwords*32
|
||||
#define POOLBYTES poolwords*4
|
||||
|
||||
/*
|
||||
* For the purposes of better mixing, we use the CRC-32 polynomial as
|
||||
* well to make a twisted Generalized Feedback Shift Reigster
|
||||
|
@ -599,8 +598,8 @@ retry:
|
|||
if (entropy_count < 0) {
|
||||
DEBUG_ENT("negative entropy/overflow\n");
|
||||
entropy_count = 0;
|
||||
} else if (entropy_count > r->poolinfo->POOLBITS)
|
||||
entropy_count = r->poolinfo->POOLBITS;
|
||||
} else if (entropy_count > r->poolinfo->poolbits)
|
||||
entropy_count = r->poolinfo->poolbits;
|
||||
if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
|
||||
goto retry;
|
||||
|
||||
|
@ -815,7 +814,7 @@ static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
|
|||
__u32 tmp[OUTPUT_POOL_WORDS];
|
||||
|
||||
if (r->pull && r->entropy_count < nbytes * 8 &&
|
||||
r->entropy_count < r->poolinfo->POOLBITS) {
|
||||
r->entropy_count < r->poolinfo->poolbits) {
|
||||
/* If we're limited, always leave two wakeup worth's BITS */
|
||||
int rsvd = r->limit ? 0 : random_read_wakeup_thresh/4;
|
||||
int bytes = nbytes;
|
||||
|
@ -857,7 +856,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
|
|||
/* Hold lock while accounting */
|
||||
spin_lock_irqsave(&r->lock, flags);
|
||||
|
||||
BUG_ON(r->entropy_count > r->poolinfo->POOLBITS);
|
||||
BUG_ON(r->entropy_count > r->poolinfo->poolbits);
|
||||
DEBUG_ENT("trying to extract %zu bits from %s\n",
|
||||
nbytes * 8, r->name);
|
||||
|
||||
|
@ -1112,7 +1111,7 @@ static void init_std_data(struct entropy_store *r)
|
|||
r->entropy_total = 0;
|
||||
r->last_data_init = false;
|
||||
mix_pool_bytes(r, &now, sizeof(now), NULL);
|
||||
for (i = r->poolinfo->POOLBYTES; i > 0; i -= sizeof(rv)) {
|
||||
for (i = r->poolinfo->poolbytes; i > 0; i -= sizeof(rv)) {
|
||||
if (!arch_get_random_long(&rv))
|
||||
break;
|
||||
mix_pool_bytes(r, &rv, sizeof(rv), NULL);
|
||||
|
|
Loading…
Reference in New Issue