]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Apr 2018 12:56:10 +0000 (14:56 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Apr 2018 12:56:10 +0000 (14:56 +0200)
added patches:
random-use-lockless-method-of-accessing-and-updating-f-reg_idx.patch

queue-4.4/random-use-lockless-method-of-accessing-and-updating-f-reg_idx.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/random-use-lockless-method-of-accessing-and-updating-f-reg_idx.patch b/queue-4.4/random-use-lockless-method-of-accessing-and-updating-f-reg_idx.patch
new file mode 100644 (file)
index 0000000..75aa00f
--- /dev/null
@@ -0,0 +1,45 @@
+From 92e75428ffc90e2a0321062379f883f3671cfebe Mon Sep 17 00:00:00 2001
+From: Theodore Ts'o <tytso@mit.edu>
+Date: Wed, 7 Jun 2017 19:01:32 -0400
+Subject: random: use lockless method of accessing and updating f->reg_idx
+
+From: Theodore Ts'o <tytso@mit.edu>
+
+commit 92e75428ffc90e2a0321062379f883f3671cfebe upstream.
+
+Linus pointed out that there is a much more efficient way of avoiding
+the problem that we were trying to address in commit 9dfa7bba35ac0:
+"fix race in drivers/char/random.c:get_reg()".
+
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Cc: Michael Schmitz <schmitzmic@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/char/random.c |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/char/random.c
++++ b/drivers/char/random.c
+@@ -886,15 +886,15 @@ static void add_interrupt_bench(cycles_t
+ static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs)
+ {
+       __u32 *ptr = (__u32 *) regs;
+-      unsigned long flags;
++      unsigned int idx;
+       if (regs == NULL)
+               return 0;
+-      local_irq_save(flags);
+-      if (f->reg_idx >= sizeof(struct pt_regs) / sizeof(__u32))
+-              f->reg_idx = 0;
+-      ptr += f->reg_idx++;
+-      local_irq_restore(flags);
++      idx = READ_ONCE(f->reg_idx);
++      if (idx >= sizeof(struct pt_regs) / sizeof(__u32))
++              idx = 0;
++      ptr += idx++;
++      WRITE_ONCE(f->reg_idx, idx);
+       return *ptr;
+ }
index 226dd287ff026621f085a91396c63f4f62a2c64b..aeee1af1b2cc3cf0b81841b8ac250c49693322b4 100644 (file)
@@ -164,3 +164,4 @@ ipsec-check-return-value-of-skb_to_sgvec-always.patch
 rxrpc-check-return-value-of-skb_to_sgvec-always.patch
 virtio_net-check-return-value-of-skb_to_sgvec-always.patch
 virtio_net-check-return-value-of-skb_to_sgvec-in-one-more-location.patch
+random-use-lockless-method-of-accessing-and-updating-f-reg_idx.patch