[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen stable-4.14] tools/ocaml: Change Xb.input to return Packet.t option



commit 7f5d36df7c72f5f83a0027de45cb314c63f07f8f
Author:     Edwin Török <edvin.torok@xxxxxxxxxx>
AuthorDate: Wed Oct 12 19:13:02 2022 +0100
Commit:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Nov 1 15:20:41 2022 +0000

    tools/ocaml: Change Xb.input to return Packet.t option
    
    The queue here would only ever hold at most one element.  This will simplify
    follow-up patches.
    
    This is part of XSA-326.
    
    Signed-off-by: Edwin Török <edvin.torok@xxxxxxxxxx>
    Acked-by: Christian Lindig <christian.lindig@xxxxxxxxxx>
    (cherry picked from commit c0a86a462721008eca5ff733660de094d3c34bc7)
---
 tools/ocaml/libs/xb/xb.ml           | 18 +++++-------------
 tools/ocaml/libs/xb/xb.mli          |  5 +----
 tools/ocaml/libs/xs/xsraw.ml        | 20 ++++++--------------
 tools/ocaml/xenstored/connection.ml |  2 --
 tools/ocaml/xenstored/process.ml    | 12 ++++++------
 5 files changed, 18 insertions(+), 39 deletions(-)

diff --git a/tools/ocaml/libs/xb/xb.ml b/tools/ocaml/libs/xb/xb.ml
index 8404ddd8a6..165fd4a1ed 100644
--- a/tools/ocaml/libs/xb/xb.ml
+++ b/tools/ocaml/libs/xb/xb.ml
@@ -45,7 +45,6 @@ type partial_buf = HaveHdr of Partial.pkt | NoHdr of int * 
bytes
 type t =
 {
        backend: backend;
-       pkt_in: Packet.t Queue.t;
        pkt_out: Packet.t Queue.t;
        mutable partial_in: partial_buf;
        mutable partial_out: string;
@@ -62,7 +61,6 @@ let reconnect t = match t.backend with
                Xs_ring.close backend.mmap;
                backend.eventchn_notify ();
                (* Clear our old connection state *)
-               Queue.clear t.pkt_in;
                Queue.clear t.pkt_out;
                t.partial_in <- init_partial_in ();
                t.partial_out <- ""
@@ -124,7 +122,6 @@ let output con =
 
 (* NB: can throw Reconnect *)
 let input con =
-       let newpacket = ref false in
        let to_read =
                match con.partial_in with
                | HaveHdr partial_pkt -> Partial.to_complete partial_pkt
@@ -143,21 +140,19 @@ let input con =
                if Partial.to_complete partial_pkt = 0 then (
                        let pkt = Packet.of_partialpkt partial_pkt in
                        con.partial_in <- init_partial_in ();
-                       Queue.push pkt con.pkt_in;
-                       newpacket := true
-               )
+                       Some 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)
-       );
-       !newpacket
+                       HaveHdr (Partial.of_string (Bytes.to_string buf)) else 
NoHdr (i - sz, buf);
+               None
+       )
 
 let newcon backend = {
        backend = backend;
-       pkt_in = Queue.create ();
        pkt_out = Queue.create ();
        partial_in = init_partial_in ();
        partial_out = "";
@@ -193,9 +188,6 @@ let has_output con = has_new_output con || has_old_output 
con
 
 let peek_output con = Queue.peek con.pkt_out
 
-let input_len con = Queue.length con.pkt_in
-let has_in_packet con = Queue.length con.pkt_in > 0
-let get_in_packet con = Queue.pop con.pkt_in
 let has_partial_input con = match con.partial_in with
        | HaveHdr _ -> true
        | NoHdr (n, _) -> n < Partial.header_size ()
diff --git a/tools/ocaml/libs/xb/xb.mli b/tools/ocaml/libs/xb/xb.mli
index 794e35bb34..91c682162c 100644
--- a/tools/ocaml/libs/xb/xb.mli
+++ b/tools/ocaml/libs/xb/xb.mli
@@ -77,7 +77,7 @@ val write_fd : backend_fd -> 'a -> string -> int -> int
 val write_mmap : backend_mmap -> 'a -> string -> int -> int
 val write : t -> string -> int -> int
 val output : t -> bool
-val input : t -> bool
+val input : t -> Packet.t option
 val newcon : backend -> t
 val open_fd : Unix.file_descr -> t
 val open_mmap : Xenmmap.mmap_interface -> (unit -> unit) -> t
@@ -89,10 +89,7 @@ val has_new_output : t -> bool
 val has_old_output : t -> bool
 val has_output : t -> bool
 val peek_output : t -> Packet.t
-val input_len : t -> int
-val has_in_packet : t -> bool
 val has_partial_input : t -> bool
-val get_in_packet : t -> Packet.t
 val has_more_input : t -> bool
 val is_selectable : t -> bool
 val get_fd : t -> Unix.file_descr
diff --git a/tools/ocaml/libs/xs/xsraw.ml b/tools/ocaml/libs/xs/xsraw.ml
index d982fb24db..451f8b38db 100644
--- a/tools/ocaml/libs/xs/xsraw.ml
+++ b/tools/ocaml/libs/xs/xsraw.ml
@@ -94,26 +94,18 @@ let pkt_send con =
        done
 
 (* receive one packet - can sleep *)
-let pkt_recv con =
-       let workdone = ref false in
-       while not !workdone
-       do
-               workdone := Xb.input con.xb
-       done;
-       Xb.get_in_packet con.xb
+let rec pkt_recv con =
+       match Xb.input con.xb with
+       | Some packet -> packet
+       | None -> pkt_recv con
 
 let pkt_recv_timeout con timeout =
        let fd = Xb.get_fd con.xb in
        let r, _, _ = Unix.select [ fd ] [] [] timeout in
        if r = [] then
                true, None
-       else (
-               let workdone = Xb.input con.xb in
-               if workdone then
-                       false, (Some (Xb.get_in_packet con.xb))
-               else
-                       false, None
-       )
+       else
+               false, Xb.input con.xb
 
 let queue_watchevent con data =
        let ls = split_string ~limit:2 '\000' data in
diff --git a/tools/ocaml/xenstored/connection.ml 
b/tools/ocaml/xenstored/connection.ml
index 70c4348552..ace2aa5b4f 100644
--- a/tools/ocaml/xenstored/connection.ml
+++ b/tools/ocaml/xenstored/connection.ml
@@ -277,8 +277,6 @@ let get_transaction con tid =
        Hashtbl.find con.transactions tid
 
 let do_input con = Xenbus.Xb.input con.xb
-let has_input con = Xenbus.Xb.has_in_packet con.xb
-let pop_in con = Xenbus.Xb.get_in_packet con.xb
 let has_more_input con = Xenbus.Xb.has_more_input con.xb
 
 let has_output con = Xenbus.Xb.has_output con.xb
diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index 3279b19b1b..72629ee38b 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -570,16 +570,17 @@ let do_input store cons doms con =
                        info "%s requests a reconnect" (Connection.get_domstr 
con);
                        History.reconnect con;
                        info "%s reconnection complete" (Connection.get_domstr 
con);
-                       false
+                       None
                | Failure exp ->
                        error "caught exception %s" exp;
                        error "got a bad client %s" (sprintf "%-8s" 
(Connection.get_domstr con));
                        Connection.mark_as_bad con;
-                       false
+                       None
        in
 
-       if newpacket then (
-               let packet = Connection.pop_in con in
+       match newpacket with
+       | None -> ()
+       | Some packet ->
                let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
                let req = {Packet.tid=tid; Packet.rid=rid; Packet.ty=ty; 
Packet.data=data} in
 
@@ -589,8 +590,7 @@ let do_input store cons doms con =
                         (Xenbus.Xb.Op.to_string ty) (sanitize_data data); *)
                process_packet ~store ~cons ~doms ~con ~req;
                write_access_log ~ty ~tid ~con:(Connection.get_domstr con) 
~data;
-               Connection.incr_ops con;
-       )
+               Connection.incr_ops con
 
 let do_output _store _cons _doms con =
        if Connection.has_output con then (
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.14



 


Rackspace

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