summaryrefslogtreecommitdiffstats
path: root/include/zpios-internal.h
blob: 24a2febb252a8da01355ff98cc0e6351a77f8ae2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*****************************************************************************\
 *  ZPIOS is a heavily modified version of the original PIOS test code.
 *  It is designed to have the test code running in the Linux kernel
 *  against ZFS while still being flexibly controled from user space.
 *
 *  Copyright (C) 2008-2010 Lawrence Livermore National Security, LLC.
 *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
 *  Written by Brian Behlendorf <behlendorf1@llnl.gov>.
 *  LLNL-CODE-403049
 *
 *  Original PIOS Test Code
 *  Copyright (C) 2004 Cluster File Systems, Inc.
 *  Written by Peter Braam <braam@clusterfs.com>
 *             Atul Vidwansa <atul@clusterfs.com>
 *             Milind Dumbare <milind@clusterfs.com>
 *
 *  This file is part of ZFS on Linux.
 *  For details, see <http://zfsonlinux.org/>.
 *
 *  ZPIOS is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the
 *  Free Software Foundation; either version 2 of the License, or (at your
 *  option) any later version.
 *
 *  ZPIOS is distributed in the hope that it will be useful, but WITHOUT
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 *  for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with ZPIOS.  If not, see <http://www.gnu.org/licenses/>.
\*****************************************************************************/

#ifndef _ZPIOS_INTERNAL_H
#define _ZPIOS_INTERNAL_H

#include "zpios-ctl.h"

#define OBJ_SIZE	64

struct run_args;

typedef struct dmu_obj {
	objset_t *os;
	uint64_t obj;
} dmu_obj_t;

/* thread doing the IO data */
typedef struct thread_data {
	struct run_args *run_args;
	int thread_no;
	int rc;
	zpios_stats_t stats;
        kmutex_t lock;
} thread_data_t;

/* region for IO data */
typedef struct zpios_region {
	__u64 wr_offset;
	__u64 rd_offset;
	__u64 init_offset;
	__u64 max_offset;
	dmu_obj_t obj;
	zpios_stats_t stats;
        kmutex_t lock;
} zpios_region_t;

/* arguments for one run */
typedef struct run_args {
	/* Config args */
	int id;
	char pool[ZPIOS_NAME_SIZE];
	__u64 chunk_size;
	__u32 thread_count;
	__u32 region_count;
	__u64 region_size;
	__u64 offset;
	__u32 region_noise;
	__u32 chunk_noise;
	__u32 thread_delay;
	__u32 flags;
	char pre[ZPIOS_PATH_SIZE];
	char post[ZPIOS_PATH_SIZE];
	char log[ZPIOS_PATH_SIZE];

	/* Control data */
	objset_t *os;
        wait_queue_head_t waitq;
	volatile uint64_t threads_done;
        kmutex_t lock_work;
	kmutex_t lock_ctl;
	__u32 region_next;

	/* Results data */
	struct file *file;
	zpios_stats_t stats;

	thread_data_t **threads;
	zpios_region_t regions[0]; /* Must be last element */
} run_args_t;

#define ZPIOS_INFO_BUFFER_SIZE          65536
#define ZPIOS_INFO_BUFFER_REDZONE       1024

typedef struct zpios_info {
        spinlock_t info_lock;
        int info_size;
        char *info_buffer;
        char *info_head;        /* Internal kernel use only */
} zpios_info_t;

#define zpios_print(file, format, args...)                              \
({      zpios_info_t *_info_ = (zpios_info_t *)file->private_data;      \
        int _rc_;                                                       \
                                                                        \
        ASSERT(_info_);                                                 \
        ASSERT(_info_->info_buffer);                                    \
                                                                        \
        spin_lock(&_info_->info_lock);                                  \
                                                                        \
        /* Don't allow the kernel to start a write in the red zone */   \
        if ((int)(_info_->info_head - _info_->info_buffer) >            \
            (_info_->info_size - ZPIOS_INFO_BUFFER_REDZONE))      {     \
                _rc_ = -EOVERFLOW;                                      \
        } else {                                                        \
                _rc_ = sprintf(_info_->info_head, format, args);        \
                if (_rc_ >= 0)                                          \
                        _info_->info_head += _rc_;                      \
        }                                                               \
                                                                        \
        spin_unlock(&_info_->info_lock);                                \
        _rc_;                                                           \
})

#define zpios_vprint(file, test, format, args...)                       \
        zpios_print(file, "%*s: " format, ZPIOS_NAME_SIZE, test, args)

#endif /* _ZPIOS_INTERNAL_H */