| ================== | 
 | Guest halt polling | 
 | ================== | 
 |  | 
 | The cpuidle_haltpoll driver, with the haltpoll governor, allows | 
 | the guest vcpus to poll for a specified amount of time before | 
 | halting. | 
 |  | 
 | This provides the following benefits to host side polling: | 
 |  | 
 | 	1) The POLL flag is set while polling is performed, which allows | 
 | 	   a remote vCPU to avoid sending an IPI (and the associated | 
 | 	   cost of handling the IPI) when performing a wakeup. | 
 |  | 
 | 	2) The VM-exit cost can be avoided. | 
 |  | 
 | The downside of guest side polling is that polling is performed | 
 | even with other runnable tasks in the host. | 
 |  | 
 | The basic logic as follows: A global value, guest_halt_poll_ns, | 
 | is configured by the user, indicating the maximum amount of | 
 | time polling is allowed. This value is fixed. | 
 |  | 
 | Each vcpu has an adjustable guest_halt_poll_ns | 
 | ("per-cpu guest_halt_poll_ns"), which is adjusted by the algorithm | 
 | in response to events (explained below). | 
 |  | 
 | Module Parameters | 
 | ================= | 
 |  | 
 | The haltpoll governor has 5 tunable module parameters: | 
 |  | 
 | 1) guest_halt_poll_ns: | 
 |  | 
 | Maximum amount of time, in nanoseconds, that polling is | 
 | performed before halting. | 
 |  | 
 | Default: 200000 | 
 |  | 
 | 2) guest_halt_poll_shrink: | 
 |  | 
 | Division factor used to shrink per-cpu guest_halt_poll_ns when | 
 | wakeup event occurs after the global guest_halt_poll_ns. | 
 |  | 
 | Default: 2 | 
 |  | 
 | 3) guest_halt_poll_grow: | 
 |  | 
 | Multiplication factor used to grow per-cpu guest_halt_poll_ns | 
 | when event occurs after per-cpu guest_halt_poll_ns | 
 | but before global guest_halt_poll_ns. | 
 |  | 
 | Default: 2 | 
 |  | 
 | 4) guest_halt_poll_grow_start: | 
 |  | 
 | The per-cpu guest_halt_poll_ns eventually reaches zero | 
 | in case of an idle system. This value sets the initial | 
 | per-cpu guest_halt_poll_ns when growing. This can | 
 | be increased from 10000, to avoid misses during the initial | 
 | growth stage: | 
 |  | 
 | 10k, 20k, 40k, ... (example assumes guest_halt_poll_grow=2). | 
 |  | 
 | Default: 50000 | 
 |  | 
 | 5) guest_halt_poll_allow_shrink: | 
 |  | 
 | Bool parameter which allows shrinking. Set to N | 
 | to avoid it (per-cpu guest_halt_poll_ns will remain | 
 | high once achieves global guest_halt_poll_ns value). | 
 |  | 
 | Default: Y | 
 |  | 
 | The module parameters can be set from the debugfs files in:: | 
 |  | 
 | 	/sys/module/haltpoll/parameters/ | 
 |  | 
 | Further Notes | 
 | ============= | 
 |  | 
 | - Care should be taken when setting the guest_halt_poll_ns parameter as a | 
 |   large value has the potential to drive the cpu usage to 100% on a machine | 
 |   which would be almost entirely idle otherwise. |