summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2022-06-29 14:40:41 +1000
committerDamien George <damien@micropython.org>2022-07-12 16:17:19 +1000
commitdaff597753e699bb9f485e69dea98f58b0c1432d (patch)
treec1d62ee1d94f64e4bb999137b9143f2e1cc57b3a
parent158f1794e87e7860f500622762ec14403ac32f03 (diff)
rp2: Run USB stack task exclusively from core 0.
The goal is to avoid a situation where core 1 is shut down while holding the tinyusb spinlock, which could happen during soft reset if mp_thread_deinit is called while core1 is running tud_task(). This also fixes a latent race where the two cores are competing to decrement and compare `vm_hook_divisor` with no mem fence or atomic protection -- only core0 will now do this. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
-rw-r--r--ports/rp2/mpconfigport.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/ports/rp2/mpconfigport.h b/ports/rp2/mpconfigport.h
index 53437d6c9..ef1e60082 100644
--- a/ports/rp2/mpconfigport.h
+++ b/ports/rp2/mpconfigport.h
@@ -238,7 +238,7 @@ extern const struct _mod_network_nic_type_t mod_network_nic_type_wiznet5k;
#define MICROPY_HW_USBDEV_TASK_HOOK extern void tud_task(void); tud_task();
#define MICROPY_VM_HOOK_COUNT (10)
#define MICROPY_VM_HOOK_INIT static uint vm_hook_divisor = MICROPY_VM_HOOK_COUNT;
-#define MICROPY_VM_HOOK_POLL if (--vm_hook_divisor == 0) { \
+#define MICROPY_VM_HOOK_POLL if (get_core_num() == 0 && --vm_hook_divisor == 0) { \
vm_hook_divisor = MICROPY_VM_HOOK_COUNT; \
MICROPY_HW_USBDEV_TASK_HOOK \
}
@@ -250,7 +250,7 @@ extern const struct _mod_network_nic_type_t mod_network_nic_type_wiznet5k;
#define MICROPY_EVENT_POLL_HOOK_FAST \
do { \
- MICROPY_HW_USBDEV_TASK_HOOK \
+ if (get_core_num() == 0) { MICROPY_HW_USBDEV_TASK_HOOK } \
extern void mp_handle_pending(bool); \
mp_handle_pending(true); \
} while (0)