diff mbox series

xen: make keyhanler configurable

Message ID 1559267880-27863-1-git-send-email-chenbaodong@mxnavi.com (mailing list archive)
State New, archived
Headers show
Series xen: make keyhanler configurable | expand

Commit Message

chenbaodong May 31, 2019, 1:58 a.m. UTC
keyhandler mainly used for debug usage by developers which can dump
xen module(eg. timer, scheduler) status at runtime by input
character from console.

Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>
---
 xen/arch/arm/gic.c           |  2 ++
 xen/arch/x86/apic.c          |  2 ++
 xen/common/Kconfig           |  9 +++++++++
 xen/common/Makefile          |  2 +-
 xen/common/cpupool.c         |  2 ++
 xen/common/schedule.c        |  2 ++
 xen/include/xen/keyhandler.h | 14 ++++++++++++++
 xen/include/xen/lib.h        |  2 ++
 xen/include/xen/sched.h      |  2 ++
 9 files changed, 36 insertions(+), 1 deletion(-)

Comments

Dario Faggioli May 31, 2019, 10:39 a.m. UTC | #1
On Fri, 2019-05-31 at 09:58 +0800, Baodong Chen wrote:
> keyhandler mainly used for debug usage by developers which can dump
> xen module(eg. timer, scheduler) status at runtime by input
> character from console.
> 
> Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>
> ---

> --- a/xen/common/Kconfig
> +++ b/xen/common/Kconfig
> @@ -368,4 +368,13 @@ config DOM0_MEM
>  
>  	  Leave empty if you are not sure what to specify.
>  
> +config HAS_KEYHANDLER
> +	bool "Enable/Disable keyhandler"
> +	default y
> +	---help---
> +	  Enable or disable keyhandler function.
> +	  keyhandler mainly used for debug usage by developers which
> can dump
> +	  xen module(eg. timer, scheduler) status at runtime by input
> character
> +	  from console.
> +
>  endmenu
>
I personally like the idea.

I've probably would have called the option CONFIG_KEYHANDLERS, even if
I can see that we have quite a few CONFIG_HAS_*.

But it's not for me to ask/decide, and I don't have a too strong
opinion on this anyway, so let's hear what others think.

I'd at least add the 'S', though (as in CONFIG_HAS_KEYHANDLERS).


> --- a/xen/common/cpupool.c
> +++ b/xen/common/cpupool.c
> @@ -699,6 +699,7 @@ int cpupool_do_sysctl(struct
> xen_sysctl_cpupool_op *op)
>      return ret;
>  }
>  
> +#ifdef CONFIG_HAS_KEYHANDLER
>  void dump_runq(unsigned char key)
>  {
>      unsigned long    flags;
> @@ -730,6 +731,7 @@ void dump_runq(unsigned char key)
>      local_irq_restore(flags);
>      spin_unlock(&cpupool_lock);
>  }
> +#endif
>  
>  static int cpu_callback(
>      struct notifier_block *nfb, unsigned long action, void *hcpu)

> --- a/xen/common/schedule.c
> +++ b/xen/common/schedule.c
> @@ -1913,6 +1913,7 @@ void scheduler_free(struct scheduler *sched)
>      xfree(sched);
>  }
>  
> +#ifdef CONFIG_HAS_KEYHANDLER
>  void schedule_dump(struct cpupool *c)
>  {
>      unsigned int      i;
> @@ -1941,6 +1942,7 @@ void schedule_dump(struct cpupool *c)
>              SCHED_OP(sched, dump_cpu_state, i);
>      }
>  }
> +#endif
>  
>  void sched_tick_suspend(void)
>  {
Mmm... a lot of #ifdef-fery spread around quite a bit.. I have to admit
I don't especially like that.

> --- a/xen/include/xen/keyhandler.h
> +++ b/xen/include/xen/keyhandler.h
> @@ -48,4 +49,17 @@ void register_irq_keyhandler(unsigned char key,
>  /* Inject a keypress into the key-handling subsystem. */
>  extern void handle_keypress(unsigned char key, struct cpu_user_regs
> *regs);
>  
> +#else
> +static inline void initialize_keytable(void) {}
> +static inline void register_keyhandler(unsigned char key,
> keyhandler_fn_t *fn,
> +                                       const char *desc, bool_t
> diagnostic) {}
> +static inline void register_irq_keyhandler(unsigned char key,
> +                                           irq_keyhandler_fn_t *fn,
> +                                           const char *desc,
> +                                           bool_t diagnostic) {}
> +
> +static inline void handle_keypress(unsigned char key,
> +                                   struct cpu_user_regs *regs) {}
>
So, with this last change, we have:

static DECLARE_TASKLET(keypress_tasklet, keypress_action, 0);

But since all keypress_action() does is calling handle_keypress(),
which is becoming a nop... can't we kill the tasklet alltogether?


> --- a/xen/include/xen/lib.h
> +++ b/xen/include/xen/lib.h
> @@ -171,8 +171,10 @@ extern unsigned int tainted;
>  extern char *print_tainted(char *str);
>  extern void add_taint(unsigned int taint);
>  
> +#ifdef CONFIG_HAS_KEYHANDLER
>  struct cpu_user_regs;
>  void dump_execstate(struct cpu_user_regs *);
> +#endif
>
Yes. Or, you provide an empty stub of dump_execstate(), if
CONFIG_HAS_KEYHANDLER is not defined, which means we don't have to mess
with #ifdef-s at the caller site(s).

Of course, I'm not maintainer of this specific piece of code, but I'd
prefer this stub-based approach to be used in general.... ... ...
 
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -994,8 +994,10 @@ int cpupool_add_domain(struct domain *d, int
> poolid);
>  void cpupool_rm_domain(struct domain *d);
>  int cpupool_move_domain(struct domain *d, struct cpupool *c);
>  int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op);
> +#ifdef CONFIG_HAS_KEYHANDLER
>  void schedule_dump(struct cpupool *c);
>  extern void dump_runq(unsigned char key);
> +#endif
>  
>  void arch_do_physinfo(struct xen_sysctl_physinfo *pi);
>  
... ... ... Like, for instance, in here.

But again, sine these changes are spread around many files, let's see
what others prefer, and use the same strategy everywhere.

Regards
Juergen Gross May 31, 2019, 10:53 a.m. UTC | #2
On 31/05/2019 03:58, Baodong Chen wrote:
> keyhandler mainly used for debug usage by developers which can dump
> xen module(eg. timer, scheduler) status at runtime by input
> character from console.
> 
> Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>
> ---
>  xen/arch/arm/gic.c           |  2 ++
>  xen/arch/x86/apic.c          |  2 ++
>  xen/common/Kconfig           |  9 +++++++++
>  xen/common/Makefile          |  2 +-
>  xen/common/cpupool.c         |  2 ++
>  xen/common/schedule.c        |  2 ++
>  xen/include/xen/keyhandler.h | 14 ++++++++++++++
>  xen/include/xen/lib.h        |  2 ++
>  xen/include/xen/sched.h      |  2 ++
>  9 files changed, 36 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index 6cc7dec..fff88c5 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -361,7 +361,9 @@ static void do_sgi(struct cpu_user_regs *regs, enum gic_sgi sgi)
>          /* Nothing to do, will check for events on return path */
>          break;
>      case GIC_SGI_DUMP_STATE:
> +#ifdef CONFIG_HAS_KEYHANDLER
>          dump_execstate(regs);
> +#endif
>          break;
>      case GIC_SGI_CALL_FUNCTION:
>          smp_call_function_interrupt();
> diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
> index fafc0bd..e5f004a 100644
> --- a/xen/arch/x86/apic.c
> +++ b/xen/arch/x86/apic.c
> @@ -1410,7 +1410,9 @@ void spurious_interrupt(struct cpu_user_regs *regs)
>          ack_APIC_irq();
>          if (this_cpu(state_dump_pending)) {
>              this_cpu(state_dump_pending) = false;
> +#ifdef CONFIG_HAS_KEYHANDLER
>              dump_execstate(regs);
> +#endif
>              return;
>          }
>      }
> diff --git a/xen/common/Kconfig b/xen/common/Kconfig
> index c838506..450541c 100644
> --- a/xen/common/Kconfig
> +++ b/xen/common/Kconfig
> @@ -368,4 +368,13 @@ config DOM0_MEM
>  
>  	  Leave empty if you are not sure what to specify.
>  
> +config HAS_KEYHANDLER

AFAIK the HAS_* config options are meant to be selected by other options
and not be user selectable.

So I think you should drop the "HAS_" and maybe use the plural as Dario
already suggested ("KEYHANDLERS").

> +	bool "Enable/Disable keyhandler"
> +	default y
> +	---help---
> +	  Enable or disable keyhandler function.
> +	  keyhandler mainly used for debug usage by developers which can dump
> +	  xen module(eg. timer, scheduler) status at runtime by input character
> +	  from console.

I'd drop the "by developers". In case of customer problems with Xen
hosts the output of keyhandlers is requested on a rather regular base.

> +
>  endmenu
> diff --git a/xen/common/Makefile b/xen/common/Makefile
> index bca48e6..c7bcd26 100644
> --- a/xen/common/Makefile
> +++ b/xen/common/Makefile
> @@ -16,7 +16,7 @@ obj-y += guestcopy.o
>  obj-bin-y += gunzip.init.o
>  obj-y += irq.o
>  obj-y += kernel.o
> -obj-y += keyhandler.o
> +obj-$(CONFIG_HAS_KEYHANDLER) += keyhandler.o
>  obj-$(CONFIG_KEXEC) += kexec.o
>  obj-$(CONFIG_KEXEC) += kimage.o
>  obj-y += lib.o
> diff --git a/xen/common/cpupool.c b/xen/common/cpupool.c
> index 31ac323..721a729 100644
> --- a/xen/common/cpupool.c
> +++ b/xen/common/cpupool.c
> @@ -699,6 +699,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
>      return ret;
>  }
>  
> +#ifdef CONFIG_HAS_KEYHANDLER
>  void dump_runq(unsigned char key)
>  {
>      unsigned long    flags;
> @@ -730,6 +731,7 @@ void dump_runq(unsigned char key)
>      local_irq_restore(flags);
>      spin_unlock(&cpupool_lock);
>  }
> +#endif
>  
>  static int cpu_callback(
>      struct notifier_block *nfb, unsigned long action, void *hcpu)
> diff --git a/xen/common/schedule.c b/xen/common/schedule.c
> index 66f1e26..617c444 100644
> --- a/xen/common/schedule.c
> +++ b/xen/common/schedule.c
> @@ -1913,6 +1913,7 @@ void scheduler_free(struct scheduler *sched)
>      xfree(sched);
>  }
>  
> +#ifdef CONFIG_HAS_KEYHANDLER
>  void schedule_dump(struct cpupool *c)
>  {
>      unsigned int      i;
> @@ -1941,6 +1942,7 @@ void schedule_dump(struct cpupool *c)
>              SCHED_OP(sched, dump_cpu_state, i);
>      }
>  }
> +#endif
>  
>  void sched_tick_suspend(void)
>  {
> diff --git a/xen/include/xen/keyhandler.h b/xen/include/xen/keyhandler.h
> index 5131e86..1050b80 100644
> --- a/xen/include/xen/keyhandler.h
> +++ b/xen/include/xen/keyhandler.h
> @@ -28,6 +28,7 @@ struct cpu_user_regs;
>  typedef void (irq_keyhandler_fn_t)(unsigned char key,
>                                     struct cpu_user_regs *regs);
>  
> +#ifdef CONFIG_HAS_KEYHANDLER
>  /* Initialize keytable with default handlers. */
>  void initialize_keytable(void);
>  
> @@ -48,4 +49,17 @@ void register_irq_keyhandler(unsigned char key,
>  /* Inject a keypress into the key-handling subsystem. */
>  extern void handle_keypress(unsigned char key, struct cpu_user_regs *regs);
>  
> +#else
> +static inline void initialize_keytable(void) {}
> +static inline void register_keyhandler(unsigned char key, keyhandler_fn_t *fn,
> +                                       const char *desc, bool_t diagnostic) {}
> +static inline void register_irq_keyhandler(unsigned char key,
> +                                           irq_keyhandler_fn_t *fn,
> +                                           const char *desc,
> +                                           bool_t diagnostic) {}
> +
> +static inline void handle_keypress(unsigned char key,
> +                                   struct cpu_user_regs *regs) {}
> +#endif
> +
>  #endif /* __XEN_KEYHANDLER_H__ */
> diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h
> index e0b7bcb..8710305 100644
> --- a/xen/include/xen/lib.h
> +++ b/xen/include/xen/lib.h
> @@ -171,8 +171,10 @@ extern unsigned int tainted;
>  extern char *print_tainted(char *str);
>  extern void add_taint(unsigned int taint);
>  
> +#ifdef CONFIG_HAS_KEYHANDLER
>  struct cpu_user_regs;
>  void dump_execstate(struct cpu_user_regs *);
> +#endif
>  
>  void init_constructors(void);
>  
> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
> index 748bb0f..b82cdee 100644
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -994,8 +994,10 @@ int cpupool_add_domain(struct domain *d, int poolid);
>  void cpupool_rm_domain(struct domain *d);
>  int cpupool_move_domain(struct domain *d, struct cpupool *c);
>  int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op);
> +#ifdef CONFIG_HAS_KEYHANDLER
>  void schedule_dump(struct cpupool *c);
>  extern void dump_runq(unsigned char key);
> +#endif
>  
>  void arch_do_physinfo(struct xen_sysctl_physinfo *pi);

Why stopping halfway here? There are lots of other keyhandlers which can
be removed for the hypervisor in case there is no code calling them.


Juergen
Andrew Cooper May 31, 2019, 10:30 p.m. UTC | #3
On 30/05/2019 18:58, Baodong Chen wrote:
> keyhandler mainly used for debug usage by developers which can dump
> xen module(eg. timer, scheduler) status at runtime by input
> character from console.
>
> Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>

What is the motivation here?  I don't have a specific objection to
making this configurable (so long as it excises the entire keyhandler
infrastructure, which is rather more than this patch does), but I also
don't see why we would want to do so in the first place.

In particular, it doesn't require a serial console to function correctly
in the first place.  This functionality can be used with `xl debug-keys
$char; xl dmesg`

~Andrew
chenbaodong June 3, 2019, 5:02 a.m. UTC | #4
On 5/31/19 18:39, Dario Faggioli wrote:
> On Fri, 2019-05-31 at 09:58 +0800, Baodong Chen wrote:
>> keyhandler mainly used for debug usage by developers which can dump
>> xen module(eg. timer, scheduler) status at runtime by input
>> character from console.
>>
>> Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>
>> ---
>> --- a/xen/common/Kconfig
>> +++ b/xen/common/Kconfig
>> @@ -368,4 +368,13 @@ config DOM0_MEM
>>   
>>   	  Leave empty if you are not sure what to specify.
>>   
>> +config HAS_KEYHANDLER
>> +	bool "Enable/Disable keyhandler"
>> +	default y
>> +	---help---
>> +	  Enable or disable keyhandler function.
>> +	  keyhandler mainly used for debug usage by developers which
>> can dump
>> +	  xen module(eg. timer, scheduler) status at runtime by input
>> character
>> +	  from console.
>> +
>>   endmenu
>>
> I personally like the idea.
>
> I've probably would have called the option CONFIG_KEYHANDLERS, even if
> I can see that we have quite a few CONFIG_HAS_*.
>
> But it's not for me to ask/decide, and I don't have a too strong
> opinion on this anyway, so let's hear what others think.
>
> I'd at least add the 'S', though (as in CONFIG_HAS_KEYHANDLERS).
Yes, can be fixed.
>
>> --- a/xen/common/cpupool.c
>> +++ b/xen/common/cpupool.c
>> @@ -699,6 +699,7 @@ int cpupool_do_sysctl(struct
>> xen_sysctl_cpupool_op *op)
>>       return ret;
>>   }
>>   
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   void dump_runq(unsigned char key)
>>   {
>>       unsigned long    flags;
>> @@ -730,6 +731,7 @@ void dump_runq(unsigned char key)
>>       local_irq_restore(flags);
>>       spin_unlock(&cpupool_lock);
>>   }
>> +#endif
>>   
>>   static int cpu_callback(
>>       struct notifier_block *nfb, unsigned long action, void *hcpu)
>> --- a/xen/common/schedule.c
>> +++ b/xen/common/schedule.c
>> @@ -1913,6 +1913,7 @@ void scheduler_free(struct scheduler *sched)
>>       xfree(sched);
>>   }
>>   
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   void schedule_dump(struct cpupool *c)
>>   {
>>       unsigned int      i;
>> @@ -1941,6 +1942,7 @@ void schedule_dump(struct cpupool *c)
>>               SCHED_OP(sched, dump_cpu_state, i);
>>       }
>>   }
>> +#endif
>>   
>>   void sched_tick_suspend(void)
>>   {
> Mmm... a lot of #ifdef-fery spread around quite a bit.. I have to admit
> I don't especially like that.

Me too, can leave it as what is was.

but since schedule_dump prototype have external linkage.

so even no one will call it, it maybe still in output executable file, 
right?

>> --- a/xen/include/xen/keyhandler.h
>> +++ b/xen/include/xen/keyhandler.h
>> @@ -48,4 +49,17 @@ void register_irq_keyhandler(unsigned char key,
>>   /* Inject a keypress into the key-handling subsystem. */
>>   extern void handle_keypress(unsigned char key, struct cpu_user_regs
>> *regs);
>>   
>> +#else
>> +static inline void initialize_keytable(void) {}
>> +static inline void register_keyhandler(unsigned char key,
>> keyhandler_fn_t *fn,
>> +                                       const char *desc, bool_t
>> diagnostic) {}
>> +static inline void register_irq_keyhandler(unsigned char key,
>> +                                           irq_keyhandler_fn_t *fn,
>> +                                           const char *desc,
>> +                                           bool_t diagnostic) {}
>> +
>> +static inline void handle_keypress(unsigned char key,
>> +                                   struct cpu_user_regs *regs) {}
>>
> So, with this last change, we have:
>
> static DECLARE_TASKLET(keypress_tasklet, keypress_action, 0);
>
> But since all keypress_action() does is calling handle_keypress(),
> which is becoming a nop... can't we kill the tasklet alltogether?

the whole keyhandler.c will not compiled when config disabled.

am i misunderstood something?

>
>> --- a/xen/include/xen/lib.h
>> +++ b/xen/include/xen/lib.h
>> @@ -171,8 +171,10 @@ extern unsigned int tainted;
>>   extern char *print_tainted(char *str);
>>   extern void add_taint(unsigned int taint);
>>   
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   struct cpu_user_regs;
>>   void dump_execstate(struct cpu_user_regs *);
>> +#endif
>>
> Yes. Or, you provide an empty stub of dump_execstate(), if
> CONFIG_HAS_KEYHANDLER is not defined, which means we don't have to mess
> with #ifdef-s at the caller site(s).
>
> Of course, I'm not maintainer of this specific piece of code, but I'd
> prefer this stub-based approach to be used in general.... ... ...
Agree,  can be fixed.
>   
>> --- a/xen/include/xen/sched.h
>> +++ b/xen/include/xen/sched.h
>> @@ -994,8 +994,10 @@ int cpupool_add_domain(struct domain *d, int
>> poolid);
>>   void cpupool_rm_domain(struct domain *d);
>>   int cpupool_move_domain(struct domain *d, struct cpupool *c);
>>   int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op);
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   void schedule_dump(struct cpupool *c);
>>   extern void dump_runq(unsigned char key);
>> +#endif
>>   
>>   void arch_do_physinfo(struct xen_sysctl_physinfo *pi);
>>   
> ... ... ... Like, for instance, in here.
>
> But again, sine these changes are spread around many files, let's see
> what others prefer, and use the same strategy everywhere.
>
> Regards
chenbaodong June 3, 2019, 5:10 a.m. UTC | #5
On 5/31/19 18:53, Juergen Gross wrote:
> On 31/05/2019 03:58, Baodong Chen wrote:
>> keyhandler mainly used for debug usage by developers which can dump
>> xen module(eg. timer, scheduler) status at runtime by input
>> character from console.
>>
>> Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>
>> ---
>>   xen/arch/arm/gic.c           |  2 ++
>>   xen/arch/x86/apic.c          |  2 ++
>>   xen/common/Kconfig           |  9 +++++++++
>>   xen/common/Makefile          |  2 +-
>>   xen/common/cpupool.c         |  2 ++
>>   xen/common/schedule.c        |  2 ++
>>   xen/include/xen/keyhandler.h | 14 ++++++++++++++
>>   xen/include/xen/lib.h        |  2 ++
>>   xen/include/xen/sched.h      |  2 ++
>>   9 files changed, 36 insertions(+), 1 deletion(-)
>>
>> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
>> index 6cc7dec..fff88c5 100644
>> --- a/xen/arch/arm/gic.c
>> +++ b/xen/arch/arm/gic.c
>> @@ -361,7 +361,9 @@ static void do_sgi(struct cpu_user_regs *regs, enum gic_sgi sgi)
>>           /* Nothing to do, will check for events on return path */
>>           break;
>>       case GIC_SGI_DUMP_STATE:
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>           dump_execstate(regs);
>> +#endif
>>           break;
>>       case GIC_SGI_CALL_FUNCTION:
>>           smp_call_function_interrupt();
>> diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
>> index fafc0bd..e5f004a 100644
>> --- a/xen/arch/x86/apic.c
>> +++ b/xen/arch/x86/apic.c
>> @@ -1410,7 +1410,9 @@ void spurious_interrupt(struct cpu_user_regs *regs)
>>           ack_APIC_irq();
>>           if (this_cpu(state_dump_pending)) {
>>               this_cpu(state_dump_pending) = false;
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>               dump_execstate(regs);
>> +#endif
>>               return;
>>           }
>>       }
>> diff --git a/xen/common/Kconfig b/xen/common/Kconfig
>> index c838506..450541c 100644
>> --- a/xen/common/Kconfig
>> +++ b/xen/common/Kconfig
>> @@ -368,4 +368,13 @@ config DOM0_MEM
>>   
>>   	  Leave empty if you are not sure what to specify.
>>   
>> +config HAS_KEYHANDLER
> AFAIK the HAS_* config options are meant to be selected by other options
> and not be user selectable.
>
> So I think you should drop the "HAS_" and maybe use the plural as Dario
> already suggested ("KEYHANDLERS").
Yes.
>
>> +	bool "Enable/Disable keyhandler"
>> +	default y
>> +	---help---
>> +	  Enable or disable keyhandler function.
>> +	  keyhandler mainly used for debug usage by developers which can dump
>> +	  xen module(eg. timer, scheduler) status at runtime by input character
>> +	  from console.
> I'd drop the "by developers". In case of customer problems with Xen
> hosts the output of keyhandlers is requested on a rather regular base.
Agree, can be fixed.
>
>> +
>>   endmenu
>> diff --git a/xen/common/Makefile b/xen/common/Makefile
>> index bca48e6..c7bcd26 100644
>> --- a/xen/common/Makefile
>> +++ b/xen/common/Makefile
>> @@ -16,7 +16,7 @@ obj-y += guestcopy.o
>>   obj-bin-y += gunzip.init.o
>>   obj-y += irq.o
>>   obj-y += kernel.o
>> -obj-y += keyhandler.o
>> +obj-$(CONFIG_HAS_KEYHANDLER) += keyhandler.o
>>   obj-$(CONFIG_KEXEC) += kexec.o
>>   obj-$(CONFIG_KEXEC) += kimage.o
>>   obj-y += lib.o
>> diff --git a/xen/common/cpupool.c b/xen/common/cpupool.c
>> index 31ac323..721a729 100644
>> --- a/xen/common/cpupool.c
>> +++ b/xen/common/cpupool.c
>> @@ -699,6 +699,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
>>       return ret;
>>   }
>>   
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   void dump_runq(unsigned char key)
>>   {
>>       unsigned long    flags;
>> @@ -730,6 +731,7 @@ void dump_runq(unsigned char key)
>>       local_irq_restore(flags);
>>       spin_unlock(&cpupool_lock);
>>   }
>> +#endif
>>   
>>   static int cpu_callback(
>>       struct notifier_block *nfb, unsigned long action, void *hcpu)
>> diff --git a/xen/common/schedule.c b/xen/common/schedule.c
>> index 66f1e26..617c444 100644
>> --- a/xen/common/schedule.c
>> +++ b/xen/common/schedule.c
>> @@ -1913,6 +1913,7 @@ void scheduler_free(struct scheduler *sched)
>>       xfree(sched);
>>   }
>>   
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   void schedule_dump(struct cpupool *c)
>>   {
>>       unsigned int      i;
>> @@ -1941,6 +1942,7 @@ void schedule_dump(struct cpupool *c)
>>               SCHED_OP(sched, dump_cpu_state, i);
>>       }
>>   }
>> +#endif
>>   
>>   void sched_tick_suspend(void)
>>   {
>> diff --git a/xen/include/xen/keyhandler.h b/xen/include/xen/keyhandler.h
>> index 5131e86..1050b80 100644
>> --- a/xen/include/xen/keyhandler.h
>> +++ b/xen/include/xen/keyhandler.h
>> @@ -28,6 +28,7 @@ struct cpu_user_regs;
>>   typedef void (irq_keyhandler_fn_t)(unsigned char key,
>>                                      struct cpu_user_regs *regs);
>>   
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   /* Initialize keytable with default handlers. */
>>   void initialize_keytable(void);
>>   
>> @@ -48,4 +49,17 @@ void register_irq_keyhandler(unsigned char key,
>>   /* Inject a keypress into the key-handling subsystem. */
>>   extern void handle_keypress(unsigned char key, struct cpu_user_regs *regs);
>>   
>> +#else
>> +static inline void initialize_keytable(void) {}
>> +static inline void register_keyhandler(unsigned char key, keyhandler_fn_t *fn,
>> +                                       const char *desc, bool_t diagnostic) {}
>> +static inline void register_irq_keyhandler(unsigned char key,
>> +                                           irq_keyhandler_fn_t *fn,
>> +                                           const char *desc,
>> +                                           bool_t diagnostic) {}
>> +
>> +static inline void handle_keypress(unsigned char key,
>> +                                   struct cpu_user_regs *regs) {}
>> +#endif
>> +
>>   #endif /* __XEN_KEYHANDLER_H__ */
>> diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h
>> index e0b7bcb..8710305 100644
>> --- a/xen/include/xen/lib.h
>> +++ b/xen/include/xen/lib.h
>> @@ -171,8 +171,10 @@ extern unsigned int tainted;
>>   extern char *print_tainted(char *str);
>>   extern void add_taint(unsigned int taint);
>>   
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   struct cpu_user_regs;
>>   void dump_execstate(struct cpu_user_regs *);
>> +#endif
>>   
>>   void init_constructors(void);
>>   
>> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
>> index 748bb0f..b82cdee 100644
>> --- a/xen/include/xen/sched.h
>> +++ b/xen/include/xen/sched.h
>> @@ -994,8 +994,10 @@ int cpupool_add_domain(struct domain *d, int poolid);
>>   void cpupool_rm_domain(struct domain *d);
>>   int cpupool_move_domain(struct domain *d, struct cpupool *c);
>>   int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op);
>> +#ifdef CONFIG_HAS_KEYHANDLER
>>   void schedule_dump(struct cpupool *c);
>>   extern void dump_runq(unsigned char key);
>> +#endif
>>   
>>   void arch_do_physinfo(struct xen_sysctl_physinfo *pi);
> Why stopping halfway here? There are lots of other keyhandlers which can
> be removed for the hypervisor in case there is no code calling them.

Not sure about 'halfway' this.

Most of the callers for key hander will register a handler function with

**static** prefix. so when config disabled, the static handler function

will not be in final executable file.

so there is no need to spread '#ifdef CONFIG_KEYHANDLERS' to many files.

right?

>
> Juergen
> .
>
chenbaodong June 3, 2019, 5:35 a.m. UTC | #6
On 6/1/19 06:30, Andrew Cooper wrote:
> On 30/05/2019 18:58, Baodong Chen wrote:
>> keyhandler mainly used for debug usage by developers which can dump
>> xen module(eg. timer, scheduler) status at runtime by input
>> character from console.
>>
>> Signed-off-by: Baodong Chen <chenbaodong@mxnavi.com>
> What is the motivation here?  I don't have a specific objection to
> making this configurable (so long as it excises the entire keyhandler
> infrastructure, which is rather more than this patch does), but I also
> don't see why we would want to do so in the first place.
>
> In particular, it doesn't require a serial console to function correctly
> in the first place.  This functionality can be used with `xl debug-keys
> $char; xl dmesg`

IIUC the config cut nearly the entire keyhandler infrastructure.

I'm interested in arm64 automotive use case, safety certification

is nice to have.

so the smaller code base is preferred.

BTW, i heard the works "dom0less", is it possible run vms over xen 
without xl?

> ~Andrew
> .
>
diff mbox series

Patch

diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
index 6cc7dec..fff88c5 100644
--- a/xen/arch/arm/gic.c
+++ b/xen/arch/arm/gic.c
@@ -361,7 +361,9 @@  static void do_sgi(struct cpu_user_regs *regs, enum gic_sgi sgi)
         /* Nothing to do, will check for events on return path */
         break;
     case GIC_SGI_DUMP_STATE:
+#ifdef CONFIG_HAS_KEYHANDLER
         dump_execstate(regs);
+#endif
         break;
     case GIC_SGI_CALL_FUNCTION:
         smp_call_function_interrupt();
diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
index fafc0bd..e5f004a 100644
--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -1410,7 +1410,9 @@  void spurious_interrupt(struct cpu_user_regs *regs)
         ack_APIC_irq();
         if (this_cpu(state_dump_pending)) {
             this_cpu(state_dump_pending) = false;
+#ifdef CONFIG_HAS_KEYHANDLER
             dump_execstate(regs);
+#endif
             return;
         }
     }
diff --git a/xen/common/Kconfig b/xen/common/Kconfig
index c838506..450541c 100644
--- a/xen/common/Kconfig
+++ b/xen/common/Kconfig
@@ -368,4 +368,13 @@  config DOM0_MEM
 
 	  Leave empty if you are not sure what to specify.
 
+config HAS_KEYHANDLER
+	bool "Enable/Disable keyhandler"
+	default y
+	---help---
+	  Enable or disable keyhandler function.
+	  keyhandler mainly used for debug usage by developers which can dump
+	  xen module(eg. timer, scheduler) status at runtime by input character
+	  from console.
+
 endmenu
diff --git a/xen/common/Makefile b/xen/common/Makefile
index bca48e6..c7bcd26 100644
--- a/xen/common/Makefile
+++ b/xen/common/Makefile
@@ -16,7 +16,7 @@  obj-y += guestcopy.o
 obj-bin-y += gunzip.init.o
 obj-y += irq.o
 obj-y += kernel.o
-obj-y += keyhandler.o
+obj-$(CONFIG_HAS_KEYHANDLER) += keyhandler.o
 obj-$(CONFIG_KEXEC) += kexec.o
 obj-$(CONFIG_KEXEC) += kimage.o
 obj-y += lib.o
diff --git a/xen/common/cpupool.c b/xen/common/cpupool.c
index 31ac323..721a729 100644
--- a/xen/common/cpupool.c
+++ b/xen/common/cpupool.c
@@ -699,6 +699,7 @@  int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
     return ret;
 }
 
+#ifdef CONFIG_HAS_KEYHANDLER
 void dump_runq(unsigned char key)
 {
     unsigned long    flags;
@@ -730,6 +731,7 @@  void dump_runq(unsigned char key)
     local_irq_restore(flags);
     spin_unlock(&cpupool_lock);
 }
+#endif
 
 static int cpu_callback(
     struct notifier_block *nfb, unsigned long action, void *hcpu)
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index 66f1e26..617c444 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -1913,6 +1913,7 @@  void scheduler_free(struct scheduler *sched)
     xfree(sched);
 }
 
+#ifdef CONFIG_HAS_KEYHANDLER
 void schedule_dump(struct cpupool *c)
 {
     unsigned int      i;
@@ -1941,6 +1942,7 @@  void schedule_dump(struct cpupool *c)
             SCHED_OP(sched, dump_cpu_state, i);
     }
 }
+#endif
 
 void sched_tick_suspend(void)
 {
diff --git a/xen/include/xen/keyhandler.h b/xen/include/xen/keyhandler.h
index 5131e86..1050b80 100644
--- a/xen/include/xen/keyhandler.h
+++ b/xen/include/xen/keyhandler.h
@@ -28,6 +28,7 @@  struct cpu_user_regs;
 typedef void (irq_keyhandler_fn_t)(unsigned char key,
                                    struct cpu_user_regs *regs);
 
+#ifdef CONFIG_HAS_KEYHANDLER
 /* Initialize keytable with default handlers. */
 void initialize_keytable(void);
 
@@ -48,4 +49,17 @@  void register_irq_keyhandler(unsigned char key,
 /* Inject a keypress into the key-handling subsystem. */
 extern void handle_keypress(unsigned char key, struct cpu_user_regs *regs);
 
+#else
+static inline void initialize_keytable(void) {}
+static inline void register_keyhandler(unsigned char key, keyhandler_fn_t *fn,
+                                       const char *desc, bool_t diagnostic) {}
+static inline void register_irq_keyhandler(unsigned char key,
+                                           irq_keyhandler_fn_t *fn,
+                                           const char *desc,
+                                           bool_t diagnostic) {}
+
+static inline void handle_keypress(unsigned char key,
+                                   struct cpu_user_regs *regs) {}
+#endif
+
 #endif /* __XEN_KEYHANDLER_H__ */
diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h
index e0b7bcb..8710305 100644
--- a/xen/include/xen/lib.h
+++ b/xen/include/xen/lib.h
@@ -171,8 +171,10 @@  extern unsigned int tainted;
 extern char *print_tainted(char *str);
 extern void add_taint(unsigned int taint);
 
+#ifdef CONFIG_HAS_KEYHANDLER
 struct cpu_user_regs;
 void dump_execstate(struct cpu_user_regs *);
+#endif
 
 void init_constructors(void);
 
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 748bb0f..b82cdee 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -994,8 +994,10 @@  int cpupool_add_domain(struct domain *d, int poolid);
 void cpupool_rm_domain(struct domain *d);
 int cpupool_move_domain(struct domain *d, struct cpupool *c);
 int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op);
+#ifdef CONFIG_HAS_KEYHANDLER
 void schedule_dump(struct cpupool *c);
 extern void dump_runq(unsigned char key);
+#endif
 
 void arch_do_physinfo(struct xen_sysctl_physinfo *pi);