Message ID | 1587725152-25569-5-git-send-email-pmorel@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: Testing the Channel Subsystem I/O | expand |
On Fri, 24 Apr 2020 12:45:46 +0200 Pierre Morel <pmorel@linux.ibm.com> wrote: > Let's make it possible to add and remove a custom io interrupt handler, > that can be used instead of the normal one. > > Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> > Reviewed-by: Thomas Huth <thuth@redhat.com> > Reviewed-by: David Hildenbrand <david@redhat.com> > Reviewed-by: Janosch Frank <frankja@linux.ibm.com> > --- > lib/s390x/interrupt.c | 23 ++++++++++++++++++++++- > lib/s390x/interrupt.h | 8 ++++++++ > 2 files changed, 30 insertions(+), 1 deletion(-) > create mode 100644 lib/s390x/interrupt.h As the "normal one" means "no handler, just abort", is there any reason not simply to always provide one? What is the use case for multiple I/O interrupt handlers?
On 2020-05-14 13:58, Cornelia Huck wrote: > On Fri, 24 Apr 2020 12:45:46 +0200 > Pierre Morel <pmorel@linux.ibm.com> wrote: > >> Let's make it possible to add and remove a custom io interrupt handler, >> that can be used instead of the normal one. >> >> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> >> Reviewed-by: Thomas Huth <thuth@redhat.com> >> Reviewed-by: David Hildenbrand <david@redhat.com> >> Reviewed-by: Janosch Frank <frankja@linux.ibm.com> >> --- >> lib/s390x/interrupt.c | 23 ++++++++++++++++++++++- >> lib/s390x/interrupt.h | 8 ++++++++ >> 2 files changed, 30 insertions(+), 1 deletion(-) >> create mode 100644 lib/s390x/interrupt.h > > As the "normal one" means "no handler, just abort", is there any reason > not simply to always provide one? What is the use case for multiple I/O > interrupt handlers? > I can only agree, I proposed this initially. David asked for a registration.
On 15.05.20 08:57, Pierre Morel wrote: > > > On 2020-05-14 13:58, Cornelia Huck wrote: >> On Fri, 24 Apr 2020 12:45:46 +0200 >> Pierre Morel <pmorel@linux.ibm.com> wrote: >> >>> Let's make it possible to add and remove a custom io interrupt handler, >>> that can be used instead of the normal one. >>> >>> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> >>> Reviewed-by: Thomas Huth <thuth@redhat.com> >>> Reviewed-by: David Hildenbrand <david@redhat.com> >>> Reviewed-by: Janosch Frank <frankja@linux.ibm.com> >>> --- >>> lib/s390x/interrupt.c | 23 ++++++++++++++++++++++- >>> lib/s390x/interrupt.h | 8 ++++++++ >>> 2 files changed, 30 insertions(+), 1 deletion(-) >>> create mode 100644 lib/s390x/interrupt.h >> >> As the "normal one" means "no handler, just abort", is there any reason >> not simply to always provide one? What is the use case for multiple I/O >> interrupt handlers? >> > > I can only agree, I proposed this initially. > David asked for a registration. > I don't understand "not simply to always provide one" or "multiple I/O interrupt handlers". There is always exactly *one* handler void handle_io_int(void) { ... } All we do here, is to allow to register a callback from the handler, e.g., to verify in a test case that a specific I/O interrupt was received.
diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c index 3a40cac..243b9c2 100644 --- a/lib/s390x/interrupt.c +++ b/lib/s390x/interrupt.c @@ -10,9 +10,9 @@ * under the terms of the GNU Library General Public License version 2. */ #include <libcflat.h> -#include <asm/interrupt.h> #include <asm/barrier.h> #include <sclp.h> +#include <interrupt.h> static bool pgm_int_expected; static bool ext_int_expected; @@ -144,12 +144,33 @@ void handle_mcck_int(void) stap(), lc->mcck_old_psw.addr); } +static void (*io_int_func)(void); + void handle_io_int(void) { + if (io_int_func) + return io_int_func(); + report_abort("Unexpected io interrupt: on cpu %d at %#lx", stap(), lc->io_old_psw.addr); } +int register_io_int_func(void (*f)(void)) +{ + if (io_int_func) + return -1; + io_int_func = f; + return 0; +} + +int unregister_io_int_func(void (*f)(void)) +{ + if (io_int_func != f) + return -1; + io_int_func = NULL; + return 0; +} + void handle_svc_int(void) { report_abort("Unexpected supervisor call interrupt: on cpu %d at %#lx", diff --git a/lib/s390x/interrupt.h b/lib/s390x/interrupt.h new file mode 100644 index 0000000..323258d --- /dev/null +++ b/lib/s390x/interrupt.h @@ -0,0 +1,8 @@ +#ifndef __INTERRUPT_H +#define __INTERRUPT_H +#include <asm/interrupt.h> + +int register_io_int_func(void (*f)(void)); +int unregister_io_int_func(void (*f)(void)); + +#endif /* __INTERRUPT_H */