X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=server.c;h=7e7ffedc7139077a6ea5b86b5e181afb0dd8efb0;hp=ce9dca315ef19b1a7793b10203b0860470c9f54b;hb=a43f4461d5716c4c46018dd45cecf0a896d05dbd;hpb=18aa1998aa8267b8a127b3fe53e58a68b4e99469 diff --git a/server.c b/server.c index ce9dca31..7e7ffedc 100644 --- a/server.c +++ b/server.c @@ -1,10 +1,8 @@ #include #include -#include #include -#include #include -#include +#include #include #include #include @@ -25,7 +23,7 @@ #include "server.h" #include "crc/crc16.h" #include "lib/ieee754.h" -#include "verify.h" +#include "verify-state.h" #include "smalloc.h" int fio_net_port = FIO_NET_PORT; @@ -74,7 +72,7 @@ struct fio_fork_item { }; struct cmd_reply { - struct fio_mutex lock; + struct fio_sem lock; void *data; size_t size; int error; @@ -108,12 +106,12 @@ static const char *fio_server_ops[FIO_NET_CMD_NR] = { static void sk_lock(struct sk_out *sk_out) { - fio_mutex_down(&sk_out->lock); + fio_sem_down(&sk_out->lock); } static void sk_unlock(struct sk_out *sk_out) { - fio_mutex_up(&sk_out->lock); + fio_sem_up(&sk_out->lock); } void sk_out_assign(struct sk_out *sk_out) @@ -129,9 +127,9 @@ void sk_out_assign(struct sk_out *sk_out) static void sk_out_free(struct sk_out *sk_out) { - __fio_mutex_remove(&sk_out->lock); - __fio_mutex_remove(&sk_out->wait); - __fio_mutex_remove(&sk_out->xmit); + __fio_sem_remove(&sk_out->lock); + __fio_sem_remove(&sk_out->wait); + __fio_sem_remove(&sk_out->xmit); sfree(sk_out); } @@ -528,6 +526,9 @@ static struct sk_entry *fio_net_prep_cmd(uint16_t opcode, void *buf, struct sk_entry *entry; entry = smalloc(sizeof(*entry)); + if (!entry) + return NULL; + INIT_FLIST_HEAD(&entry->next); entry->opcode = opcode; if (flags & SK_F_COPY) { @@ -558,7 +559,7 @@ static void fio_net_queue_entry(struct sk_entry *entry) flist_add_tail(&entry->list, &sk_out->list); sk_unlock(sk_out); - fio_mutex_up(&sk_out->wait); + fio_sem_up(&sk_out->wait); } } @@ -616,7 +617,7 @@ static int fio_net_queue_quit(void) { dprint(FD_NET, "server: sending quit\n"); - return fio_net_queue_cmd(FIO_NET_CMD_QUIT, NULL, 0, NULL, SK_F_SIMPLE | SK_F_INLINE); + return fio_net_queue_cmd(FIO_NET_CMD_QUIT, NULL, 0, NULL, SK_F_SIMPLE); } int fio_net_send_quit(int sk) @@ -636,7 +637,7 @@ static int fio_net_send_ack(struct fio_net_cmd *cmd, int error, int signal) epdu.error = __cpu_to_le32(error); epdu.signal = __cpu_to_le32(signal); - return fio_net_queue_cmd(FIO_NET_CMD_STOP, &epdu, sizeof(epdu), &tag, SK_F_COPY | SK_F_INLINE); + return fio_net_queue_cmd(FIO_NET_CMD_STOP, &epdu, sizeof(epdu), &tag, SK_F_COPY); } static int fio_net_queue_stop(int error, int signal) @@ -1039,7 +1040,7 @@ static int handle_command(struct sk_out *sk_out, struct flist_head *job_list, memcpy(rep->data, in->data, in->size); } } - fio_mutex_up(&rep->lock); + fio_sem_up(&rep->lock); break; } default: @@ -1138,7 +1139,7 @@ static int handle_sk_entry(struct sk_out *sk_out, struct sk_entry *entry) { int ret; - fio_mutex_down(&sk_out->xmit); + fio_sem_down(&sk_out->xmit); if (entry->flags & SK_F_VEC) ret = send_vec_entry(sk_out, entry); @@ -1150,7 +1151,7 @@ static int handle_sk_entry(struct sk_out *sk_out, struct sk_entry *entry) entry->size, &entry->tag, NULL); } - fio_mutex_up(&sk_out->xmit); + fio_sem_up(&sk_out->xmit); if (ret) log_err("fio: failed handling cmd %s\n", fio_server_op(entry->opcode)); @@ -1198,7 +1199,6 @@ static int handle_connection(struct sk_out *sk_out) .events = POLLIN, }; - ret = 0; do { int timeout = 1000; @@ -1215,7 +1215,7 @@ static int handle_connection(struct sk_out *sk_out) break; } else if (!ret) { fio_server_check_jobs(&job_list); - fio_mutex_down_timeout(&sk_out->wait, timeout); + fio_sem_down_timeout(&sk_out->wait, timeout); continue; } @@ -1358,12 +1358,17 @@ static int accept_loop(int listen_sk) dprint(FD_NET, "server: connect from %s\n", from); - sk_out = smalloc(sizeof(*sk_out)); + sk_out = scalloc(1, sizeof(*sk_out)); + if (!sk_out) { + close(sk); + return -1; + } + sk_out->sk = sk; INIT_FLIST_HEAD(&sk_out->list); - __fio_mutex_init(&sk_out->lock, FIO_MUTEX_UNLOCKED); - __fio_mutex_init(&sk_out->wait, FIO_MUTEX_LOCKED); - __fio_mutex_init(&sk_out->xmit, FIO_MUTEX_UNLOCKED); + __fio_sem_init(&sk_out->lock, FIO_SEM_UNLOCKED); + __fio_sem_init(&sk_out->wait, FIO_SEM_LOCKED); + __fio_sem_init(&sk_out->xmit, FIO_SEM_UNLOCKED); pid = fork(); if (pid) { @@ -1497,21 +1502,21 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) } for (i = 0; i < FIO_IO_U_MAP_NR; i++) { - p.ts.io_u_map[i] = cpu_to_le32(ts->io_u_map[i]); - p.ts.io_u_submit[i] = cpu_to_le32(ts->io_u_submit[i]); - p.ts.io_u_complete[i] = cpu_to_le32(ts->io_u_complete[i]); + p.ts.io_u_map[i] = cpu_to_le64(ts->io_u_map[i]); + p.ts.io_u_submit[i] = cpu_to_le64(ts->io_u_submit[i]); + p.ts.io_u_complete[i] = cpu_to_le64(ts->io_u_complete[i]); } for (i = 0; i < FIO_IO_U_LAT_N_NR; i++) - p.ts.io_u_lat_n[i] = cpu_to_le32(ts->io_u_lat_n[i]); + p.ts.io_u_lat_n[i] = cpu_to_le64(ts->io_u_lat_n[i]); for (i = 0; i < FIO_IO_U_LAT_U_NR; i++) - p.ts.io_u_lat_u[i] = cpu_to_le32(ts->io_u_lat_u[i]); + p.ts.io_u_lat_u[i] = cpu_to_le64(ts->io_u_lat_u[i]); for (i = 0; i < FIO_IO_U_LAT_M_NR; i++) - p.ts.io_u_lat_m[i] = cpu_to_le32(ts->io_u_lat_m[i]); + p.ts.io_u_lat_m[i] = cpu_to_le64(ts->io_u_lat_m[i]); for (i = 0; i < DDIR_RWDIR_CNT; i++) 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]); + p.ts.io_u_plat[i][j] = cpu_to_le64(ts->io_u_plat[i][j]); for (i = 0; i < DDIR_RWDIR_CNT; i++) { p.ts.total_io_u[i] = cpu_to_le64(ts->total_io_u[i]); @@ -1589,7 +1594,7 @@ void fio_server_send_gs(struct group_run_stats *rs) } void fio_server_send_job_options(struct flist_head *opt_list, - unsigned int groupid) + unsigned int gid) { struct cmd_job_option pdu; struct flist_head *entry; @@ -1604,12 +1609,12 @@ void fio_server_send_job_options(struct flist_head *opt_list, p = flist_entry(entry, struct print_option, list); memset(&pdu, 0, sizeof(pdu)); - if (groupid == -1U) { + if (gid == -1U) { pdu.global = __cpu_to_le16(1); pdu.groupid = 0; } else { pdu.global = 0; - pdu.groupid = cpu_to_le32(groupid); + pdu.groupid = cpu_to_le32(gid); } len = strlen(p->name); if (len >= sizeof(pdu.name)) { @@ -1695,8 +1700,8 @@ static inline void __fio_net_prep_tail(z_stream *stream, void *out_pdu, *last_entry = fio_net_prep_cmd(FIO_NET_CMD_IOLOG, out_pdu, this_len, NULL, SK_F_VEC | SK_F_INLINE | SK_F_FREE); - flist_add_tail(&(*last_entry)->list, &first->next); - + if (*last_entry) + flist_add_tail(&(*last_entry)->list, &first->next); } /* @@ -1712,9 +1717,10 @@ static int __deflate_pdu_buffer(void *next_in, unsigned int next_sz, void **out_ stream->next_in = next_in; stream->avail_in = next_sz; do { - if (! stream->avail_out) { - + if (!stream->avail_out) { __fio_net_prep_tail(stream, *out_pdu, last_entry, first); + if (*last_entry == NULL) + return 1; *out_pdu = malloc(FIO_SERVER_MAX_FRAGMENT_PDU); @@ -1748,7 +1754,7 @@ static int __fio_append_iolog_gz_hist(struct sk_entry *first, struct io_log *log for (i = 0; i < cur_log->nr_samples; i++) { struct io_sample *s; struct io_u_plat_entry *cur_plat_entry, *prev_plat_entry; - unsigned int *cur_plat, *prev_plat; + uint64_t *cur_plat, *prev_plat; s = get_sample(log, cur_log, i); ret = __deflate_pdu_buffer(s, sample_sz, &out_pdu, &entry, stream, first); @@ -1778,8 +1784,7 @@ static int __fio_append_iolog_gz_hist(struct sk_entry *first, struct io_log *log } __fio_net_prep_tail(stream, out_pdu, &entry, first); - - return 0; + return entry == NULL; } static int __fio_append_iolog_gz(struct sk_entry *first, struct io_log *log, @@ -1818,6 +1823,10 @@ static int __fio_append_iolog_gz(struct sk_entry *first, struct io_log *log, entry = fio_net_prep_cmd(FIO_NET_CMD_IOLOG, out_pdu, this_len, NULL, SK_F_VEC | SK_F_INLINE | SK_F_FREE); + if (!entry) { + free(out_pdu); + return 1; + } flist_add_tail(&entry->list, &first->next); } while (stream->avail_in); @@ -1869,6 +1878,10 @@ static int fio_append_iolog_gz(struct sk_entry *first, struct io_log *log) entry = fio_net_prep_cmd(FIO_NET_CMD_IOLOG, out_pdu, this_len, NULL, SK_F_VEC | SK_F_INLINE | SK_F_FREE); + if (!entry) { + free(out_pdu); + break; + } flist_add_tail(&entry->list, &first->next); } while (ret != Z_STREAM_END); @@ -1889,6 +1902,7 @@ static int fio_append_gz_chunks(struct sk_entry *first, struct io_log *log) { struct sk_entry *entry; struct flist_head *node; + int ret = 0; pthread_mutex_lock(&log->chunk_lock); flist_for_each(node, &log->chunk_list) { @@ -1897,16 +1911,20 @@ static int fio_append_gz_chunks(struct sk_entry *first, struct io_log *log) c = flist_entry(node, struct iolog_compress, list); entry = fio_net_prep_cmd(FIO_NET_CMD_IOLOG, c->buf, c->len, NULL, SK_F_VEC | SK_F_INLINE); + if (!entry) { + ret = 1; + break; + } flist_add_tail(&entry->list, &first->next); } pthread_mutex_unlock(&log->chunk_lock); - - return 0; + return ret; } static int fio_append_text_log(struct sk_entry *first, struct io_log *log) { struct sk_entry *entry; + int ret = 0; while (!flist_empty(&log->io_logs)) { struct io_logs *cur_log; @@ -1919,10 +1937,14 @@ static int fio_append_text_log(struct sk_entry *first, struct io_log *log) entry = fio_net_prep_cmd(FIO_NET_CMD_IOLOG, cur_log->log, size, NULL, SK_F_VEC | SK_F_INLINE); + if (!entry) { + ret = 1; + break; + } flist_add_tail(&entry->list, &first->next); } - return 0; + return ret; } int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) @@ -1977,6 +1999,8 @@ int fio_send_iolog(struct thread_data *td, struct io_log *log, const char *name) * Assemble header entry first */ first = fio_net_prep_cmd(FIO_NET_CMD_IOLOG, &pdu, sizeof(pdu), NULL, SK_F_VEC | SK_F_INLINE | SK_F_COPY); + if (!first) + return 1; /* * Now append actual log entries. If log compression was enabled on @@ -2033,7 +2057,7 @@ int fio_server_get_verify_state(const char *name, int threadnumber, if (!rep) return ENOMEM; - __fio_mutex_init(&rep->lock, FIO_MUTEX_LOCKED); + __fio_sem_init(&rep->lock, FIO_SEM_LOCKED); rep->data = NULL; rep->error = 0; @@ -2046,7 +2070,7 @@ int fio_server_get_verify_state(const char *name, int threadnumber, /* * Wait for the backend to receive the reply */ - if (fio_mutex_down_timeout(&rep->lock, 10000)) { + if (fio_sem_down_timeout(&rep->lock, 10000)) { log_err("fio: timed out waiting for reply\n"); ret = ETIMEDOUT; goto fail; @@ -2083,7 +2107,7 @@ fail: *datap = data; sfree(rep->data); - __fio_mutex_remove(&rep->lock); + __fio_sem_remove(&rep->lock); sfree(rep); return ret; } @@ -2120,14 +2144,14 @@ static int fio_init_server_ip(void) #endif if (use_ipv6) { - const void *src = &saddr_in6.sin6_addr; + void *src = &saddr_in6.sin6_addr; addr = (struct sockaddr *) &saddr_in6; socklen = sizeof(saddr_in6); saddr_in6.sin6_family = AF_INET6; str = inet_ntop(AF_INET6, src, buf, sizeof(buf)); } else { - const void *src = &saddr_in.sin_addr; + void *src = &saddr_in.sin_addr; addr = (struct sockaddr *) &saddr_in; socklen = sizeof(saddr_in); @@ -2195,7 +2219,7 @@ static int fio_init_server_connection(void) if (!bind_sock) { char *p, port[16]; - const void *src; + void *src; int af; if (use_ipv6) {