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

dm-kcopyd.h (3013B)


      1/*
      2 * Copyright (C) 2001 - 2003 Sistina Software
      3 * Copyright (C) 2004 - 2008 Red Hat, Inc. All rights reserved.
      4 *
      5 * kcopyd provides a simple interface for copying an area of one
      6 * block-device to one or more other block-devices, either synchronous
      7 * or with an asynchronous completion notification.
      8 *
      9 * This file is released under the GPL.
     10 */
     11
     12#ifndef _LINUX_DM_KCOPYD_H
     13#define _LINUX_DM_KCOPYD_H
     14
     15#ifdef __KERNEL__
     16
     17#include <linux/dm-io.h>
     18
     19/* FIXME: make this configurable */
     20#define DM_KCOPYD_MAX_REGIONS 8
     21
     22#define DM_KCOPYD_IGNORE_ERROR 1
     23#define DM_KCOPYD_WRITE_SEQ    2
     24
     25struct dm_kcopyd_throttle {
     26	unsigned throttle;
     27	unsigned num_io_jobs;
     28	unsigned io_period;
     29	unsigned total_period;
     30	unsigned last_jiffies;
     31};
     32
     33/*
     34 * kcopyd clients that want to support throttling must pass an initialised
     35 * dm_kcopyd_throttle struct into dm_kcopyd_client_create().
     36 * Two or more clients may share the same instance of this struct between
     37 * them if they wish to be throttled as a group.
     38 *
     39 * This macro also creates a corresponding module parameter to configure
     40 * the amount of throttling.
     41 */
     42#define DECLARE_DM_KCOPYD_THROTTLE_WITH_MODULE_PARM(name, description)	\
     43static struct dm_kcopyd_throttle dm_kcopyd_throttle = { 100, 0, 0, 0, 0 }; \
     44module_param_named(name, dm_kcopyd_throttle.throttle, uint, 0644); \
     45MODULE_PARM_DESC(name, description)
     46
     47/*
     48 * To use kcopyd you must first create a dm_kcopyd_client object.
     49 * throttle can be NULL if you don't want any throttling.
     50 */
     51struct dm_kcopyd_client;
     52struct dm_kcopyd_client *dm_kcopyd_client_create(struct dm_kcopyd_throttle *throttle);
     53void dm_kcopyd_client_destroy(struct dm_kcopyd_client *kc);
     54void dm_kcopyd_client_flush(struct dm_kcopyd_client *kc);
     55
     56/*
     57 * Submit a copy job to kcopyd.  This is built on top of the
     58 * previous three fns.
     59 *
     60 * read_err is a boolean,
     61 * write_err is a bitset, with 1 bit for each destination region
     62 */
     63typedef void (*dm_kcopyd_notify_fn)(int read_err, unsigned long write_err,
     64				    void *context);
     65
     66void dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from,
     67		    unsigned num_dests, struct dm_io_region *dests,
     68		    unsigned flags, dm_kcopyd_notify_fn fn, void *context);
     69
     70/*
     71 * Prepare a callback and submit it via the kcopyd thread.
     72 *
     73 * dm_kcopyd_prepare_callback allocates a callback structure and returns it.
     74 * It must not be called from interrupt context.
     75 * The returned value should be passed into dm_kcopyd_do_callback.
     76 *
     77 * dm_kcopyd_do_callback submits the callback.
     78 * It may be called from interrupt context.
     79 * The callback is issued from the kcopyd thread.
     80 */
     81void *dm_kcopyd_prepare_callback(struct dm_kcopyd_client *kc,
     82				 dm_kcopyd_notify_fn fn, void *context);
     83void dm_kcopyd_do_callback(void *job, int read_err, unsigned long write_err);
     84
     85void dm_kcopyd_zero(struct dm_kcopyd_client *kc,
     86		    unsigned num_dests, struct dm_io_region *dests,
     87		    unsigned flags, dm_kcopyd_notify_fn fn, void *context);
     88
     89#endif	/* __KERNEL__ */
     90#endif	/* _LINUX_DM_KCOPYD_H */