ocf/inc/ocf_trace.h
Michal Mielewczyk e53944d472 Dynamic I/O queue management
- Queue allocation is now separated from starting cache.
- Queue can be created and destroyed in runtime.
- All queue ops accept queue handle instead of queue id.
- Cache stores queues as list instead of array.

Signed-off-by: Michal Mielewczyk <michal.mielewczyk@intel.com>
Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
2019-02-26 17:36:19 +01:00

186 lines
3.3 KiB
C

/*
* Copyright(c) 2012-2018 Intel Corporation
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#ifndef __OCF_TRACE_H__
#define __OCF_TRACE_H__
#include "ocf_def.h"
#include "ocf_types.h"
typedef uint64_t log_sid_t;
#define OCF_EVENT_VERSION 1
#define OCF_TRACING_STOP 1
/**
* @brief OCF trace (event) type
*/
typedef enum {
/** IO trace description, this event is pushed first to indicate version
* of traces, number of cores and provides details about cache */
ocf_event_type_cache_desc,
/** Event describing ocf core */
ocf_event_type_core_desc,
/** IO */
ocf_event_type_io,
/** IO completion */
ocf_event_type_io_cmpl,
/** IO in file domain */
ocf_event_type_io_file,
} ocf_event_type;
/**
* @brief Generic OCF trace event
*/
struct ocf_event_hdr {
/** Event sequence ID */
log_sid_t sid;
/** Time stamp */
uint64_t timestamp;
/** Trace event type */
ocf_event_type type;
/** Size of this event */
uint32_t size;
};
/**
* @brief Cache trace description
*/
struct ocf_event_cache_desc {
/** Event header */
struct ocf_event_hdr hdr;
/** Cache Id */
ocf_cache_id_t id;
/** Cache line size */
ocf_cache_line_size_t cache_line_size;
/** Cache mode */
ocf_cache_mode_t cache_mode;
/** Cache size in bytes*/
uint64_t cache_size;
/** Number of cores */
uint32_t cores_no;
/** Trace version */
uint32_t version;
};
/**
* @brief Core trace description
*/
struct ocf_event_core_desc {
/** Event header */
struct ocf_event_hdr hdr;
/** Core Id */
ocf_core_id_t id;
/** Core size in bytes */
uint64_t core_size;
};
/** @brief IO operation */
typedef enum {
/** Read */
ocf_event_operation_rd = 'R',
/** Write */
ocf_event_operation_wr = 'W',
/** Flush */
ocf_event_operation_flush = 'F',
/** Discard */
ocf_event_operation_discard = 'D',
} ocf_event_operation_t;
/**
* @brief IO trace event
*/
struct ocf_event_io {
/** Trace event header */
struct ocf_event_hdr hdr;
/** Address of IO in bytes */
uint64_t addr;
/** Size of IO in bytes */
uint32_t len;
/** IO class of IO */
uint32_t io_class;
/** Core ID */
ocf_core_id_t core_id;
/** Operation type: read, write, trim or flush **/
ocf_event_operation_t operation;
};
/**
* @brief IO completion event
*/
struct ocf_event_io_cmpl {
/** Trace event header */
struct ocf_event_hdr hdr;
/** Reference event sequence ID */
log_sid_t rsid;
/** Was IO a cache hit or miss */
bool is_hit;
};
/** @brief Push log callback.
*
* @param[in] cache OCF cache
* @param[in] trace_ctx Tracing context
* @param[in] queue Queue handle
* @param[out] trace Event log
* @param[out] size Size of event log
*
* @return 0 If pushing trace succeeded
* @return Non-zero error
*/
typedef void (*ocf_trace_callback_t)(ocf_cache_t cache, void *trace_ctx,
ocf_queue_t queue, const void* trace, const uint32_t size);
/**
* @brief Start tracing
*
* @param[in] cache OCF cache
* @param[in] trace_ctx Tracing context
* @param[in] trace_callback Callback used for pushing logs
*
* @retval 0 Tracing started successfully
* @retval Non-zero Error
*/
int ocf_mngt_start_trace(ocf_cache_t cache, void *trace_ctx,
ocf_trace_callback_t trace_callback);
/**
* @brief Stop tracing
*
* @param[in] cache OCF cache
*
* @retval 0 Tracing stopped successfully
* @retval Non-zero Error
*/
int ocf_mngt_stop_trace(ocf_cache_t cache);
#endif /* __OCF_TRACE_H__ */