提交 968ea0d0 编写于 作者: J Jason A. Donenfeld 提交者: Zheng Zengkai

random: make random_get_entropy() return an unsigned long

stable inclusion
from stable-v5.10.119
commit a1b5c849d855c97f75375c564321961ad18b8f46
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5L6BB

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=a1b5c849d855c97f75375c564321961ad18b8f46

--------------------------------

commit b0c3e796 upstream.

Some implementations were returning type `unsigned long`, while others
that fell back to get_cycles() were implicitly returning a `cycles_t` or
an untyped constant int literal. That makes for weird and confusing
code, and basically all code in the kernel already handled it like it
was an `unsigned long`. I recently tried to handle it as the largest
type it could be, a `cycles_t`, but doing so doesn't really help with
much.

Instead let's just make random_get_entropy() return an unsigned long all
the time. This also matches the commonly used `arch_get_random_long()`
function, so now RDRAND and RDTSC return the same sized integer, which
means one can fallback to the other more gracefully.

Cc: Dominik Brodowski <linux@dominikbrodowski.net>
Cc: Theodore Ts'o <tytso@mit.edu>
Acked-by: NThomas Gleixner <tglx@linutronix.de>
Signed-off-by: NJason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
上级 92c8ef8a
...@@ -1015,7 +1015,7 @@ int __init rand_initialize(void) ...@@ -1015,7 +1015,7 @@ int __init rand_initialize(void)
*/ */
void add_device_randomness(const void *buf, size_t size) void add_device_randomness(const void *buf, size_t size)
{ {
cycles_t cycles = random_get_entropy(); unsigned long cycles = random_get_entropy();
unsigned long flags, now = jiffies; unsigned long flags, now = jiffies;
if (crng_init == 0 && size) if (crng_init == 0 && size)
...@@ -1046,8 +1046,7 @@ struct timer_rand_state { ...@@ -1046,8 +1046,7 @@ struct timer_rand_state {
*/ */
static void add_timer_randomness(struct timer_rand_state *state, unsigned int num) static void add_timer_randomness(struct timer_rand_state *state, unsigned int num)
{ {
cycles_t cycles = random_get_entropy(); unsigned long cycles = random_get_entropy(), now = jiffies, flags;
unsigned long flags, now = jiffies;
long delta, delta2, delta3; long delta, delta2, delta3;
spin_lock_irqsave(&input_pool.lock, flags); spin_lock_irqsave(&input_pool.lock, flags);
...@@ -1302,8 +1301,7 @@ static void mix_interrupt_randomness(struct work_struct *work) ...@@ -1302,8 +1301,7 @@ static void mix_interrupt_randomness(struct work_struct *work)
void add_interrupt_randomness(int irq) void add_interrupt_randomness(int irq)
{ {
enum { MIX_INFLIGHT = 1U << 31 }; enum { MIX_INFLIGHT = 1U << 31 };
cycles_t cycles = random_get_entropy(); unsigned long cycles = random_get_entropy(), now = jiffies;
unsigned long now = jiffies;
struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness);
struct pt_regs *regs = get_irq_regs(); struct pt_regs *regs = get_irq_regs();
unsigned int new_count; unsigned int new_count;
...@@ -1316,16 +1314,12 @@ void add_interrupt_randomness(int irq) ...@@ -1316,16 +1314,12 @@ void add_interrupt_randomness(int irq)
if (cycles == 0) if (cycles == 0)
cycles = get_reg(fast_pool, regs); cycles = get_reg(fast_pool, regs);
if (sizeof(cycles) == 8) if (sizeof(unsigned long) == 8) {
irq_data.u64[0] = cycles ^ rol64(now, 32) ^ irq; irq_data.u64[0] = cycles ^ rol64(now, 32) ^ irq;
else { irq_data.u64[1] = regs ? instruction_pointer(regs) : _RET_IP_;
} else {
irq_data.u32[0] = cycles ^ irq; irq_data.u32[0] = cycles ^ irq;
irq_data.u32[1] = now; irq_data.u32[1] = now;
}
if (sizeof(unsigned long) == 8)
irq_data.u64[1] = regs ? instruction_pointer(regs) : _RET_IP_;
else {
irq_data.u32[2] = regs ? instruction_pointer(regs) : _RET_IP_; irq_data.u32[2] = regs ? instruction_pointer(regs) : _RET_IP_;
irq_data.u32[3] = get_reg(fast_pool, regs); irq_data.u32[3] = get_reg(fast_pool, regs);
} }
...@@ -1372,7 +1366,7 @@ static void entropy_timer(struct timer_list *t) ...@@ -1372,7 +1366,7 @@ static void entropy_timer(struct timer_list *t)
static void try_to_generate_entropy(void) static void try_to_generate_entropy(void)
{ {
struct { struct {
cycles_t cycles; unsigned long cycles;
struct timer_list timer; struct timer_list timer;
} stack; } stack;
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
* By default we use get_cycles() for this purpose, but individual * By default we use get_cycles() for this purpose, but individual
* architectures may override this in their asm/timex.h header file. * architectures may override this in their asm/timex.h header file.
*/ */
#define random_get_entropy() get_cycles() #define random_get_entropy() ((unsigned long)get_cycles())
#endif #endif
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册