KVM: stats: Add fd-based API to read binary stats data
[linux-2.6-microblaze.git] / include / linux / kvm_host.h
index 37cbb56..9ee7f35 100644 (file)
@@ -1272,16 +1272,94 @@ struct kvm_stats_debugfs_item {
        int mode;
 };
 
+struct _kvm_stats_desc {
+       struct kvm_stats_desc desc;
+       char name[KVM_STATS_NAME_SIZE];
+};
+
 #define KVM_DBGFS_GET_MODE(dbgfs_item)                                         \
        ((dbgfs_item)->mode ? (dbgfs_item)->mode : 0644)
 
-#define VM_STAT(n, x, ...)                                                     \
+#define VM_STAT(n, x, ...)                                                    \
        { n, offsetof(struct kvm, stat.x), KVM_STAT_VM, ## __VA_ARGS__ }
-#define VCPU_STAT(n, x, ...)                                                   \
+#define VCPU_STAT(n, x, ...)                                                  \
        { n, offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU, ## __VA_ARGS__ }
 
+#define STATS_DESC_COMMON(type, unit, base, exp)                              \
+       .flags = type | unit | base |                                          \
+                BUILD_BUG_ON_ZERO(type & ~KVM_STATS_TYPE_MASK) |              \
+                BUILD_BUG_ON_ZERO(unit & ~KVM_STATS_UNIT_MASK) |              \
+                BUILD_BUG_ON_ZERO(base & ~KVM_STATS_BASE_MASK),               \
+       .exponent = exp,                                                       \
+       .size = 1
+
+#define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp)                    \
+       {                                                                      \
+               {                                                              \
+                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       .offset = offsetof(struct kvm_vm_stat, generic.stat)   \
+               },                                                             \
+               .name = #stat,                                                 \
+       }
+#define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp)                  \
+       {                                                                      \
+               {                                                              \
+                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       .offset = offsetof(struct kvm_vcpu_stat, generic.stat) \
+               },                                                             \
+               .name = #stat,                                                 \
+       }
+#define VM_STATS_DESC(stat, type, unit, base, exp)                            \
+       {                                                                      \
+               {                                                              \
+                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       .offset = offsetof(struct kvm_vm_stat, stat)           \
+               },                                                             \
+               .name = #stat,                                                 \
+       }
+#define VCPU_STATS_DESC(stat, type, unit, base, exp)                          \
+       {                                                                      \
+               {                                                              \
+                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       .offset = offsetof(struct kvm_vcpu_stat, stat)         \
+               },                                                             \
+               .name = #stat,                                                 \
+       }
+/* SCOPE: VM, VM_GENERIC, VCPU, VCPU_GENERIC */
+#define STATS_DESC(SCOPE, stat, type, unit, base, exp)                        \
+       SCOPE##_STATS_DESC(stat, type, unit, base, exp)
+
+#define STATS_DESC_CUMULATIVE(SCOPE, name, unit, base, exponent)              \
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_CUMULATIVE, unit, base, exponent)
+#define STATS_DESC_INSTANT(SCOPE, name, unit, base, exponent)                 \
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_INSTANT, unit, base, exponent)
+#define STATS_DESC_PEAK(SCOPE, name, unit, base, exponent)                    \
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_PEAK, unit, base, exponent)
+
+/* Cumulative counter, read/write */
+#define STATS_DESC_COUNTER(SCOPE, name)                                               \
+       STATS_DESC_CUMULATIVE(SCOPE, name, KVM_STATS_UNIT_NONE,                \
+               KVM_STATS_BASE_POW10, 0)
+/* Instantaneous counter, read only */
+#define STATS_DESC_ICOUNTER(SCOPE, name)                                      \
+       STATS_DESC_INSTANT(SCOPE, name, KVM_STATS_UNIT_NONE,                   \
+               KVM_STATS_BASE_POW10, 0)
+/* Peak counter, read/write */
+#define STATS_DESC_PCOUNTER(SCOPE, name)                                      \
+       STATS_DESC_PEAK(SCOPE, name, KVM_STATS_UNIT_NONE,                      \
+               KVM_STATS_BASE_POW10, 0)
+
+/* Cumulative time in nanosecond */
+#define STATS_DESC_TIME_NSEC(SCOPE, name)                                     \
+       STATS_DESC_CUMULATIVE(SCOPE, name, KVM_STATS_UNIT_SECONDS,             \
+               KVM_STATS_BASE_POW10, -9)
+
 extern struct kvm_stats_debugfs_item debugfs_entries[];
 extern struct dentry *kvm_debugfs_dir;
+ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
+                      const struct _kvm_stats_desc *desc,
+                      void *stats, size_t size_stats,
+                      char __user *user_buffer, size_t size, loff_t *offset);
 
 #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
 static inline int mmu_notifier_retry(struct kvm *kvm, unsigned long mmu_seq)