From: Jens Axboe Date: Wed, 14 Mar 2012 20:51:38 +0000 (+0100) Subject: server: add vectored fio_send_cmd_ext_pdu() X-Git-Tag: gfio-0.1~140 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=53bd8dbcbf692d1f622d6c9e62284121e710fdc3 server: add vectored fio_send_cmd_ext_pdu() And use it for the multi segment continue type sending that the iolog handler uses. Signed-off-by: Jens Axboe --- diff --git a/server.c b/server.c index 73e36a50..2da0c83e 100644 --- a/server.c +++ b/server.c @@ -279,7 +279,7 @@ struct fio_net_cmd *fio_net_recv_cmd(int sk) return cmdret; } -void fio_net_cmd_crc_pdu(struct fio_net_cmd *cmd, void *pdu) +void fio_net_cmd_crc_pdu(struct fio_net_cmd *cmd, const void *pdu) { uint32_t pdu_len; @@ -881,13 +881,33 @@ void fio_server_send_du(void) } } +/* + * Send a command with a separate PDU, not inlined in the command + */ +static int fio_send_cmd_ext_pdu(int sk, uint16_t opcode, const void *buf, + off_t size, uint64_t tag, uint32_t flags) +{ + struct fio_net_cmd cmd; + struct iovec iov[2]; + + iov[0].iov_base = &cmd; + iov[0].iov_len = sizeof(cmd); + iov[1].iov_base = (void *) buf; + iov[1].iov_len = size; + + __fio_init_net_cmd(&cmd, opcode, size, tag); + cmd.flags = __cpu_to_le32(flags); + fio_net_cmd_crc_pdu(&cmd, buf); + + return fio_sendv_data(server_fd, iov, 2); +} + int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) { struct cmd_iolog_pdu pdu; - struct fio_net_cmd cmd; z_stream stream; void *out_pdu; - int i; + int i, ret = 0; pdu.nr_samples = __cpu_to_le32(log->nr_samples); pdu.log_type = cpu_to_le32(log->log_type); @@ -914,24 +934,24 @@ int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) stream.opaque = Z_NULL; if (deflateInit(&stream, Z_DEFAULT_COMPRESSION) != Z_OK) { - free(out_pdu); - return 1; + ret = 1; + goto err; } /* * Send header first, it's not compressed. */ - __fio_init_net_cmd(&cmd, FIO_NET_CMD_IOLOG, sizeof(pdu), 0); - cmd.flags = __cpu_to_le32(FIO_NET_CMD_F_MORE); - fio_net_cmd_crc_pdu(&cmd, &pdu); - fio_send_data(server_fd, &cmd, sizeof(cmd)); - fio_send_data(server_fd, &pdu, sizeof(pdu)); + 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); do { - unsigned int this_len; + unsigned int this_len, flags = 0; + int ret; stream.avail_out = FIO_SERVER_MAX_FRAGMENT_PDU; stream.next_out = out_pdu; @@ -939,20 +959,20 @@ int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) this_len = FIO_SERVER_MAX_FRAGMENT_PDU - stream.avail_out; - __fio_init_net_cmd(&cmd, FIO_NET_CMD_IOLOG, this_len, 0); - if (stream.avail_in) - cmd.flags = __cpu_to_le32(FIO_NET_CMD_F_MORE); - - fio_net_cmd_crc_pdu(&cmd, out_pdu); + flags = FIO_NET_CMD_F_MORE; - fio_send_data(server_fd, &cmd, sizeof(cmd)); - fio_send_data(server_fd, out_pdu, this_len); + ret = fio_send_cmd_ext_pdu(server_fd, FIO_NET_CMD_IOLOG, + out_pdu, this_len, 0, flags); + if (ret) + goto err_zlib; } while (stream.avail_in); - free(out_pdu); +err_zlib: deflateEnd(&stream); - return 0; +err: + free(out_pdu); + return ret; } void fio_server_send_add_job(struct thread_options *o, const char *ioengine) diff --git a/server.h b/server.h index 76d24583..27e55232 100644 --- a/server.h +++ b/server.h @@ -157,7 +157,7 @@ extern void fio_server_idle_loop(void); extern int fio_recv_data(int sk, void *p, unsigned int len); extern int fio_send_data(int sk, const void *p, unsigned int len); extern void fio_net_cmd_crc(struct fio_net_cmd *); -extern void fio_net_cmd_crc_pdu(struct fio_net_cmd *, void *); +extern void fio_net_cmd_crc_pdu(struct fio_net_cmd *, const void *); extern struct fio_net_cmd *fio_net_recv_cmd(int sk); extern int fio_send_iolog(struct thread_data *, struct io_log *, const char *);