[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.