We need to get rid of per job options that fiddle with global
state. It's confusing, and it breaks remote option handling.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
+ if (fio_pin_memory(td))
+ goto err;
+
/*
* May alter parameters that init_io_u() will use, so we need to
* do this first.
/*
* May alter parameters that init_io_u() will use, so we need to
* do this first.
td->ts.io_bytes[0] = td->io_bytes[0];
td->ts.io_bytes[1] = td->io_bytes[1];
td->ts.io_bytes[0] = td->io_bytes[0];
td->ts.io_bytes[1] = td->io_bytes[1];
+ fio_unpin_memory(td);
+
fio_mutex_down(writeout_mutex);
if (td->bw_log) {
if (td->o.bw_log_file) {
fio_mutex_down(writeout_mutex);
if (td->bw_log) {
if (td->o.bw_log_file) {
unsigned long spent;
unsigned int i, todo, nr_running, m_rate, t_rate, nr_started;
unsigned long spent;
unsigned int i, todo, nr_running, m_rate, t_rate, nr_started;
- if (fio_pin_memory())
- return;
-
if (fio_gtod_offload && fio_start_gtod_thread())
return;
if (fio_gtod_offload && fio_start_gtod_thread())
return;
}
static void *disk_thread_main(void *data)
}
static void *disk_thread_main(void *data)
*/
struct prof_io_ops prof_io_ops;
void *prof_data;
*/
struct prof_io_ops prof_io_ops;
void *prof_data;
extern int groupid;
extern int terse_output;
extern int temp_stall_ts;
extern int groupid;
extern int terse_output;
extern int temp_stall_ts;
-extern unsigned long long mlock_size;
extern unsigned long page_mask, page_size;
extern int read_only;
extern int eta_print;
extern unsigned long page_mask, page_size;
extern int read_only;
extern int eta_print;
-extern int __must_check fio_pin_memory(void);
-extern void fio_unpin_memory(void);
+extern int __must_check fio_pin_memory(struct thread_data *);
+extern void fio_unpin_memory(struct thread_data *);
extern int __must_check allocate_io_mem(struct thread_data *);
extern void free_io_mem(struct thread_data *);
extern void free_threads_shm(void);
extern int __must_check allocate_io_mem(struct thread_data *);
extern void free_io_mem(struct thread_data *);
extern void free_threads_shm(void);
int exitall_on_terminate = 0;
int terse_output = 0;
int eta_print;
int exitall_on_terminate = 0;
int terse_output = 0;
int eta_print;
-unsigned long long mlock_size = 0;
FILE *f_out = NULL;
FILE *f_err = NULL;
char **job_sections = NULL;
FILE *f_out = NULL;
FILE *f_err = NULL;
char **job_sections = NULL;
-static void *pinned_mem;
-
-void fio_unpin_memory(void)
+void fio_unpin_memory(struct thread_data *td)
- if (pinned_mem) {
- dprint(FD_MEM, "unpinning %llu bytes\n", mlock_size);
- if (munlock(pinned_mem, mlock_size) < 0)
+ if (td->pinned_mem) {
+ dprint(FD_MEM, "unpinning %llu bytes\n", td->o.lockmem);
+ if (munlock(td->pinned_mem, td->o.lockmem) < 0)
- munmap(pinned_mem, mlock_size);
- pinned_mem = NULL;
+ munmap(td->pinned_mem, td->o.lockmem);
+ td->pinned_mem = NULL;
-int fio_pin_memory(void)
+int fio_pin_memory(struct thread_data *td)
{
unsigned long long phys_mem;
{
unsigned long long phys_mem;
- dprint(FD_MEM, "pinning %llu bytes\n", mlock_size);
+ dprint(FD_MEM, "pinning %llu bytes\n", td->o.lockmem);
/*
* Don't allow mlock of more than real_mem-128MB
*/
phys_mem = os_phys_mem();
if (phys_mem) {
/*
* Don't allow mlock of more than real_mem-128MB
*/
phys_mem = os_phys_mem();
if (phys_mem) {
- if ((mlock_size + 128 * 1024 * 1024) > phys_mem) {
- mlock_size = phys_mem - 128 * 1024 * 1024;
+ if ((td->o.lockmem + 128 * 1024 * 1024) > phys_mem) {
+ td->o.lockmem = phys_mem - 128 * 1024 * 1024;
log_info("fio: limiting mlocked memory to %lluMB\n",
log_info("fio: limiting mlocked memory to %lluMB\n",
- pinned_mem = mmap(NULL, mlock_size, PROT_READ | PROT_WRITE,
+ td->pinned_mem = mmap(NULL, td->o.lockmem, PROT_READ | PROT_WRITE,
MAP_PRIVATE | OS_MAP_ANON, -1, 0);
MAP_PRIVATE | OS_MAP_ANON, -1, 0);
- if (pinned_mem == MAP_FAILED) {
+ if (td->pinned_mem == MAP_FAILED) {
perror("malloc locked mem");
perror("malloc locked mem");
- if (mlock(pinned_mem, mlock_size) < 0) {
+ if (mlock(td->pinned_mem, td->o.lockmem) < 0) {
- munmap(pinned_mem, mlock_size);
- pinned_mem = NULL;
+ munmap(td->pinned_mem, td->o.lockmem);
+ td->pinned_mem = NULL;
-static int str_lockmem_cb(void fio_unused *data, unsigned long long *val)
-{
- mlock_size = *val;
- return 0;
-}
-
static int str_rwmix_read_cb(void *data, unsigned long long *val)
{
struct thread_data *td = data;
static int str_rwmix_read_cb(void *data, unsigned long long *val)
{
struct thread_data *td = data;
.name = "lockmem",
.lname = "Lock memory",
.type = FIO_OPT_STR_VAL,
.name = "lockmem",
.lname = "Lock memory",
.type = FIO_OPT_STR_VAL,
+ .off1 = td_var_offset(lockmem),
.help = "Lock down this amount of memory",
.def = "0",
.interval = 1024 * 1024,
.help = "Lock down this amount of memory",
.def = "0",
.interval = 1024 * 1024,
unsigned long long zone_range;
unsigned long long zone_size;
unsigned long long zone_skip;
unsigned long long zone_range;
unsigned long long zone_size;
unsigned long long zone_skip;
+ unsigned long long lockmem;
enum fio_memtype mem_type;
unsigned int mem_align;
enum fio_memtype mem_type;
unsigned int mem_align;