-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
net: move net_get_random_once to lib
There's no good reason why users outside of networking should not be using this facility, f.e. for initializing their seeds. Therefore, make it accessible from there as get_random_once(). Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Hannes Frederic Sowa
authored and
David S. Miller
committed
Oct 8, 2015
1 parent
28335a7
commit 4623425
Showing
5 changed files
with
84 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#ifndef _LINUX_ONCE_H | ||
#define _LINUX_ONCE_H | ||
|
||
#include <linux/types.h> | ||
#include <linux/jump_label.h> | ||
|
||
bool __get_random_once(void *buf, int nbytes, bool *done, | ||
struct static_key *once_key); | ||
|
||
#define get_random_once(buf, nbytes) \ | ||
({ \ | ||
bool ___ret = false; \ | ||
static bool ___done = false; \ | ||
static struct static_key ___once_key = \ | ||
STATIC_KEY_INIT_TRUE; \ | ||
if (static_key_true(&___once_key)) \ | ||
___ret = __get_random_once((buf), \ | ||
(nbytes), \ | ||
&___done, \ | ||
&___once_key); \ | ||
___ret; \ | ||
}) | ||
|
||
#endif /* _LINUX_ONCE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#include <linux/slab.h> | ||
#include <linux/spinlock.h> | ||
#include <linux/once.h> | ||
#include <linux/random.h> | ||
|
||
struct __random_once_work { | ||
struct work_struct work; | ||
struct static_key *key; | ||
}; | ||
|
||
static void __random_once_deferred(struct work_struct *w) | ||
{ | ||
struct __random_once_work *work; | ||
|
||
work = container_of(w, struct __random_once_work, work); | ||
BUG_ON(!static_key_enabled(work->key)); | ||
static_key_slow_dec(work->key); | ||
kfree(work); | ||
} | ||
|
||
static void __random_once_disable_jump(struct static_key *key) | ||
{ | ||
struct __random_once_work *w; | ||
|
||
w = kmalloc(sizeof(*w), GFP_ATOMIC); | ||
if (!w) | ||
return; | ||
|
||
INIT_WORK(&w->work, __random_once_deferred); | ||
w->key = key; | ||
schedule_work(&w->work); | ||
} | ||
|
||
bool __get_random_once(void *buf, int nbytes, bool *done, | ||
struct static_key *once_key) | ||
{ | ||
static DEFINE_SPINLOCK(lock); | ||
unsigned long flags; | ||
|
||
spin_lock_irqsave(&lock, flags); | ||
if (*done) { | ||
spin_unlock_irqrestore(&lock, flags); | ||
return false; | ||
} | ||
|
||
get_random_bytes(buf, nbytes); | ||
*done = true; | ||
spin_unlock_irqrestore(&lock, flags); | ||
|
||
__random_once_disable_jump(once_key); | ||
|
||
return true; | ||
} | ||
EXPORT_SYMBOL(__get_random_once); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters