summaryrefslogtreecommitdiff
path: root/system/xen/xsa/xsa206-4.8-0005-oxenstored-ignore-domains-with-no-conflict-credit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/xen/xsa/xsa206-4.8-0005-oxenstored-ignore-domains-with-no-conflict-credit.patch')
-rw-r--r--system/xen/xsa/xsa206-4.8-0005-oxenstored-ignore-domains-with-no-conflict-credit.patch219
1 files changed, 0 insertions, 219 deletions
diff --git a/system/xen/xsa/xsa206-4.8-0005-oxenstored-ignore-domains-with-no-conflict-credit.patch b/system/xen/xsa/xsa206-4.8-0005-oxenstored-ignore-domains-with-no-conflict-credit.patch
deleted file mode 100644
index b5f4250cdc..0000000000
--- a/system/xen/xsa/xsa206-4.8-0005-oxenstored-ignore-domains-with-no-conflict-credit.patch
+++ /dev/null
@@ -1,219 +0,0 @@
-From e0f02f8fb5a5130a37bd7efdc80d7f0dd46db41e Mon Sep 17 00:00:00 2001
-From: Thomas Sanders <thomas.sanders@citrix.com>
-Date: Tue, 14 Mar 2017 12:15:52 +0000
-Subject: [PATCH 05/15] oxenstored: ignore domains with no conflict-credit
-
-When processing connections, skip those from domains with no remaining
-conflict-credit.
-
-Also, issue a point of conflict-credit at regular intervals, the
-period being set by the configuration option "conflict-max-history-
-seconds". When issuing conflict-credit, we give a point either to
-every domain at once (one each) or only to the single domain at the
-front of the queue, depending on the configuration option
-"conflict-rate-limit-is-aggregate".
-
-Reported-by: Juergen Gross <jgross@suse.com>
-Signed-off-by: Thomas Sanders <thomas.sanders@citrix.com>
-Reviewed-by: Jonathan Davies <jonathan.davies@citrix.com>
-Reviewed-by: Christian Lindig <christian.lindig@citrix.com>
----
- tools/ocaml/xenstored/connections.ml | 14 ++++---
- tools/ocaml/xenstored/define.ml | 1 +
- tools/ocaml/xenstored/domains.ml | 4 +-
- tools/ocaml/xenstored/oxenstored.conf.in | 2 +-
- tools/ocaml/xenstored/xenstored.ml | 65 +++++++++++++++++++++++---------
- 5 files changed, 60 insertions(+), 26 deletions(-)
-
-diff --git a/tools/ocaml/xenstored/connections.ml b/tools/ocaml/xenstored/connections.ml
-index f9bc225..ae76928 100644
---- a/tools/ocaml/xenstored/connections.ml
-+++ b/tools/ocaml/xenstored/connections.ml
-@@ -44,12 +44,14 @@ let add_domain cons dom =
- | Some p -> Hashtbl.add cons.ports p con;
- | None -> ()
-
--let select cons =
-- Hashtbl.fold
-- (fun _ con (ins, outs) ->
-- let fd = Connection.get_fd con in
-- (fd :: ins, if Connection.has_output con then fd :: outs else outs))
-- cons.anonymous ([], [])
-+let select ?(only_if = (fun _ -> true)) cons =
-+ Hashtbl.fold (fun _ con (ins, outs) ->
-+ if (only_if con) then (
-+ let fd = Connection.get_fd con in
-+ (fd :: ins, if Connection.has_output con then fd :: outs else outs)
-+ ) else (ins, outs)
-+ )
-+ cons.anonymous ([], [])
-
- let find cons =
- Hashtbl.find cons.anonymous
-diff --git a/tools/ocaml/xenstored/define.ml b/tools/ocaml/xenstored/define.ml
-index 816b493..5a604d1 100644
---- a/tools/ocaml/xenstored/define.ml
-+++ b/tools/ocaml/xenstored/define.ml
-@@ -30,6 +30,7 @@ let maxtransaction = ref (20)
- let maxrequests = ref (-1) (* maximum requests per transaction *)
-
- let conflict_burst_limit = ref 5.0
-+let conflict_max_history_seconds = ref 0.05
- let conflict_rate_limit_is_aggregate = ref true
-
- let domid_self = 0x7FF0
-diff --git a/tools/ocaml/xenstored/domains.ml b/tools/ocaml/xenstored/domains.ml
-index 3d29cc8..99f68c7 100644
---- a/tools/ocaml/xenstored/domains.ml
-+++ b/tools/ocaml/xenstored/domains.ml
-@@ -39,12 +39,12 @@ type domains = {
- mutable n_paused: int;
- }
-
--let init eventchn = {
-+let init eventchn on_first_conflict_pause = {
- eventchn = eventchn;
- table = Hashtbl.create 10;
- doms_conflict_paused = Queue.create ();
- doms_with_conflict_penalty = Queue.create ();
-- on_first_conflict_pause = (fun () -> ()); (* Dummy value for now, pending subsequent commit. *)
-+ on_first_conflict_pause = on_first_conflict_pause;
- n_paused = 0;
- }
- let del doms id = Hashtbl.remove doms.table id
-diff --git a/tools/ocaml/xenstored/oxenstored.conf.in b/tools/ocaml/xenstored/oxenstored.conf.in
-index edd4335..536611e 100644
---- a/tools/ocaml/xenstored/oxenstored.conf.in
-+++ b/tools/ocaml/xenstored/oxenstored.conf.in
-@@ -22,7 +22,7 @@ conflict-burst-limit = 5.0
- # The conflict-credit is replenished over time:
- # one point is issued after each conflict-max-history-seconds, so this
- # is the minimum pause-time during which a domain will be ignored.
--# conflict-max-history-seconds = 0.05
-+conflict-max-history-seconds = 0.05
-
- # If the conflict-rate-limit-is-aggregate flag is true then after each
- # tick one point of conflict-credit is given to just one domain: the
-diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml
-index 20473d5..f562f59 100644
---- a/tools/ocaml/xenstored/xenstored.ml
-+++ b/tools/ocaml/xenstored/xenstored.ml
-@@ -53,14 +53,16 @@ let process_connection_fds store cons domains rset wset =
-
- let process_domains store cons domains =
- let do_io_domain domain =
-- if not (Domain.is_bad_domain domain) then
-- let io_credit = Domain.get_io_credit domain in
-- if io_credit > 0 then (
-- let con = Connections.find_domain cons (Domain.get_id domain) in
-- Process.do_input store cons domains con;
-- Process.do_output store cons domains con;
-- Domain.decr_io_credit domain;
-- ) in
-+ if Domain.is_bad_domain domain
-+ || Domain.get_io_credit domain <= 0
-+ || Domain.is_paused_for_conflict domain
-+ then () (* nothing to do *)
-+ else (
-+ let con = Connections.find_domain cons (Domain.get_id domain) in
-+ Process.do_input store cons domains con;
-+ Process.do_output store cons domains con;
-+ Domain.decr_io_credit domain
-+ ) in
- Domains.iter domains do_io_domain
-
- let sigusr1_handler store =
-@@ -90,6 +92,7 @@ let parse_config filename =
- let options = [
- ("merge-activate", Config.Set_bool Transaction.do_coalesce);
- ("conflict-burst-limit", Config.Set_float Define.conflict_burst_limit);
-+ ("conflict-max-history-seconds", Config.Set_float Define.conflict_max_history_seconds);
- ("conflict-rate-limit-is-aggregate", Config.Set_bool Define.conflict_rate_limit_is_aggregate);
- ("perms-activate", Config.Set_bool Perms.activate);
- ("quota-activate", Config.Set_bool Quota.activate);
-@@ -262,7 +265,22 @@ let _ =
-
- let store = Store.create () in
- let eventchn = Event.init () in
-- let domains = Domains.init eventchn in
-+ let next_frequent_ops = ref 0. in
-+ let advance_next_frequent_ops () =
-+ next_frequent_ops := (Unix.gettimeofday () +. !Define.conflict_max_history_seconds)
-+ in
-+ let delay_next_frequent_ops_by duration =
-+ next_frequent_ops := !next_frequent_ops +. duration
-+ in
-+ let domains = Domains.init eventchn advance_next_frequent_ops in
-+
-+ (* For things that need to be done periodically but more often
-+ * than the periodic_ops function *)
-+ let frequent_ops () =
-+ if Unix.gettimeofday () > !next_frequent_ops then (
-+ Domains.incr_conflict_credit domains;
-+ advance_next_frequent_ops ()
-+ ) in
- let cons = Connections.create () in
-
- let quit = ref false in
-@@ -394,23 +412,34 @@ let _ =
- gc.Gc.heap_words gc.Gc.heap_chunks
- gc.Gc.live_words gc.Gc.live_blocks
- gc.Gc.free_words gc.Gc.free_blocks
-- )
-- in
-+ );
-+ let elapsed = Unix.gettimeofday () -. now in
-+ delay_next_frequent_ops_by elapsed
-+ in
-
-- let period_ops_interval = 15. in
-- let period_start = ref 0. in
-+ let period_ops_interval = 15. in
-+ let period_start = ref 0. in
-
- let main_loop () =
--
-+ let is_peaceful c =
-+ match Connection.get_domain c with
-+ | None -> true (* Treat socket-connections as exempt, and free to conflict. *)
-+ | Some dom -> not (Domain.is_paused_for_conflict dom)
-+ in
-+ frequent_ops ();
- let mw = Connections.has_more_work cons in
-+ let peaceful_mw = List.filter is_peaceful mw in
- List.iter
- (fun c ->
- match Connection.get_domain c with
- | None -> () | Some d -> Domain.incr_io_credit d)
-- mw;
-+ peaceful_mw;
-+ let start_time = Unix.gettimeofday () in
- let timeout =
-- if List.length mw > 0 then 0. else period_ops_interval in
-- let inset, outset = Connections.select cons in
-+ let until_next_activity = min (max 0. (!next_frequent_ops -. start_time)) period_ops_interval in
-+ if peaceful_mw <> [] then 0. else until_next_activity
-+ in
-+ let inset, outset = Connections.select ~only_if:is_peaceful cons in
- let rset, wset, _ =
- try
- Select.select (spec_fds @ inset) outset [] timeout
-@@ -420,6 +449,7 @@ let _ =
- List.partition (fun fd -> List.mem fd spec_fds) rset in
- if List.length sfds > 0 then
- process_special_fds sfds;
-+
- if List.length cfds > 0 || List.length wset > 0 then
- process_connection_fds store cons domains cfds wset;
- if timeout <> 0. then (
-@@ -427,6 +457,7 @@ let _ =
- if now > !period_start +. period_ops_interval then
- (period_start := now; periodic_ops now)
- );
-+
- process_domains store cons domains
- in
-
---
-2.1.4
-