}
io_queue = std::make_unique<aio_queue_t>(iodepth);
}
+
+ char name[128];
+ sprintf(name, "blk-kernel-device-%s", dev_name);
+ PerfCountersBuilder b(cct, name,
+ l_blk_kernel_device_first, l_blk_kernel_device_last);
+ b.set_prio_default(PerfCountersBuilder::PRIO_USEFUL);
+ b.add_u64_counter(l_blk_kernel_device_discard_op, "discard_op",
+ "Number of discard ops issued to kernel device");
+
+ logger.reset(b.create_perf_counters());
+ cct->get_perfcounters_collection()->add(logger.get());
}
KernelDevice::~KernelDevice()
{
+ if (logger) {
+ cct->get_perfcounters_collection()->remove(logger.get());
+ logger.reset();
+ }
cct->_conf.remove_observer(this);
}
discard_running ++;
l.unlock();
dout(20) << __func__ << " finishing" << dendl;
+ logger->inc(l_blk_kernel_device_discard_op, discard_processing.size());
for (auto p = discard_processing.begin(); p != discard_processing.end(); ++p) {
_discard(p.get_start(), p.get_len());
}
#define RW_IO_MAX (INT_MAX & CEPH_PAGE_MASK)
+enum {
+ l_blk_kernel_device_first = 1000,
+ l_blk_kernel_device_discard_op,
+ l_blk_kernel_device_last,
+};
+
class KernelDevice : public BlockDevice,
public md_config_obs_t {
protected:
void *discard_callback_priv;
bool aio_stop;
bool discard_stop;
+ std::unique_ptr<PerfCounters> logger;
ceph::mutex discard_lock = ceph::make_mutex("KernelDevice::discard_lock");
ceph::condition_variable discard_cond;