X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=iolog.c;h=4c87f1cb88d723f90712da14474ce2d1fe71deba;hb=cbf448e125bd4d2d698151d9fc6fa43956017d80;hp=aec0881ed51784f69d16d32ce01132f070674f66;hpb=6fa3ad511a61666b492ed8126330db9f876359bc;p=fio.git diff --git a/iolog.c b/iolog.c index aec0881e..4c87f1cb 100644 --- a/iolog.c +++ b/iolog.c @@ -587,6 +587,15 @@ void setup_log(struct io_log **log, struct log_params *p, l->filename = strdup(filename); l->td = p->td; + if (l->td && l->td->o.io_submit_mode != IO_MODE_OFFLOAD) { + struct io_logs *p; + + p = calloc(1, sizeof(*l->pending)); + p->max_samples = DEF_LOG_ENTRIES; + p->log = calloc(p->max_samples, log_entry_sz(l)); + l->pending = p; + } + if (l->log_offset) l->log_ddir_mask = LOG_OFFSET_SAMPLE_BIT; @@ -595,7 +604,7 @@ void setup_log(struct io_log **log, struct log_params *p, if (l->log_gz && !p->td) l->log_gz = 0; else if (l->log_gz || l->log_gz_store) { - pthread_mutex_init(&l->chunk_lock, NULL); + mutex_init_pshared(&l->chunk_lock); p->td->flags |= TD_F_COMPRESS_LOG; } @@ -636,8 +645,16 @@ void free_log(struct io_log *log) cur_log = flist_first_entry(&log->io_logs, struct io_logs, list); flist_del_init(&cur_log->list); free(cur_log->log); + sfree(cur_log); + } + + if (log->pending) { + free(log->pending->log); + free(log->pending); + log->pending = NULL; } + free(log->pending); free(log->filename); sfree(log); } @@ -948,7 +965,7 @@ int iolog_file_inflate(const char *file) #endif -void flush_log(struct io_log *log, int do_append) +void flush_log(struct io_log *log, bool do_append) { void *buf; FILE *f; @@ -972,6 +989,7 @@ void flush_log(struct io_log *log, int do_append) cur_log = flist_first_entry(&log->io_logs, struct io_logs, list); flist_del_init(&cur_log->list); flush_samples(f, cur_log->log, cur_log->nr_samples * log_entry_sz(log)); + sfree(cur_log); } fclose(f); @@ -1210,9 +1228,7 @@ static int iolog_flush(struct io_log *log) data->samples = cur_log->log; data->nr_samples = cur_log->nr_samples; - cur_log->nr_samples = 0; - cur_log->max_samples = 0; - cur_log->log = NULL; + sfree(cur_log); gz_work(data); }