Message ID | 20231211134827.7130-3-jgross@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Mini-OS: fix and cleanup of event handling | expand |
Juergen Gross, le lun. 11 déc. 2023 14:48:26 +0100, a ecrit: > Now that do_hypervisor_callback() is always called with interrupts off > the in_callback variable meant to handle recursive calls of > do_hypervisor_callback() can be dropped. > > As a precaution add a test to do_hypervisor_callback() that interrupts > are really disabled and crash in case this is not true. That paragraph was for the previous commit ;) > Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org> Thanks! > --- > hypervisor.c | 6 ------ > include/hypervisor.h | 2 -- > sched.c | 11 ----------- > 3 files changed, 19 deletions(-) > > diff --git a/hypervisor.c b/hypervisor.c > index 5309daa3..6facce3e 100644 > --- a/hypervisor.c > +++ b/hypervisor.c > @@ -37,8 +37,6 @@ EXPORT_SYMBOL(hypercall_page); > ((sh)->evtchn_pending[idx] & \ > ~(sh)->evtchn_mask[idx]) > > -int in_callback; > - > #ifndef CONFIG_PARAVIRT > extern shared_info_t shared_info; > > @@ -104,8 +102,6 @@ void do_hypervisor_callback(struct pt_regs *regs) > > BUG_ON(!irqs_disabled()); > > - in_callback = 1; > - > vcpu_info->evtchn_upcall_pending = 0; > /* NB x86. No need for a barrier here -- XCHG is a barrier on x86. */ > #if !defined(__i386__) && !defined(__x86_64__) > @@ -127,8 +123,6 @@ void do_hypervisor_callback(struct pt_regs *regs) > do_event(port, regs); > } > } > - > - in_callback = 0; > } > > void force_evtchn_callback(void) > diff --git a/include/hypervisor.h b/include/hypervisor.h > index 1d092719..b852a42a 100644 > --- a/include/hypervisor.h > +++ b/include/hypervisor.h > @@ -50,6 +50,4 @@ void mask_evtchn(uint32_t port); > void unmask_evtchn(uint32_t port); > void clear_evtchn(uint32_t port); > > -extern int in_callback; > - > #endif /* __HYPERVISOR_H__ */ > diff --git a/sched.c b/sched.c > index e162cb60..3335efa0 100644 > --- a/sched.c > +++ b/sched.c > @@ -76,11 +76,6 @@ void schedule(void) > prev = current; > local_irq_save(flags); > > - if (in_callback) { > - printk("Must not call schedule() from a callback\n"); > - BUG(); > - } > - > do { > /* Examine all threads. > Find a runnable thread, but also wake up expired ones and find the > @@ -151,15 +146,12 @@ struct thread* create_thread(char *name, void (*function)(void *), void *data) > EXPORT_SYMBOL(create_thread); > > #ifdef HAVE_LIBC > -static struct _reent callback_reent; > struct _reent *__getreent(void) > { > struct _reent *_reent; > > if (!threads_started) > _reent = _impure_ptr; > - else if (in_callback) > - _reent = &callback_reent; > else > _reent = &get_current()->reent; > > @@ -246,9 +238,6 @@ void init_sched(void) > { > printk("Initialising scheduler\n"); > > -#ifdef HAVE_LIBC > - _REENT_INIT_PTR((&callback_reent)) > -#endif > idle_thread = create_thread("Idle", idle_thread_fn, NULL); > } > > -- > 2.35.3 >
diff --git a/hypervisor.c b/hypervisor.c index 5309daa3..6facce3e 100644 --- a/hypervisor.c +++ b/hypervisor.c @@ -37,8 +37,6 @@ EXPORT_SYMBOL(hypercall_page); ((sh)->evtchn_pending[idx] & \ ~(sh)->evtchn_mask[idx]) -int in_callback; - #ifndef CONFIG_PARAVIRT extern shared_info_t shared_info; @@ -104,8 +102,6 @@ void do_hypervisor_callback(struct pt_regs *regs) BUG_ON(!irqs_disabled()); - in_callback = 1; - vcpu_info->evtchn_upcall_pending = 0; /* NB x86. No need for a barrier here -- XCHG is a barrier on x86. */ #if !defined(__i386__) && !defined(__x86_64__) @@ -127,8 +123,6 @@ void do_hypervisor_callback(struct pt_regs *regs) do_event(port, regs); } } - - in_callback = 0; } void force_evtchn_callback(void) diff --git a/include/hypervisor.h b/include/hypervisor.h index 1d092719..b852a42a 100644 --- a/include/hypervisor.h +++ b/include/hypervisor.h @@ -50,6 +50,4 @@ void mask_evtchn(uint32_t port); void unmask_evtchn(uint32_t port); void clear_evtchn(uint32_t port); -extern int in_callback; - #endif /* __HYPERVISOR_H__ */ diff --git a/sched.c b/sched.c index e162cb60..3335efa0 100644 --- a/sched.c +++ b/sched.c @@ -76,11 +76,6 @@ void schedule(void) prev = current; local_irq_save(flags); - if (in_callback) { - printk("Must not call schedule() from a callback\n"); - BUG(); - } - do { /* Examine all threads. Find a runnable thread, but also wake up expired ones and find the @@ -151,15 +146,12 @@ struct thread* create_thread(char *name, void (*function)(void *), void *data) EXPORT_SYMBOL(create_thread); #ifdef HAVE_LIBC -static struct _reent callback_reent; struct _reent *__getreent(void) { struct _reent *_reent; if (!threads_started) _reent = _impure_ptr; - else if (in_callback) - _reent = &callback_reent; else _reent = &get_current()->reent; @@ -246,9 +238,6 @@ void init_sched(void) { printk("Initialising scheduler\n"); -#ifdef HAVE_LIBC - _REENT_INIT_PTR((&callback_reent)) -#endif idle_thread = create_thread("Idle", idle_thread_fn, NULL); }
Now that do_hypervisor_callback() is always called with interrupts off the in_callback variable meant to handle recursive calls of do_hypervisor_callback() can be dropped. As a precaution add a test to do_hypervisor_callback() that interrupts are really disabled and crash in case this is not true. Signed-off-by: Juergen Gross <jgross@suse.com> --- hypervisor.c | 6 ------ include/hypervisor.h | 2 -- sched.c | 11 ----------- 3 files changed, 19 deletions(-)