diff options
| -rw-r--r-- | Documentation/admin-guide/kernel-parameters.txt | 7 | ||||
| -rw-r--r-- | arch/x86/xen/time.c | 20 |
2 files changed, 24 insertions, 3 deletions
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 2b8ee90bb644..2623749ae7a3 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt | |||
| @@ -5173,6 +5173,13 @@ | |||
| 5173 | with /sys/devices/system/xen_memory/xen_memory0/scrub_pages. | 5173 | with /sys/devices/system/xen_memory/xen_memory0/scrub_pages. |
| 5174 | Default value controlled with CONFIG_XEN_SCRUB_PAGES_DEFAULT. | 5174 | Default value controlled with CONFIG_XEN_SCRUB_PAGES_DEFAULT. |
| 5175 | 5175 | ||
| 5176 | xen_timer_slop= [X86-64,XEN] | ||
| 5177 | Set the timer slop (in nanoseconds) for the virtual Xen | ||
| 5178 | timers (default is 100000). This adjusts the minimum | ||
| 5179 | delta of virtualized Xen timers, where lower values | ||
| 5180 | improve timer resolution at the expense of processing | ||
| 5181 | more timer interrupts. | ||
| 5182 | |||
| 5176 | xirc2ps_cs= [NET,PCMCIA] | 5183 | xirc2ps_cs= [NET,PCMCIA] |
| 5177 | Format: | 5184 | Format: |
| 5178 | <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] | 5185 | <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] |
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index 6e29794573b7..befbdd8b17f0 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | #include "xen-ops.h" | 29 | #include "xen-ops.h" |
| 30 | 30 | ||
| 31 | /* Xen may fire a timer up to this many ns early */ | 31 | /* Minimum amount of time until next clock event fires */ |
| 32 | #define TIMER_SLOP 100000 | 32 | #define TIMER_SLOP 100000 |
| 33 | 33 | ||
| 34 | static u64 xen_sched_clock_offset __read_mostly; | 34 | static u64 xen_sched_clock_offset __read_mostly; |
| @@ -212,7 +212,7 @@ static int xen_timerop_set_next_event(unsigned long delta, | |||
| 212 | return 0; | 212 | return 0; |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | static const struct clock_event_device xen_timerop_clockevent = { | 215 | static struct clock_event_device xen_timerop_clockevent __ro_after_init = { |
| 216 | .name = "xen", | 216 | .name = "xen", |
| 217 | .features = CLOCK_EVT_FEAT_ONESHOT, | 217 | .features = CLOCK_EVT_FEAT_ONESHOT, |
| 218 | 218 | ||
| @@ -273,7 +273,7 @@ static int xen_vcpuop_set_next_event(unsigned long delta, | |||
| 273 | return ret; | 273 | return ret; |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | static const struct clock_event_device xen_vcpuop_clockevent = { | 276 | static struct clock_event_device xen_vcpuop_clockevent __ro_after_init = { |
| 277 | .name = "xen", | 277 | .name = "xen", |
| 278 | .features = CLOCK_EVT_FEAT_ONESHOT, | 278 | .features = CLOCK_EVT_FEAT_ONESHOT, |
| 279 | 279 | ||
| @@ -570,3 +570,17 @@ void __init xen_hvm_init_time_ops(void) | |||
| 570 | x86_platform.set_wallclock = xen_set_wallclock; | 570 | x86_platform.set_wallclock = xen_set_wallclock; |
| 571 | } | 571 | } |
| 572 | #endif | 572 | #endif |
| 573 | |||
| 574 | /* Kernel parameter to specify Xen timer slop */ | ||
| 575 | static int __init parse_xen_timer_slop(char *ptr) | ||
| 576 | { | ||
| 577 | unsigned long slop = memparse(ptr, NULL); | ||
| 578 | |||
| 579 | xen_timerop_clockevent.min_delta_ns = slop; | ||
| 580 | xen_timerop_clockevent.min_delta_ticks = slop; | ||
| 581 | xen_vcpuop_clockevent.min_delta_ns = slop; | ||
| 582 | xen_vcpuop_clockevent.min_delta_ticks = slop; | ||
| 583 | |||
| 584 | return 0; | ||
| 585 | } | ||
| 586 | early_param("xen_timer_slop", parse_xen_timer_slop); | ||
