From 0dd0219bcb2c36829515fef1fc6c7adf89eb9621 Mon Sep 17 00:00:00 2001 From: "Theodore Y. Ts'o" Date: Mon, 23 Aug 2004 21:44:18 -0700 Subject: [PATCH] [PATCH] dev/random: Fix latency in rekeying sequence number Based on reports from Ingo's Latency Tracer that the TCP sequence number rekey code is causing latency problems, I've moved the sequence number rekey to be done out of a workqueue. Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/char/random.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/drivers/char/random.c b/drivers/char/random.c index a162ddd65f152..27c7c90347efb 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -2247,30 +2247,35 @@ static struct keydata { static spinlock_t ip_lock = SPIN_LOCK_UNLOCKED; static unsigned int ip_cnt; -static struct keydata *__check_and_rekey(time_t time) +static void rekey_seq_generator(void *private_) { struct keydata *keyptr; + struct timeval tv; + + do_gettimeofday(&tv); + spin_lock_bh(&ip_lock); keyptr = &ip_keydata[ip_cnt&1]; - if (!keyptr->rekey_time || (time - keyptr->rekey_time) > REKEY_INTERVAL) { - keyptr = &ip_keydata[1^(ip_cnt&1)]; - keyptr->rekey_time = time; - get_random_bytes(keyptr->secret, sizeof(keyptr->secret)); - keyptr->count = (ip_cnt&COUNT_MASK)<rekey_time = tv.tv_sec; + get_random_bytes(keyptr->secret, sizeof(keyptr->secret)); + keyptr->count = (ip_cnt&COUNT_MASK)<rekey_time || (time - keyptr->rekey_time) > REKEY_INTERVAL) { - keyptr = __check_and_rekey(time); + schedule_work(&rekey_work); } return keyptr; -- 2.53.0