Recent changes (master)
The following changes since commit c16035aadd600a3a4c4b241339e3d3099f56c4b2:
backend: fix a case where we complain about no IO being done (2017-09-28 06:58:23 -0600)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to e6fe02651641fc64d2fa4fcfe9b1013b2947d11b:
Merge branch 'master' of https://github.com/dyniusz/fio (2017-10-03 11:19:26 -0600)
----------------------------------------------------------------
Erwan Velu (7):
io_u: Converting usec from long to uint64_t
backend: Removing double definition of the same variable
backend: Removing memory leak in run_threads() oslib/libmtd: Removing useless err assigment t/gen-rand: Avoid memleak of buckets()
client: Avoid memory leak in fio_client_handle_iolog()
client: Fixing invalid use after free()
Jens Axboe (3):
Merge branch 'evelu/cleanup' of https://github.com/ErwanAliasr1/fio
client: fix pointer vs uint8_t comparison
Merge branch 'master' of https://github.com/dyniusz/fio
dyniusz (2):
Adjustments to support C++ engines
null context segfault fix
backend.c | 2 +- client.c | 37 +++++++++--- engines/null.c | 164 +++++++++++++++++++++++++++++++++++++++++++------- examples/cpp_null.fio | 10 +++ file.h | 6 ++ io_u.c | 2 +- ioengines.c | 5 +- lib/types.h | 2 +- oslib/libmtd.c | 1 - t/gen-rand.c | 2 +- 10 files changed, 192 insertions(+), 39 deletions(-) create mode 100644 examples/cpp_null.fio
---
Diff of recent changes:
backend.c +1 -1
@@ -499,7 +499,6 @@ int io_queue_event(struct thread_data *td, struct io_u *io_u, int *ret,if (ddir_rw (io_u->ddir)) td->ts.short_io_u[io_u->ddir]++; - f = io_u->file;if (io_u->offset == f->real_file_size) goto sync_done;
@@ -2347,6 +2346,7 @@ reap:fio_terminate_threads (TERMINATE_ALL ); fio_abort =1 ; nr_started--; +free (fd);break ; }dprint (FD_MUTEX ,"done waiting on startup_mutex\n" );
client.c +27 -10
@@ -1312,14 +1312,16 @@ static void client_flush_hist_samples(FILE *f, int hist_coarseness, void *samplestatic int fio_client_handle_iolog (struct fio_client *client,struct fio_net_cmd *cmd) { -struct cmd_iolog_pdu *pdu; +struct cmd_iolog_pdu *pdu =NULL ;bool store_direct; -char *log_pathname; +char *log_pathname =NULL ; +int ret =0 ; pdu =convert_iolog (cmd, &store_direct);if (!pdu) {log_err ("fio: failed converting IO log\n" ); -return 1 ; + ret =1 ; + goto out; }/* allocate buffer big enough for next sprintf() call */
@@ -1327,7 +1329,8 @@ static int fio_client_handle_iolog(struct fio_client *client, strlen(client->hostname));if (!log_pathname) {log_err ("fio: memory allocation of unique pathname failed\n" ); -return -1 ; + ret =-1 ; + goto out; }/* generate a unique pathname for the log file using hostname */ sprintf (log_pathname,"%s.%s" , pdu->name, client->hostname);
@@ -1342,7 +1345,8 @@ static int fio_client_handle_iolog(struct fio_client *client,if (fd <0 ) {log_err ("fio: open log %s: %s\n" , log_pathname,strerror (errno)); -return 1 ; + ret =1 ; + goto out; } sz = cmd->pdu_len -sizeof (*pdu);
@@ -1351,17 +1355,19 @@ static int fio_client_handle_iolog(struct fio_client *client,if (ret != sz) {log_err ("fio: short write on compressed log\n" ); -return 1 ; + ret =1 ; + goto out; } -return 0 ; + ret =0 ; }else {FILE *f; f =fopen ((const char *) log_pathname,"w" );if (!f) {log_err ("fio: fopen log %s : %s\n" , log_pathname,strerror (errno)); -return 1 ; + ret =1 ; + goto out; }if (pdu->log_type ==IO_LOG_TYPE_HIST ) {
@@ -1372,8 +1378,17 @@ static int fio_client_handle_iolog(struct fio_client *client, pdu->nr_samples * sizeof(struct io_sample)); }fclose (f); -return 0 ; + ret =0 ; } + +out: +if (pdu && pdu != (void *) cmd->payload) +free (pdu); + +if (log_pathname) +free (log_pathname); + +return ret; }static void handle_probe (struct fio_client *client,struct fio_net_cmd *cmd)
@@ -1849,10 +1864,12 @@ static void request_client_etas(struct client_ops *ops)static int handle_cmd_timeout (struct fio_client *client,struct fio_net_cmd_reply *reply) { +uint16_t reply_opcode = reply->opcode; +flist_del (&reply->list);free (reply); -if (reply->opcode !=FIO_NET_CMD_SEND_ETA ) +if (reply_opcode !=FIO_NET_CMD_SEND_ETA )return 1 ;log_info ("client <%s>: timeout on SEND_ETA\n" , client->hostname);
engines/null.c +141 -23
231 lines not on this page · raw message
examples/cpp_null.fio new file +10 -0
@@ -0,0 +1,10 @@ +[global] +bs=4k +gtod_reduce=1 + +[null] +ioengine=cpp_null +size=100g +rw=randread +norandommap +time_based=0
file.h +6 -0
@@ -188,9 +188,15 @@ extern void close_and_free_files(struct thread_data *);extern uint64_t get_start_offset (struct thread_data *,struct fio_file *);extern int __must_check setup_files (struct thread_data *);extern int __must_check file_invalidate_cache (struct thread_data *,struct fio_file *); +#ifdef __cplusplus +extern "C" { +#endif extern int __must_check generic_open_file (struct thread_data *,struct fio_file *);extern int __must_check generic_close_file (struct thread_data *,struct fio_file *);extern int __must_check generic_get_file_size (struct thread_data *,struct fio_file *); +#ifdef __cplusplus +} +#endif extern int __must_check file_lookup_open (struct fio_file *f,int flags);extern int __must_check pre_read_files (struct thread_data *);extern unsigned long long get_rand_file_size (struct thread_data *td);
io_u.c +1 -1
@@ -662,7 +662,7 @@ int io_u_quiesce(struct thread_data *td)static enum fio_ddir rate_ddir (struct thread_data *td,enum fio_ddir ddir) {enum fio_ddir odir = ddir ^1 ; -long usec; +uint64_t usec;uint64_t now;assert (ddir_rw (ddir));
ioengines.c +4 -1
@@ -133,8 +133,10 @@ static struct ioengine_ops *__load_ioengine(const char *name)/* * linux libaio has alias names, so convert to what we want */ -if (!strncmp (engine,"linuxaio" ,8 ) || !strncmp (engine,"aio" ,3 )) +if (!strncmp (engine,"linuxaio" ,8 ) || !strncmp (engine,"aio" ,3 )) { +dprint (FD_IO ,"converting ioengine name: %s -> libaio\n" , name);strcpy (engine,"libaio" ); + }dprint (FD_IO ,"load ioengine %s\n" , engine);return find_ioengine (engine);
@@ -436,6 +438,7 @@ int td_io_open_file(struct thread_data *td, struct fio_file *f) {assert (!fio_file_open (f));assert (f->fd ==-1 ); +assert (td->io_ops->open_file);if (td->io_ops->open_file (td, f)) {if (td->error ==EINVAL && td->o.odirect)
lib/types.h +1 -1
@@ -1,7 +1,7 @@#ifndef FIO_TYPES_H #define FIO_TYPES_H -#ifndef CONFIG_HAVE_BOOL +#if !defined(CONFIG_HAVE_BOOL ) && !defined(__cplusplus)typedef int bool ;#ifndef false#define false 0
oslib/libmtd.c +0 -1
@@ -1002,7 +1002,6 @@ int mtd_torture(libmtd_t desc, const struct mtd_dev_info *mtd, int fd, int eb) } } - err =0 ;normsg ("PEB %d passed torture test, do not mark it a bad" , eb); out:
t/gen-rand.c +1 -1
@@ -63,6 +63,6 @@ int main(int argc, char *argv[]) }printf ("Passes=%lu, Fail=%lu\n" , pass, fail); - +free (buckets);return 0 ; }