Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1231037

[PATCH 2/3] random: Make input to output pool balancing per cpu

From Andi Kleen <andi@firstfloor.org>
Newsgroups linux.kernel
Subject [PATCH 2/3] random: Make input to output pool balancing per cpu
Date 2015-09-23 01:20 +0200
Message-ID <qbF0T-35n-33@gated-at.bofh.it> (permalink)
References <qbF0S-35n-15@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Andi Kleen <ak@linux.intel.com>

The load balancing from input pool to output pools was
essentially unlocked. Before it didn't matter much because
there were only two choices (blocking and non blocking).

But now with the distributed non blocking pools we have
a lot more pools, and unlocked access of the counters
may systematically deprive some nodes from their deserved
entropy.

Turn the round-robin state into per CPU variables
to avoid any possibility of races. This code already
runs with preemption disabled.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
 drivers/char/random.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/char/random.c b/drivers/char/random.c
index d0302be..b74919a 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -743,15 +743,20 @@ retry:
 		if (entropy_bits > random_write_wakeup_bits &&
 		    r->initialized &&
 		    r->entropy_total >= 2*random_read_wakeup_bits) {
-			static struct entropy_store *last = &blocking_pool;
-			static int next_pool = -1;
-			struct entropy_store *other = &blocking_pool;
+			static DEFINE_PER_CPU(struct entropy_store *, lastp) =
+				&blocking_pool;
+			static DEFINE_PER_CPU(int, next_pool);
+			struct entropy_store *other = &blocking_pool, *last;
+			int np;
 
 			/* -1: use blocking pool, 0<=max_node: node nb pool */
-			if (next_pool > -1)
-				other = nonblocking_node_pool[next_pool];
-			if (++next_pool >= num_possible_nodes())
-				next_pool = -1;
+			np = __this_cpu_read(next_pool);
+			if (np > -1)
+				other = nonblocking_node_pool[np];
+			if (++np >= num_possible_nodes())
+				np = -1;
+			__this_cpu_write(next_pool, np);
+			last = __this_cpu_read(lastp);
 			if (other->entropy_count <=
 			    3 * other->poolinfo->poolfracbits / 4)
 				last = other;
@@ -760,6 +765,7 @@ retry:
 				schedule_work(&last->push_work);
 				r->entropy_total = 0;
 			}
+			__this_cpu_write(lastp, last);
 		}
 	}
 }
-- 
2.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 1/3] Make /dev/urandom scalable Andi Kleen <andi@firstfloor.org> - 2015-09-23 01:20 +0200
  [PATCH 2/3] random: Make input to output pool balancing per cpu Andi Kleen <andi@firstfloor.org> - 2015-09-23 01:20 +0200
  Re: [PATCH 1/3] Make /dev/urandom scalable Andi Kleen <andi@firstfloor.org> - 2015-09-23 01:30 +0200
  Re: [PATCH 1/3] Make /dev/urandom scalable Rasmus Villemoes <linux@rasmusvillemoes.dk> - 2015-09-23 12:40 +0200
    Re: [PATCH 1/3] Make /dev/urandom scalable Andi Kleen <andi@firstfloor.org> - 2015-09-24 00:00 +0200
  Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-23 21:50 +0200
    Re: [PATCH 1/3] Make /dev/urandom scalable Andi Kleen <andi@firstfloor.org> - 2015-09-24 01:30 +0200
      Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-24 13:40 +0200
        Re: [PATCH 1/3] Make /dev/urandom scalable Theodore Ts'o <tytso@mit.edu> - 2015-09-24 15:20 +0200
          Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-24 18:10 +0200
            Re: [PATCH 1/3] Make /dev/urandom scalable Jeff Epler <jepler@unpythonic.net> - 2015-09-24 19:00 +0200
              Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-24 21:20 +0200
                Re: [PATCH 1/3] Make /dev/urandom scalable Jeff Epler <jepler@unpythonic.net> - 2015-09-24 22:10 +0200
                Re: [PATCH 1/3] Make /dev/urandom scalable Theodore Ts'o <tytso@mit.edu> - 2015-09-24 22:20 +0200
                Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-25 13:50 +0200
                Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-25 21:10 +0200
                Re: [PATCH 1/3] Make /dev/urandom scalable Theodore Ts'o <tytso@mit.edu> - 2015-09-25 22:30 +0200
                Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-29 14:10 +0200
                Re: [PATCH 1/3] Make /dev/urandom scalable Austin S Hemmelgarn <ahferroin7@gmail.com> - 2015-09-29 14:00 +0200
  Re: [PATCH 1/3] Make /dev/urandom scalable Theodore Ts'o <tytso@mit.edu> - 2015-09-23 23:20 +0200
    Re: [PATCH 1/3] Make /dev/urandom scalable Andi Kleen <ak@linux.intel.com> - 2015-09-23 23:30 +0200

csiph-web