Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/usb Avoid race condition. Patch from bouyer@
details: https://anonhg.NetBSD.org/src/rev/57c1b156fd1c
branches: trunk
changeset: 968169:57c1b156fd1c
user: mlelstv <mlelstv%NetBSD.org@localhost>
date: Sat Jan 04 22:30:06 2020 +0000
description:
Avoid race condition. Patch from bouyer@
diffstat:
sys/dev/usb/if_run.c | 11 +++++++----
sys/dev/usb/if_runvar.h | 4 ++--
2 files changed, 9 insertions(+), 6 deletions(-)
diffs (70 lines):
diff -r 514a192ed555 -r 57c1b156fd1c sys/dev/usb/if_run.c
--- a/sys/dev/usb/if_run.c Sat Jan 04 22:28:26 2020 +0000
+++ b/sys/dev/usb/if_run.c Sat Jan 04 22:30:06 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_run.c,v 1.34 2019/12/19 15:17:30 gson Exp $ */
+/* $NetBSD: if_run.c,v 1.35 2020/01/04 22:30:06 mlelstv Exp $ */
/* $OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $ */
/*-
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.34 2019/12/19 15:17:30 gson Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.35 2020/01/04 22:30:06 mlelstv Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -41,6 +41,7 @@
#include <sys/module.h>
#include <sys/conf.h>
#include <sys/device.h>
+#include <sys/atomic.h>
#include <sys/bus.h>
#include <machine/endian.h>
@@ -1784,10 +1785,11 @@
while (ring->next != ring->cur) {
cmd = &ring->cmd[ring->next];
splx(s);
+ membar_consumer();
/* callback */
cmd->cb(sc, cmd->data);
s = splusb();
- ring->queued--;
+ atomic_dec_uint(&ring->queued);
ring->next = (ring->next + 1) % RUN_HOST_CMD_RING_COUNT;
}
wakeup(ring);
@@ -1810,10 +1812,11 @@
cmd->cb = cb;
KASSERT(len <= sizeof(cmd->data));
memcpy(cmd->data, arg, len);
+ membar_producer();
ring->cur = (ring->cur + 1) % RUN_HOST_CMD_RING_COUNT;
/* if there is no pending command already, schedule a task */
- if (++ring->queued == 1)
+ if (atomic_inc_uint_nv(&ring->queued) == 1)
usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
splx(s);
}
diff -r 514a192ed555 -r 57c1b156fd1c sys/dev/usb/if_runvar.h
--- a/sys/dev/usb/if_runvar.h Sat Jan 04 22:28:26 2020 +0000
+++ b/sys/dev/usb/if_runvar.h Sat Jan 04 22:30:06 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_runvar.h,v 1.6 2019/10/08 07:30:58 mlelstv Exp $ */
+/* $NetBSD: if_runvar.h,v 1.7 2020/01/04 22:30:06 mlelstv Exp $ */
/* $OpenBSD: if_runvar.h,v 1.8 2010/02/08 18:46:47 damien Exp $ */
/*-
@@ -93,7 +93,7 @@
struct run_tx_data data[RUN_TX_RING_COUNT];
struct usbd_pipe * pipeh;
int cur;
- int queued;
+ volatile unsigned queued;
uint8_t pipe_no;
};
Home |
Main Index |
Thread Index |
Old Index