]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.0-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 6 Mar 2013 04:54:20 +0000 (12:54 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 6 Mar 2013 04:54:20 +0000 (12:54 +0800)
added patches:
hw_random-make-buffer-usable-in-scatterlist.patch

queue-3.0/hw_random-make-buffer-usable-in-scatterlist.patch [new file with mode: 0644]
queue-3.0/series

diff --git a/queue-3.0/hw_random-make-buffer-usable-in-scatterlist.patch b/queue-3.0/hw_random-make-buffer-usable-in-scatterlist.patch
new file mode 100644 (file)
index 0000000..1f537b9
--- /dev/null
@@ -0,0 +1,75 @@
+From f7f154f1246ccc5a0a7e9ce50932627d60a0c878 Mon Sep 17 00:00:00 2001
+From: Rusty Russell <rusty@rustcorp.com.au>
+Date: Tue, 5 Mar 2013 10:07:08 +1030
+Subject: hw_random: make buffer usable in scatterlist.
+
+From: Rusty Russell <rusty@rustcorp.com.au>
+
+commit f7f154f1246ccc5a0a7e9ce50932627d60a0c878 upstream.
+
+virtio_rng feeds the randomness buffer handed by the core directly
+into the scatterlist, since commit bb347d98079a547e80bd4722dee1de61e4dca0e8.
+
+However, if CONFIG_HW_RANDOM=m, the static buffer isn't a linear address
+(at least on most archs).  We could fix this in virtio_rng, but it's actually
+far easier to just do it in the core as virtio_rng would have to allocate
+a buffer every time (it doesn't know how much the core will want to read).
+
+Reported-by: Aurelien Jarno <aurelien@aurel32.net>
+Tested-by: Aurelien Jarno <aurelien@aurel32.net>
+Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/char/hw_random/core.c |   19 ++++++++++++++++---
+ 1 file changed, 16 insertions(+), 3 deletions(-)
+
+--- a/drivers/char/hw_random/core.c
++++ b/drivers/char/hw_random/core.c
+@@ -40,6 +40,7 @@
+ #include <linux/init.h>
+ #include <linux/miscdevice.h>
+ #include <linux/delay.h>
++#include <linux/slab.h>
+ #include <asm/uaccess.h>
+@@ -52,8 +53,12 @@ static struct hwrng *current_rng;
+ static LIST_HEAD(rng_list);
+ static DEFINE_MUTEX(rng_mutex);
+ static int data_avail;
+-static u8 rng_buffer[SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES]
+-      __cacheline_aligned;
++static u8 *rng_buffer;
++
++static size_t rng_buffer_size(void)
++{
++      return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
++}
+ static inline int hwrng_init(struct hwrng *rng)
+ {
+@@ -116,7 +121,7 @@ static ssize_t rng_dev_read(struct file
+               if (!data_avail) {
+                       bytes_read = rng_get_data(current_rng, rng_buffer,
+-                              sizeof(rng_buffer),
++                              rng_buffer_size(),
+                               !(filp->f_flags & O_NONBLOCK));
+                       if (bytes_read < 0) {
+                               err = bytes_read;
+@@ -307,6 +312,14 @@ int hwrng_register(struct hwrng *rng)
+       mutex_lock(&rng_mutex);
++      /* kmalloc makes this safe for virt_to_page() in virtio_rng.c */
++      err = -ENOMEM;
++      if (!rng_buffer) {
++              rng_buffer = kmalloc(rng_buffer_size(), GFP_KERNEL);
++              if (!rng_buffer)
++                      goto out_unlock;
++      }
++
+       /* Must not register two RNGs with the same name. */
+       err = -EEXIST;
+       list_for_each_entry(tmp, &rng_list, list) {
index d3df148fe6927db0f1cf3d0d3fb60ad8817c3ad9..99e0687e8a77de3fe4f2a51371e3a1e23614a4d1 100644 (file)
@@ -5,3 +5,4 @@ target-pscsi-fix-page-increment.patch
 btrfs-init-io_lock-after-cloning-btrfs-device-struct.patch
 cifs-ensure-that-cifs_get_root-only-traverses-directories.patch
 sunrpc-don-t-start-the-retransmission-timer-when-out-of-socket-space.patch
+hw_random-make-buffer-usable-in-scatterlist.patch