diff options
Diffstat (limited to 'arch/x86/kvm/mmu_audit.c')
-rw-r--r-- | arch/x86/kvm/mmu_audit.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/arch/x86/kvm/mmu_audit.c b/arch/x86/kvm/mmu_audit.c index 746ec259d024..fe15dcc07a6b 100644 --- a/arch/x86/kvm/mmu_audit.c +++ b/arch/x86/kvm/mmu_audit.c | |||
@@ -19,6 +19,15 @@ | |||
19 | 19 | ||
20 | #include <linux/ratelimit.h> | 20 | #include <linux/ratelimit.h> |
21 | 21 | ||
22 | char const *audit_point_name[] = { | ||
23 | "pre page fault", | ||
24 | "post page fault", | ||
25 | "pre pte write", | ||
26 | "post pte write", | ||
27 | "pre sync", | ||
28 | "post sync" | ||
29 | }; | ||
30 | |||
22 | #define audit_printk(kvm, fmt, args...) \ | 31 | #define audit_printk(kvm, fmt, args...) \ |
23 | printk(KERN_ERR "audit: (%s) error: " \ | 32 | printk(KERN_ERR "audit: (%s) error: " \ |
24 | fmt, audit_point_name[kvm->arch.audit_point], ##args) | 33 | fmt, audit_point_name[kvm->arch.audit_point], ##args) |
@@ -224,7 +233,10 @@ static void audit_vcpu_spte(struct kvm_vcpu *vcpu) | |||
224 | mmu_spte_walk(vcpu, audit_spte); | 233 | mmu_spte_walk(vcpu, audit_spte); |
225 | } | 234 | } |
226 | 235 | ||
227 | static void kvm_mmu_audit(void *ignore, struct kvm_vcpu *vcpu, int point) | 236 | static bool mmu_audit; |
237 | static struct jump_label_key mmu_audit_key; | ||
238 | |||
239 | static void __kvm_mmu_audit(struct kvm_vcpu *vcpu, int point) | ||
228 | { | 240 | { |
229 | static DEFINE_RATELIMIT_STATE(ratelimit_state, 5 * HZ, 10); | 241 | static DEFINE_RATELIMIT_STATE(ratelimit_state, 5 * HZ, 10); |
230 | 242 | ||
@@ -236,18 +248,18 @@ static void kvm_mmu_audit(void *ignore, struct kvm_vcpu *vcpu, int point) | |||
236 | audit_vcpu_spte(vcpu); | 248 | audit_vcpu_spte(vcpu); |
237 | } | 249 | } |
238 | 250 | ||
239 | static bool mmu_audit; | 251 | static inline void kvm_mmu_audit(struct kvm_vcpu *vcpu, int point) |
252 | { | ||
253 | if (static_branch((&mmu_audit_key))) | ||
254 | __kvm_mmu_audit(vcpu, point); | ||
255 | } | ||
240 | 256 | ||
241 | static void mmu_audit_enable(void) | 257 | static void mmu_audit_enable(void) |
242 | { | 258 | { |
243 | int ret; | ||
244 | |||
245 | if (mmu_audit) | 259 | if (mmu_audit) |
246 | return; | 260 | return; |
247 | 261 | ||
248 | ret = register_trace_kvm_mmu_audit(kvm_mmu_audit, NULL); | 262 | jump_label_inc(&mmu_audit_key); |
249 | WARN_ON(ret); | ||
250 | |||
251 | mmu_audit = true; | 263 | mmu_audit = true; |
252 | } | 264 | } |
253 | 265 | ||
@@ -256,8 +268,7 @@ static void mmu_audit_disable(void) | |||
256 | if (!mmu_audit) | 268 | if (!mmu_audit) |
257 | return; | 269 | return; |
258 | 270 | ||
259 | unregister_trace_kvm_mmu_audit(kvm_mmu_audit, NULL); | 271 | jump_label_dec(&mmu_audit_key); |
260 | tracepoint_synchronize_unregister(); | ||
261 | mmu_audit = false; | 272 | mmu_audit = false; |
262 | } | 273 | } |
263 | 274 | ||