cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

blk-wbt.h (2774B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef WB_THROTTLE_H
      3#define WB_THROTTLE_H
      4
      5#include <linux/kernel.h>
      6#include <linux/atomic.h>
      7#include <linux/wait.h>
      8#include <linux/timer.h>
      9#include <linux/ktime.h>
     10
     11#include "blk-stat.h"
     12#include "blk-rq-qos.h"
     13
     14enum wbt_flags {
     15	WBT_TRACKED		= 1,	/* write, tracked for throttling */
     16	WBT_READ		= 2,	/* read */
     17	WBT_KSWAPD		= 4,	/* write, from kswapd */
     18	WBT_DISCARD		= 8,	/* discard */
     19
     20	WBT_NR_BITS		= 4,	/* number of bits */
     21};
     22
     23enum {
     24	WBT_RWQ_BG		= 0,
     25	WBT_RWQ_KSWAPD,
     26	WBT_RWQ_DISCARD,
     27	WBT_NUM_RWQ,
     28};
     29
     30/*
     31 * Enable states. Either off, or on by default (done at init time),
     32 * or on through manual setup in sysfs.
     33 */
     34enum {
     35	WBT_STATE_ON_DEFAULT	= 1,
     36	WBT_STATE_ON_MANUAL	= 2,
     37	WBT_STATE_OFF_DEFAULT
     38};
     39
     40struct rq_wb {
     41	/*
     42	 * Settings that govern how we throttle
     43	 */
     44	unsigned int wb_background;		/* background writeback */
     45	unsigned int wb_normal;			/* normal writeback */
     46
     47	short enable_state;			/* WBT_STATE_* */
     48
     49	/*
     50	 * Number of consecutive periods where we don't have enough
     51	 * information to make a firm scale up/down decision.
     52	 */
     53	unsigned int unknown_cnt;
     54
     55	u64 win_nsec;				/* default window size */
     56	u64 cur_win_nsec;			/* current window size */
     57
     58	struct blk_stat_callback *cb;
     59
     60	u64 sync_issue;
     61	void *sync_cookie;
     62
     63	unsigned int wc;
     64
     65	unsigned long last_issue;		/* last non-throttled issue */
     66	unsigned long last_comp;		/* last non-throttled comp */
     67	unsigned long min_lat_nsec;
     68	struct rq_qos rqos;
     69	struct rq_wait rq_wait[WBT_NUM_RWQ];
     70	struct rq_depth rq_depth;
     71};
     72
     73static inline struct rq_wb *RQWB(struct rq_qos *rqos)
     74{
     75	return container_of(rqos, struct rq_wb, rqos);
     76}
     77
     78static inline unsigned int wbt_inflight(struct rq_wb *rwb)
     79{
     80	unsigned int i, ret = 0;
     81
     82	for (i = 0; i < WBT_NUM_RWQ; i++)
     83		ret += atomic_read(&rwb->rq_wait[i].inflight);
     84
     85	return ret;
     86}
     87
     88
     89#ifdef CONFIG_BLK_WBT
     90
     91int wbt_init(struct request_queue *);
     92void wbt_disable_default(struct request_queue *);
     93void wbt_enable_default(struct request_queue *);
     94
     95u64 wbt_get_min_lat(struct request_queue *q);
     96void wbt_set_min_lat(struct request_queue *q, u64 val);
     97
     98void wbt_set_write_cache(struct request_queue *, bool);
     99
    100u64 wbt_default_latency_nsec(struct request_queue *);
    101
    102#else
    103
    104static inline int wbt_init(struct request_queue *q)
    105{
    106	return -EINVAL;
    107}
    108static inline void wbt_disable_default(struct request_queue *q)
    109{
    110}
    111static inline void wbt_enable_default(struct request_queue *q)
    112{
    113}
    114static inline void wbt_set_write_cache(struct request_queue *q, bool wc)
    115{
    116}
    117static inline u64 wbt_get_min_lat(struct request_queue *q)
    118{
    119	return 0;
    120}
    121static inline void wbt_set_min_lat(struct request_queue *q, u64 val)
    122{
    123}
    124static inline u64 wbt_default_latency_nsec(struct request_queue *q)
    125{
    126	return 0;
    127}
    128
    129#endif /* CONFIG_BLK_WBT */
    130
    131#endif