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(-)
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
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
>
--
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.
© 2016 - 2026 Red Hat, Inc.