KVM: stats: Support linear and logarithmic histogram statistics
[linux-2.6-microblaze.git] / include / linux / kvm_host.h
index 4e43843..09fc027 100644 (file)
@@ -1356,56 +1356,66 @@ struct _kvm_stats_desc {
        char name[KVM_STATS_NAME_SIZE];
 };
 
-#define STATS_DESC_COMMON(type, unit, base, exp)                              \
+#define STATS_DESC_COMMON(type, unit, base, exp, sz, bsz)                     \
        .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
+       .size = sz,                                                            \
+       .bucket_size = bsz
 
-#define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp)                    \
+#define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz)           \
        {                                                                      \
                {                                                              \
-                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
                        .offset = offsetof(struct kvm_vm_stat, generic.stat)   \
                },                                                             \
                .name = #stat,                                                 \
        }
-#define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp)                  \
+#define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz)         \
        {                                                                      \
                {                                                              \
-                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
                        .offset = offsetof(struct kvm_vcpu_stat, generic.stat) \
                },                                                             \
                .name = #stat,                                                 \
        }
-#define VM_STATS_DESC(stat, type, unit, base, exp)                            \
+#define VM_STATS_DESC(stat, type, unit, base, exp, sz, bsz)                   \
        {                                                                      \
                {                                                              \
-                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
                        .offset = offsetof(struct kvm_vm_stat, stat)           \
                },                                                             \
                .name = #stat,                                                 \
        }
-#define VCPU_STATS_DESC(stat, type, unit, base, exp)                          \
+#define VCPU_STATS_DESC(stat, type, unit, base, exp, sz, bsz)                 \
        {                                                                      \
                {                                                              \
-                       STATS_DESC_COMMON(type, unit, base, exp),              \
+                       STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
                        .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(SCOPE, stat, type, unit, base, exp, sz, bsz)                       \
+       SCOPE##_STATS_DESC(stat, type, unit, base, exp, sz, bsz)
 
 #define STATS_DESC_CUMULATIVE(SCOPE, name, unit, base, exponent)              \
-       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_CUMULATIVE, unit, base, exponent)
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_CUMULATIVE,                     \
+               unit, base, exponent, 1, 0)
 #define STATS_DESC_INSTANT(SCOPE, name, unit, base, exponent)                 \
-       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_INSTANT, unit, base, exponent)
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_INSTANT,                        \
+               unit, base, exponent, 1, 0)
 #define STATS_DESC_PEAK(SCOPE, name, unit, base, exponent)                    \
-       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_PEAK, unit, base, exponent)
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_PEAK,                           \
+               unit, base, exponent, 1, 0)
+#define STATS_DESC_LINEAR_HIST(SCOPE, name, unit, base, exponent, sz, bsz)     \
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_LINEAR_HIST,                    \
+               unit, base, exponent, sz, bsz)
+#define STATS_DESC_LOG_HIST(SCOPE, name, unit, base, exponent, sz)            \
+       STATS_DESC(SCOPE, name, KVM_STATS_TYPE_LOG_HIST,                       \
+               unit, base, exponent, sz, 0)
 
 /* Cumulative counter, read/write */
 #define STATS_DESC_COUNTER(SCOPE, name)                                               \
@@ -1424,6 +1434,14 @@ struct _kvm_stats_desc {
 #define STATS_DESC_TIME_NSEC(SCOPE, name)                                     \
        STATS_DESC_CUMULATIVE(SCOPE, name, KVM_STATS_UNIT_SECONDS,             \
                KVM_STATS_BASE_POW10, -9)
+/* Linear histogram for time in nanosecond */
+#define STATS_DESC_LINHIST_TIME_NSEC(SCOPE, name, sz, bsz)                    \
+       STATS_DESC_LINEAR_HIST(SCOPE, name, KVM_STATS_UNIT_SECONDS,            \
+               KVM_STATS_BASE_POW10, -9, sz, bsz)
+/* Logarithmic histogram for time in nanosecond */
+#define STATS_DESC_LOGHIST_TIME_NSEC(SCOPE, name, sz)                         \
+       STATS_DESC_LOG_HIST(SCOPE, name, KVM_STATS_UNIT_SECONDS,               \
+               KVM_STATS_BASE_POW10, -9, sz)
 
 #define KVM_GENERIC_VM_STATS()                                                \
        STATS_DESC_COUNTER(VM_GENERIC, remote_tlb_flush)
@@ -1437,10 +1455,52 @@ struct _kvm_stats_desc {
        STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_poll_fail_ns)
 
 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);
+
+/**
+ * kvm_stats_linear_hist_update() - Update bucket value for linear histogram
+ * statistics data.
+ *
+ * @data: start address of the stats data
+ * @size: the number of bucket of the stats data
+ * @value: the new value used to update the linear histogram's bucket
+ * @bucket_size: the size (width) of a bucket
+ */
+static inline void kvm_stats_linear_hist_update(u64 *data, size_t size,
+                                               u64 value, size_t bucket_size)
+{
+       size_t index = div64_u64(value, bucket_size);
+
+       index = min(index, size - 1);
+       ++data[index];
+}
+
+/**
+ * kvm_stats_log_hist_update() - Update bucket value for logarithmic histogram
+ * statistics data.
+ *
+ * @data: start address of the stats data
+ * @size: the number of bucket of the stats data
+ * @value: the new value used to update the logarithmic histogram's bucket
+ */
+static inline void kvm_stats_log_hist_update(u64 *data, size_t size, u64 value)
+{
+       size_t index = fls64(value);
+
+       index = min(index, size - 1);
+       ++data[index];
+}
+
+#define KVM_STATS_LINEAR_HIST_UPDATE(array, value, bsize)                     \
+       kvm_stats_linear_hist_update(array, ARRAY_SIZE(array), value, bsize)
+#define KVM_STATS_LOG_HIST_UPDATE(array, value)                                       \
+       kvm_stats_log_hist_update(array, ARRAY_SIZE(array), value)
+
+
 extern const struct kvm_stats_header kvm_vm_stats_header;
 extern const struct _kvm_stats_desc kvm_vm_stats_desc[];
 extern const struct kvm_stats_header kvm_vcpu_stats_header;