[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 08/12] libxl: ocaml: drop the ocaml heap lock before calling into libxl
On 26 Nov 2013, at 18:27, David Scott <dave.scott@xxxxxxxxxxxxx> wrote: > On 26/11/13 17:52, Rob Hoes wrote: >> Ocaml has a heap lock which must be held whenever ocaml code is running. >> Ocaml >> usually drops this lock when it enters a potentially blocking low-level >> function, such as writing to a file. Libxl has its own lock, which it may >> acquire when being called. >> >> Things get interesting when libxl calls back into ocaml code. There is a risk >> of ending up in a deadlock when a thread holds both locks at the same time, >> then temporarily drop the ocaml lock, while another thread calls another >> libxl >> function. >> >> To avoid deadlocks, we drop the ocaml heap lock before entering libxl, and >> reacquire it in callbacks to ocaml. This way, the ocaml heap lock is never >> held >> together with the libxl lock, except in osevent registration callbacks, and >> xentoollog callbacks. If we guarantee to not call any libxl functions inside >> those callbacks, we can avoid deadlocks. >> >> This patch handle the dropping and reacquiring of the ocaml heap lock by the >> caml_enter_blocking_section and caml_leave_blocking_section functions, and >> related macros. We are also careful to not call any functions that access the >> ocaml heap while the ocaml heap lock is dropped. This often involves copying >> ocaml values to C before dropping the ocaml lock. > > I think the approach sounds good. One or two questions inline: (I think > only the last comment about Poll_events_val is significant) > >> [...] >> #include "caml_xentoollog.h" >> >> +#define CAMLdone do{ \ >> +caml_local_roots = caml__frame; \ >> +}while (0) > > Might be worth a comment explaining that this is intended to be > "CAMLreturn" without the return. Ok, I’ll add that. >> […] >> @@ -651,9 +715,20 @@ value stub_xl_device_disk_of_vdev(value ctx, value >> domid, value vdev) >> CAMLparam3(ctx, domid, vdev); >> CAMLlocal1(disk); >> libxl_device_disk c_disk; >> - libxl_vdev_to_device_disk(CTX, Int_val(domid), String_val(vdev), >> &c_disk); >> + char *c_vdev; >> + uint32_t c_domid = Int_val(domid); >> + >> + c_vdev = malloc((caml_string_length(vdev) + 1) * sizeof(char *)); >> + strcpy(c_vdev, String_val(vdev)); > > Perhaps this would be clearer as strdup(String_val(vdev))? I guess so! I just copied the example from the OCaml manual, but strdup looks easier indeed. >> […] >> @@ -1197,15 +1335,23 @@ value stub_libxl_osevent_occurred_fd(value ctx, >> value for_libxl, value fd, >> value events, value revents) >> { >> CAMLparam5(ctx, for_libxl, fd, events, revents); >> + >> + caml_enter_blocking_section(); >> libxl_osevent_occurred_fd(CTX, (void *) for_libxl, Int_val(fd), >> Poll_events_val(events), Poll_events_val(revents)); > > Is the "events" OCaml value being accessed here without the heap lock? Yep, I missed that one! I’ll send an updated patch in a minute… Cheers, Rob _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |