Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee1de406 authored by Greg Price's avatar Greg Price Committed by Theodore Ts'o
Browse files

random: simplify accounting logic



This logic is exactly equivalent to the old logic, but it should
be easier to see what it's doing.

The equivalence depends on one fact from outside this function:
when 'r->limit' is false, 'reserved' is zero.  (Well, two facts;
the other is that 'reserved' is never negative.)

Cc: Jiri Kosina <jkosina@suse.cz>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: default avatarGreg Price <price@mit.edu>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 19fa5be1
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -984,14 +984,10 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
		ibytes = 0;
	} else {
		/* If limited, never pull more than available */
		if (r->limit && ibytes + reserved >= have_bytes)
			ibytes = have_bytes - reserved;

		if (have_bytes >= ibytes + reserved)
			entropy_count -= ibytes << (ENTROPY_SHIFT + 3);
		else
			entropy_count = reserved << (ENTROPY_SHIFT + 3);

		if (r->limit)
			ibytes = min_t(size_t, ibytes, have_bytes - reserved);
		entropy_count = max_t(int, 0,
			    entropy_count - (ibytes << (ENTROPY_SHIFT + 3)));
		if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
			goto retry;