| 1 |
|
| 2 | |
| 3 | * Copyright (C) 2003 Sistina Software.
|
| 4 | * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
|
| 5 | *
|
| 6 | * Module Author: Heinz Mauelshagen
|
| 7 | *
|
| 8 | * This file is released under the GPL.
|
| 9 | *
|
| 10 | * Path-Selector registration.
|
| 11 |
|
| 12 |
|
| 13 | #ifndef DM_PATH_SELECTOR_H
|
| 14 | #define DM_PATH_SELECTOR_H
|
| 15 |
|
| 16 | #include <linux/device-mapper.h>
|
| 17 |
|
| 18 | #include "dm-mpath.h"
|
| 19 |
|
| 20 | |
| 21 | * We provide an abstraction for the code that chooses which path
|
| 22 | * to send some io down.
|
| 23 |
|
| 24 | struct path_selector_type;
|
| 25 | struct path_selector {
|
| 26 | struct path_selector_type *type;
|
| 27 | void *context;
|
| 28 | };
|
| 29 |
|
| 30 | |
| 31 | * If a path selector uses this flag, a high resolution timer is used
|
| 32 | * (via ktime_get_ns) to account for IO start time in BIO-based mpath.
|
| 33 | * This improves performance of some path selectors (i.e. HST), in
|
| 34 | * exchange for slightly higher overhead when submitting the BIO.
|
| 35 | * The extra cost is usually offset by improved path selection for
|
| 36 | * some benchmarks.
|
| 37 | *
|
| 38 | * This has no effect for request-based mpath, since it already uses a
|
| 39 | * higher precision timer by default.
|
| 40 |
|
| 41 | #define DM_PS_USE_HR_TIMER 0x00000001
|
| 42 | #define dm_ps_use_hr_timer(type) ((type)->features & DM_PS_USE_HR_TIMER)
|
| 43 |
|
| 44 |
|
| 45 | struct path_selector_type {
|
| 46 | char *name;
|
| 47 | struct module *module;
|
| 48 |
|
| 49 | unsigned int features;
|
| 50 | unsigned int table_args;
|
| 51 | unsigned int info_args;
|
| 52 |
|
| 53 | |
| 54 | * Constructs a path selector object, takes custom arguments
|
| 55 |
|
| 56 | int (*create)(struct path_selector *ps, unsigned int argc, char **argv);
|
| 57 | void (*destroy)(struct path_selector *ps);
|
| 58 |
|
| 59 | |
| 60 | * Add an opaque path object, along with some selector specific
|
| 61 | * path args (eg, path priority).
|
| 62 |
|
| 63 | int (*add_path)(struct path_selector *ps, struct dm_path *path,
|
| 64 | int argc, char **argv, char **error);
|
| 65 |
|
| 66 | |
| 67 | * Chooses a path for this io, if no paths are available then
|
| 68 | * NULL will be returned.
|
| 69 |
|
| 70 | struct dm_path *(*select_path)(struct path_selector *ps, size_t nr_bytes);
|
| 71 |
|
| 72 | |
| 73 | * Notify the selector that a path has failed.
|
| 74 |
|
| 75 | void (*fail_path)(struct path_selector *ps, struct dm_path *p);
|
| 76 |
|
| 77 | |
| 78 | * Ask selector to reinstate a path.
|
| 79 |
|
| 80 | int (*reinstate_path)(struct path_selector *ps, struct dm_path *p);
|
| 81 |
|
| 82 | |
| 83 | * Table content based on parameters added in ps_add_path_fn
|
| 84 | * or path selector status
|
| 85 |
|
| 86 | int (*status)(struct path_selector *ps, struct dm_path *path,
|
| 87 | status_type_t type, char *result, unsigned int maxlen);
|
| 88 |
|
| 89 | int (*start_io)(struct path_selector *ps, struct dm_path *path,
|
| 90 | size_t nr_bytes);
|
| 91 | int (*end_io)(struct path_selector *ps, struct dm_path *path,
|
| 92 | size_t nr_bytes, u64 start_time);
|
| 93 | };
|
| 94 |
|
| 95 |
|
| 96 | int dm_register_path_selector(struct path_selector_type *type);
|
| 97 |
|
| 98 |
|
| 99 | void dm_unregister_path_selector(struct path_selector_type *type);
|
| 100 |
|
| 101 |
|
| 102 | struct path_selector_type *dm_get_path_selector(const char *name);
|
| 103 |
|
| 104 |
|
| 105 | void dm_put_path_selector(struct path_selector_type *pst);
|
| 106 |
|
| 107 | #endif
|