On Thu, May 09, 2024, cheng.lin130@xxxxxxxxxx wrote: > > From: seanjc <seanjc@xxxxxxxxxx> > > > From: Cheng Lin <cheng.lin130@xxxxxxxxxx> > > > > > > Introduce vm's max_halt_poll_ns and override_halt_poll_ns to > > > debugfs. Provide a way to check and modify them. > > Why? > If a vm's max_halt_poll_ns has been set using KVM_CAP_HALT_POLL, > the module parameter kvm.halt_poll.ns will no longer indicate the maximum > halt pooling interval for that vm. After introducing these two attributes into > debugfs, it can be used to check whether the individual configuration of the > vm is enabled and the working value. But why is max_halt_poll_ns special enough to warrant debugfs entries? There is a _lot_ of state in KVM that is configurable per-VM, it simply isn't feasible to dump everything into debugfs. I do think it would be reasonable to capture the max allowed polling time in the existing tracepoint though, e.g. diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 74e40d5d4af4..7e66e9b2e497 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -41,24 +41,26 @@ TRACE_EVENT(kvm_userspace_exit, ); TRACE_EVENT(kvm_vcpu_wakeup, - TP_PROTO(__u64 ns, bool waited, bool valid), - TP_ARGS(ns, waited, valid), + TP_PROTO(__u64 ns, __u32 max_ns, bool waited, bool valid), + TP_ARGS(ns, max_ns, waited, valid), TP_STRUCT__entry( __field( __u64, ns ) + __field( __u32, max_ns ) __field( bool, waited ) __field( bool, valid ) ), TP_fast_assign( __entry->ns = ns; + __entry->max_ns = max_ns; __entry->waited = waited; __entry->valid = valid; ), - TP_printk("%s time %lld ns, polling %s", + TP_printk("%s time %llu ns (max poll %u ns), polling %s", __entry->waited ? "wait" : "poll", - __entry->ns, + __entry->ns, __entry->max_ns, __entry->valid ? "valid" : "invalid") ); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 2e388972d856..f093138f3cd7 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3846,7 +3846,8 @@ void kvm_vcpu_halt(struct kvm_vcpu *vcpu) } } - trace_kvm_vcpu_wakeup(halt_ns, waited, vcpu_valid_wakeup(vcpu)); + trace_kvm_vcpu_wakeup(halt_ns, max_halt_poll_ns, waited, + vcpu_valid_wakeup(vcpu)); } EXPORT_SYMBOL_GPL(kvm_vcpu_halt);