random: simplify accounting logic
authorGreg Price <price@MIT.EDU>
Fri, 29 Nov 2013 20:56:16 +0000 (15:56 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 20 Mar 2014 02:18:51 +0000 (22:18 -0400)
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: Greg Price <price@mit.edu>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
drivers/char/random.c

index 2c532a6b0a219f53244ee0ef2c0fdb08195027e8..9675821b4b5af05b7c057e90603b329d5232392b 100644 (file)
@@ -984,14 +984,10 @@ retry:
                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;