|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1] tools/ocaml: xenbus - Fix handling of requests with len = 0 for socket connections
On Thu, Jul 09, 2026 at 12:00:09PM +0000, Andrii Sultanov wrote: > Following the report at > https://lore.kernel.org/xen-devel/CAFLBxZaeTMcF4tcV45MJdCVx4A6qbzQdjKei_Quh_iLrtARVFA@xxxxxxxxxxxxxx/ > > Without this fix, the backend would be stuck waiting on the zero-sized > body until the next request comes in. > > Instead return the request immediately after reading the header, there's > no need to wait for another call to .has_more_input and .input > > Reported-by: George Dunlap <dunlapg@xxxxxxxxx> > Signed-off-by: Andrii Sultanov <andriy.sultanov@xxxxxxxxxx> > --- > tools/ocaml/libs/xb/xb.ml | 25 +++++++++++++++++++------ > 1 file changed, 19 insertions(+), 6 deletions(-) > > diff --git a/tools/ocaml/libs/xb/xb.ml b/tools/ocaml/libs/xb/xb.ml > index 3e3ef2b29d..12ddb05c6d 100644 > --- a/tools/ocaml/libs/xb/xb.ml > +++ b/tools/ocaml/libs/xb/xb.ml > @@ -249,6 +249,11 @@ let can_input con = Queue.can_push con.pkt_out > CommandReply > > (* NB: can throw Reconnect *) > let input con = > + let reset_and_return partial_pkt = > + let pkt = Packet.of_partialpkt partial_pkt in > + con.partial_in <- init_partial_in (); > + Some pkt > + in > if not (can_input con) then None > else > let to_read = to_read con in > @@ -264,17 +269,25 @@ let input con = > if sz > 0 then > Partial.append partial_pkt (Bytes.to_string b) sz; > if Partial.to_complete partial_pkt = 0 then ( > - let pkt = Packet.of_partialpkt partial_pkt in > - con.partial_in <- init_partial_in (); > - Some pkt > + reset_and_return partial_pkt > ) else None > | NoHdr (i, buf) -> > (* we complete the partial header *) > if sz > 0 then > Bytes.blit b 0 buf (Partial.header_size () - i) sz; > - con.partial_in <- if sz = i then > - HaveHdr (Partial.of_string (Bytes.to_string buf)) else NoHdr (i > - sz, buf); > - None > + if sz = i then > + let partial_pkt = Partial.of_string (Bytes.to_string buf) in > + (* If there is no body, we can return the full request immediately > *) > + if Partial.to_complete partial_pkt = 0 then > + reset_and_return partial_pkt > + else ( > + con.partial_in <- HaveHdr partial_pkt; > + None > + ) > + else ( > + con.partial_in <- NoHdr (i - sz, buf); > + None > + ) > ) > > let classify t = > -- > 2.54.0 > Reviewed-by: Guillaume Thouvenin <guillaume.thouvenin@xxxxxxxxxx> -- | Vates XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |