[xen staging] tools/ocaml: Release the global lock before invoking block syscalls

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen staging] tools/ocaml: Release the global lock before invoking block syscalls

patchbot
commit 7b20a865bc105fe566156201c8e6c37ef692e3dd
Author:     Yang Qian <[hidden email]>
AuthorDate: Mon Oct 8 11:10:14 2018 +0800
Commit:     Andrew Cooper <[hidden email]>
CommitDate: Mon Oct 8 10:58:55 2018 +0100

    tools/ocaml: Release the global lock before invoking block syscalls
   
    Functions related with event channel are parallelizable, so release global
    lock before invoking C function which will finally call block syscalls.
   
    Signed-off-by: Yang Qian <[hidden email]>
    Acked-by: Christian Lindig <[hidden email]>
    Reviewed-by: Andrew Cooper <[hidden email]>
---
 tools/ocaml/libs/eventchn/xeneventchn_stubs.c | 30 +++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c
index 2b7984fb0d..ba40078d09 100644
--- a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c
+++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c
@@ -32,6 +32,7 @@
 #include <caml/custom.h>
 #include <caml/callback.h>
 #include <caml/fail.h>
+#include <caml/signals.h>
 
 #define _H(__h) ((xenevtchn_handle *)(__h))
 
@@ -39,8 +40,12 @@ CAMLprim value stub_eventchn_init(void)
 {
  CAMLparam0();
  CAMLlocal1(result);
+ xenevtchn_handle *xce;
+
+ caml_enter_blocking_section();
+ xce = xenevtchn_open(NULL, 0);
+ caml_leave_blocking_section();
 
- xenevtchn_handle *xce = xenevtchn_open(NULL, 0);
  if (xce == NULL)
  caml_failwith("open failed");
 
@@ -68,7 +73,10 @@ CAMLprim value stub_eventchn_notify(value xce, value port)
  CAMLparam2(xce, port);
  int rc;
 
+ caml_enter_blocking_section();
  rc = xenevtchn_notify(_H(xce), Int_val(port));
+ caml_leave_blocking_section();
+
  if (rc == -1)
  caml_failwith("evtchn notify failed");
 
@@ -82,7 +90,10 @@ CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
  CAMLlocal1(port);
  xenevtchn_port_or_error_t rc;
 
+ caml_enter_blocking_section();
  rc = xenevtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port));
+ caml_leave_blocking_section();
+
  if (rc == -1)
  caml_failwith("evtchn bind_interdomain failed");
  port = Val_int(rc);
@@ -96,7 +107,10 @@ CAMLprim value stub_eventchn_bind_virq(value xce, value virq_type)
  CAMLlocal1(port);
  xenevtchn_port_or_error_t rc;
 
+ caml_enter_blocking_section();
  rc = xenevtchn_bind_virq(_H(xce), Int_val(virq_type));
+ caml_leave_blocking_section();
+
  if (rc == -1)
  caml_failwith("evtchn bind_virq failed");
  port = Val_int(rc);
@@ -109,7 +123,10 @@ CAMLprim value stub_eventchn_unbind(value xce, value port)
  CAMLparam2(xce, port);
  int rc;
 
+ caml_enter_blocking_section();
  rc = xenevtchn_unbind(_H(xce), Int_val(port));
+ caml_leave_blocking_section();
+
  if (rc == -1)
  caml_failwith("evtchn unbind failed");
 
@@ -122,7 +139,10 @@ CAMLprim value stub_eventchn_pending(value xce)
  CAMLlocal1(result);
  xenevtchn_port_or_error_t port;
 
+ caml_enter_blocking_section();
  port = xenevtchn_pending(_H(xce));
+ caml_leave_blocking_section();
+
  if (port == -1)
  caml_failwith("evtchn pending failed");
  result = Val_int(port);
@@ -134,9 +154,15 @@ CAMLprim value stub_eventchn_unmask(value xce, value _port)
 {
  CAMLparam2(xce, _port);
  evtchn_port_t port;
+ int rc;
 
  port = Int_val(_port);
- if (xenevtchn_unmask(_H(xce), port))
+
+ caml_enter_blocking_section();
+ rc = xenevtchn_unmask(_H(xce), port);
+ caml_leave_blocking_section();
+
+ if (rc)
  caml_failwith("evtchn unmask failed");
  CAMLreturn(Val_unit);
 }
--
generated by git-patchbot for /home/xen/git/xen.git#staging

_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog