X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=server.c;h=e3fbf0fdd6da562297afb1cc2d07f2ba0b97664a;hp=514306dcff5daadb1bb7f45edf5e0d2c78cd2189;hb=7089165b973c6bc48e11cadcb5a39c7adbae124c;hpb=135be493d843d4cae2966a35cbd22a3058ec8e4b diff --git a/server.c b/server.c index 514306dc..e3fbf0fd 100644 --- a/server.c +++ b/server.c @@ -11,12 +11,15 @@ #include #include #include +#include #include #include #include #include #include +#ifdef CONFIG_ZLIB #include +#endif #include "fio.h" #include "server.h" @@ -33,6 +36,12 @@ static char *bind_sock; static struct sockaddr_in saddr_in; static struct sockaddr_in6 saddr_in6; static int use_ipv6; +#ifdef CONFIG_ZLIB +static unsigned int has_zlib = 1; +#else +static unsigned int has_zlib = 0; +#endif +static unsigned int use_zlib; struct fio_fork_item { struct flist_head list; @@ -293,8 +302,9 @@ struct fio_net_cmd *fio_net_recv_cmd(int sk) static void add_reply(uint64_t tag, struct flist_head *list) { - struct fio_net_cmd_reply *reply = (struct fio_net_cmd_reply *) tag; + struct fio_net_cmd_reply *reply; + reply = (struct fio_net_cmd_reply *) (uintptr_t) tag; flist_add_tail(&reply->list, list); } @@ -313,8 +323,9 @@ static uint64_t alloc_reply(uint64_t tag, uint16_t opcode) static void free_reply(uint64_t tag) { - struct fio_net_cmd_reply *reply = (struct fio_net_cmd_reply *) tag; + struct fio_net_cmd_reply *reply; + reply = (struct fio_net_cmd_reply *) (uintptr_t) tag; free(reply); } @@ -614,7 +625,8 @@ static int handle_jobline_cmd(struct fio_net_cmd *cmd) static int handle_probe_cmd(struct fio_net_cmd *cmd) { - struct cmd_probe_pdu probe; + struct cmd_client_probe_pdu *pdu = (struct cmd_client_probe_pdu *) cmd->payload; + struct cmd_probe_reply_pdu probe; uint64_t tag = cmd->tag; dprint(FD_NET, "server: sending probe reply\n"); @@ -630,7 +642,17 @@ static int handle_probe_cmd(struct fio_net_cmd *cmd) probe.arch = FIO_ARCH; probe.bpp = sizeof(void *); probe.cpus = __cpu_to_le32(cpus_online()); - probe.flags = 0; + + /* + * If the client supports compression and we do too, then enable it + */ + if (has_zlib && le64_to_cpu(pdu->flags) & FIO_PROBE_FLAG_ZLIB) { + probe.flags = __cpu_to_le64(FIO_PROBE_FLAG_ZLIB); + use_zlib = 1; + } else { + probe.flags = 0; + use_zlib = 0; + } return fio_net_send_cmd(server_fd, FIO_NET_CMD_PROBE, &probe, sizeof(probe), &tag, NULL); } @@ -659,6 +681,7 @@ static int handle_send_eta_cmd(struct fio_net_cmd *cmd) je->nr_running = cpu_to_le32(je->nr_running); je->nr_ramp = cpu_to_le32(je->nr_ramp); je->nr_pending = cpu_to_le32(je->nr_pending); + je->nr_setting_up = cpu_to_le32(je->nr_setting_up); je->files_open = cpu_to_le32(je->files_open); for (i = 0; i < DDIR_RWDIR_CNT; i++) { @@ -674,6 +697,7 @@ static int handle_send_eta_cmd(struct fio_net_cmd *cmd) je->eta_sec = cpu_to_le64(je->eta_sec); je->nr_threads = cpu_to_le32(je->nr_threads); je->is_pow2 = cpu_to_le32(je->is_pow2); + je->unit_base = cpu_to_le32(je->unit_base); fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, je, size, &tag, NULL); free(je); @@ -714,8 +738,9 @@ static int handle_command(struct fio_net_cmd *cmd) { int ret; - dprint(FD_NET, "server: got op [%s], pdu=%u, tag=%lx\n", - fio_server_op(cmd->opcode), cmd->pdu_len, cmd->tag); + dprint(FD_NET, "server: got op [%s], pdu=%u, tag=%llx\n", + fio_server_op(cmd->opcode), cmd->pdu_len, + (unsigned long long) cmd->tag); switch (cmd->opcode) { case FIO_NET_CMD_QUIT: @@ -937,7 +962,9 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src) } dst->kb_base = cpu_to_le32(src->kb_base); + dst->unit_base = cpu_to_le32(src->unit_base); dst->groupid = cpu_to_le32(src->groupid); + dst->unified_rw_rep = cpu_to_le32(src->unified_rw_rep); } /* @@ -962,6 +989,7 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) p.ts.groupid = cpu_to_le32(ts->groupid); p.ts.pid = cpu_to_le32(ts->pid); p.ts.members = cpu_to_le32(ts->members); + p.ts.unified_rw_rep = cpu_to_le32(ts->unified_rw_rep); for (i = 0; i < DDIR_RWDIR_CNT; i++) { convert_io_stat(&p.ts.clat_stat[i], &ts->clat_stat[i]); @@ -999,7 +1027,7 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) for (j = 0; j < FIO_IO_U_PLAT_NR; j++) p.ts.io_u_plat[i][j] = cpu_to_le32(ts->io_u_plat[i][j]); - for (i = 0; i < 3; i++) { + for (i = 0; i < DDIR_RWDIR_CNT; i++) { p.ts.total_io_u[i] = cpu_to_le64(ts->total_io_u[i]); p.ts.short_io_u[i] = cpu_to_le64(ts->short_io_u[i]); } @@ -1017,6 +1045,7 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) p.ts.total_err_count = cpu_to_le64(ts->total_err_count); p.ts.first_error = cpu_to_le32(ts->first_error); p.ts.kb_base = cpu_to_le32(ts->kb_base); + p.ts.unit_base = cpu_to_le32(ts->unit_base); convert_gs(&p.rs, rs); @@ -1109,26 +1138,12 @@ static int fio_send_cmd_ext_pdu(int sk, uint16_t opcode, const void *buf, return fio_sendv_data(sk, iov, 2); } -int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) +static int fio_send_iolog_gz(struct cmd_iolog_pdu *pdu, struct io_log *log) { - struct cmd_iolog_pdu pdu; + int ret = 0; +#ifdef CONFIG_ZLIB z_stream stream; void *out_pdu; - int i, ret = 0; - - pdu.thread_number = cpu_to_le32(td->thread_number); - pdu.nr_samples = __cpu_to_le32(log->nr_samples); - pdu.log_type = cpu_to_le32(log->log_type); - strcpy((char *) pdu.name, name); - - for (i = 0; i < log->nr_samples; i++) { - struct io_sample *s = &log->log[i]; - - s->time = cpu_to_le64(s->time); - s->val = cpu_to_le64(s->val); - s->ddir = cpu_to_le32(s->ddir); - s->bs = cpu_to_le32(s->bs); - } /* * Dirty - since the log is potentially huge, compress it into @@ -1146,14 +1161,6 @@ int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) goto err; } - /* - * Send header first, it's not compressed. - */ - ret = fio_send_cmd_ext_pdu(server_fd, FIO_NET_CMD_IOLOG, &pdu, - sizeof(pdu), 0, FIO_NET_CMD_F_MORE); - if (ret) - goto err_zlib; - stream.next_in = (void *) log->log; stream.avail_in = log->nr_samples * sizeof(struct io_sample); @@ -1183,9 +1190,48 @@ err_zlib: deflateEnd(&stream); err: free(out_pdu); +#endif return ret; } +int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) +{ + struct cmd_iolog_pdu pdu; + int i, ret = 0; + + pdu.thread_number = cpu_to_le32(td->thread_number); + pdu.nr_samples = __cpu_to_le32(log->nr_samples); + pdu.log_type = cpu_to_le32(log->log_type); + pdu.compressed = cpu_to_le32(use_zlib); + strcpy((char *) pdu.name, name); + + for (i = 0; i < log->nr_samples; i++) { + struct io_sample *s = &log->log[i]; + + s->time = cpu_to_le64(s->time); + s->val = cpu_to_le64(s->val); + s->ddir = cpu_to_le32(s->ddir); + s->bs = cpu_to_le32(s->bs); + } + + /* + * Send header first, it's not compressed. + */ + ret = fio_send_cmd_ext_pdu(server_fd, FIO_NET_CMD_IOLOG, &pdu, + sizeof(pdu), 0, FIO_NET_CMD_F_MORE); + if (ret) + return ret; + + /* + * Now send actual log, compress if we can, otherwise just plain + */ + if (use_zlib) + return fio_send_iolog_gz(&pdu, log); + + return fio_send_cmd_ext_pdu(server_fd, FIO_NET_CMD_IOLOG, log->log, + log->nr_samples * sizeof(struct io_sample), 0, 0); +} + void fio_server_send_add_job(struct thread_data *td) { struct cmd_add_job_pdu pdu;