/* * Copyright(c) 2012-2018 Intel Corporation * SPDX-License-Identifier: BSD-3-Clause-Clear */ /** * @file * @brief OCF API for updating and reseting statistics * * This file contains routines pertaining to manipulation of OCF IO statistics. */ #ifndef __OCF_STATS_H__ #define __OCF_STATS_H__ /** * Entire row of statistcs */ struct ocf_stat { /** Value */ uint64_t value; /** percent x100 */ uint64_t fraction; }; /** * @brief Usage statistics in 4 KiB unit * * An example of presenting statistics: *
* ╔══════════════════╤══════════╤═══════╤═════════════╗ * ║ Usage statistics │ Count │ % │ Units ║ * ╠══════════════════╪══════════╪═══════╪═════════════╣ * ║ Occupancy │ 20 │ 50.0 │ 4KiB blocks ║ * ║ Free │ 20 │ 50.0 │ 4KiB blocks ║ * ║ Clean │ 15 │ 75.0 │ 4KiB blocks ║ * ║ Dirty │ 5 │ 25.0 │ 4KiB blocks ║ * ╚══════════════════╧══════════╧═══════╧═════════════╝ **/ struct ocf_stats_usage { struct ocf_stat occupancy; struct ocf_stat free; struct ocf_stat clean; struct ocf_stat dirty; }; /** * @brief Requests statistcs * * An example of presenting statistics: *
* ╔══════════════════════╤═══════╤═══════╤══════════╗ * ║ Request statistics │ Count │ % │ Units ║ * ╠══════════════════════╪═══════╪═══════╪══════════╣ * ║ Read hits │ 10 │ 4.5 │ Requests ║ * ║ Read partial misses │ 1 │ 0.5 │ Requests ║ * ║ Read full misses │ 211 │ 95.0 │ Requests ║ * ║ Read total │ 222 │ 100.0 │ Requests ║ * ╟──────────────────────┼───────┼───────┼──────────╢ * ║ Write hits │ 0 │ 0.0 │ Requests ║ * ║ Write partial misses │ 0 │ 0.0 │ Requests ║ * ║ Write full misses │ 0 │ 0.0 │ Requests ║ * ║ Write total │ 0 │ 0.0 │ Requests ║ * ╟──────────────────────┼───────┼───────┼──────────╢ * ║ Pass-Through reads │ 0 │ 0.0 │ Requests ║ * ║ Pass-Through writes │ 0 │ 0.0 │ Requests ║ * ║ Serviced requests │ 222 │ 100.0 │ Requests ║ * ╟──────────────────────┼───────┼───────┼──────────╢ * ║ Total requests │ 222 │ 100.0 │ Requests ║ * ╚══════════════════════╧═══════╧═══════╧══════════╝ **/ struct ocf_stats_requests { struct ocf_stat rd_hits; struct ocf_stat rd_partial_misses; struct ocf_stat rd_full_misses; struct ocf_stat rd_total; struct ocf_stat wr_hits; struct ocf_stat wr_partial_misses; struct ocf_stat wr_full_misses; struct ocf_stat wr_total; struct ocf_stat rd_pt; struct ocf_stat wr_pt; struct ocf_stat serviced; struct ocf_stat total; }; /** * @brief Block statistics * * An example of presenting statistics: *
* ╔════════════════════════════════════╤═══════╤═══════╤═════════════╗ * ║ Block statistics │ Count │ % │ Units ║ * ╠════════════════════════════════════╪═══════╪═══════╪═════════════╣ * ║ Reads from core volume(s) │ 426 │ 100.0 │ 4KiB blocks ║ * ║ Writes to core volume(s) │ 0 │ 0.0 │ 4KiB blocks ║ * ║ Total to/from core volume (s) │ 426 │ 100.0 │ 4KiB blocks ║ * ╟────────────────────────────────────┼───────┼───────┼─────────────╢ * ║ Reads from cache volume │ 13 │ 3.0 │ 4KiB blocks ║ * ║ Writes to cache volume │ 426 │ 97.0 │ 4KiB blocks ║ * ║ Total to/from cache volume │ 439 │ 100.0 │ 4KiB blocks ║ * ╟────────────────────────────────────┼───────┼───────┼─────────────╢ * ║ Reads from core(s) │ 439 │ 100.0 │ 4KiB blocks ║ * ║ Writes to core(s) │ 0 │ 0.0 │ 4KiB blocks ║ * ║ Total to/from core(s) │ 439 │ 100.0 │ 4KiB blocks ║ * ╚════════════════════════════════════╧═══════╧═══════╧═════════════╝ **/ struct ocf_stats_blocks { struct ocf_stat core_volume_rd; struct ocf_stat core_volume_wr; struct ocf_stat core_volume_total; struct ocf_stat cache_volume_rd; struct ocf_stat cache_volume_wr; struct ocf_stat cache_volume_total; struct ocf_stat volume_rd; struct ocf_stat volume_wr; struct ocf_stat volume_total; }; /** * @brief Errors statistics * * An example of presenting statistics: *
* ╔════════════════════╤═══════╤═════╤══════════╗ * ║ Error statistics │ Count │ % │ Units ║ * ╠════════════════════╪═══════╪═════╪══════════╣ * ║ Cache read errors │ 0 │ 0.0 │ Requests ║ * ║ Cache write errors │ 0 │ 0.0 │ Requests ║ * ║ Cache total errors │ 0 │ 0.0 │ Requests ║ * ╟────────────────────┼───────┼─────┼──────────╢ * ║ Core read errors │ 0 │ 0.0 │ Requests ║ * ║ Core write errors │ 0 │ 0.0 │ Requests ║ * ║ Core total errors │ 0 │ 0.0 │ Requests ║ * ╟────────────────────┼───────┼─────┼──────────╢ * ║ Total errors │ 0 │ 0.0 │ Requests ║ * ╚════════════════════╧═══════╧═════╧══════════╝ **/ struct ocf_stats_errors { struct ocf_stat core_volume_rd; struct ocf_stat core_volume_wr; struct ocf_stat core_volume_total; struct ocf_stat cache_volume_rd; struct ocf_stat cache_volume_wr; struct ocf_stat cache_volume_total; struct ocf_stat total; }; /** * @param Collect statistics for given cache * * @param cache Cache instance for which statistics will be collected * @param usage Usage statistics * @param req Request statistics * @param blocks Blocks statistics * @param errors Errors statistics * * @retval 0 Success * @retval Non-zero Error */ int ocf_stats_collect_cache(ocf_cache_t cache, struct ocf_stats_usage *usage, struct ocf_stats_requests *req, struct ocf_stats_blocks *blocks, struct ocf_stats_errors *errors); /** * @param Collect statistics for given core * * @param core Core for which statistics will be collected * @param usage Usage statistics * @param req Request statistics * @param blocks Blocks statistics * @param errors Errors statistics * * @retval 0 Success * @retval Non-zero Error */ int ocf_stats_collect_core(ocf_core_t core, struct ocf_stats_usage *usage, struct ocf_stats_requests *req, struct ocf_stats_blocks *blocks, struct ocf_stats_errors *errors); /** * @param Collect statistics for given ioclass * * @param core Core handle for which statistics will be collected * @param part_id Ioclass id for which statistics will be collected * @param usage Usage statistics * @param req Request statistics * @param blocks Blocks statistics * * @retval 0 Success * @retval Non-zero Error */ int ocf_stats_collect_part_core(ocf_core_t core, ocf_part_id_t part_id, struct ocf_stats_usage *usage, struct ocf_stats_requests *req, struct ocf_stats_blocks *blocks); /** * @param Collect statistics for given ioclass * * @param cache Cache instance for which statistics will be collected * @param part_id Ioclass id for which statistics will be collected * @param usage Usage statistics * @param req Request statistics * @param blocks Blocks statistics * * @retval 0 Success * @retval Non-zero Error */ int ocf_stats_collect_part_cache(ocf_cache_t cache, ocf_part_id_t part_id, struct ocf_stats_usage *usage, struct ocf_stats_requests *req, struct ocf_stats_blocks *blocks); /** * @brief Initialize or reset core statistics * * Initialize or reset counters used for statistics. * * @param[in] core Core handle */ void ocf_core_stats_initialize(ocf_core_t core); /** * @brief Initialize or reset statistics of all cores in cache * * Initialize or reset counters used for statistics. * * @param[in] cache Cache handle */ void ocf_core_stats_initialize_all(ocf_cache_t cache); #endif /* __OCF_STATS_H__ */