@@ -315,7 +315,8 @@ enum tracecmd_msg_flags {
/* for both client and server */
struct tracecmd_msg_handle {
int fd;
- int version; /* Current protocol version */
+ short cpu_count;
+ short version; /* Current protocol version */
unsigned long flags;
};
@@ -335,9 +336,9 @@ void tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle);
/* for server */
int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle,
- int *cpus, int *pagesize);
+ int *pagesize);
int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle,
- int total_cpus, int *ports);
+ int *ports);
int tracecmd_msg_collect_metadata(struct tracecmd_msg_handle *msg_handle, int ofd);
bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle);
void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle);
@@ -373,13 +373,14 @@ static int open_udp(const char *node, const char *port, int *pid,
}
static int communicate_with_client(struct tracecmd_msg_handle *msg_handle,
- int *cpus, int *pagesize)
+ int *pagesize)
{
char *last_proto = NULL;
char buf[BUFSIZ];
char *option;
int options;
int size;
+ int cpus;
int n, s, t, i;
int ret = -EINVAL;
int fd = msg_handle->fd;
@@ -394,10 +395,10 @@ static int communicate_with_client(struct tracecmd_msg_handle *msg_handle,
/** ERROR **/
return -EINVAL;
- *cpus = atoi(buf);
+ cpus = atoi(buf);
/* Is the client using the new protocol? */
- if (*cpus == -1) {
+ if (cpus == -1) {
if (memcmp(buf, V2_CPU, n) != 0) {
/* If it did not send a version, then bail */
if (memcmp(buf, "-1V", 3)) {
@@ -437,15 +438,17 @@ static int communicate_with_client(struct tracecmd_msg_handle *msg_handle,
msg_handle->version = V2_PROTOCOL;
/* read the CPU count, the page size, and options */
- if (tracecmd_msg_initial_setting(msg_handle, cpus, pagesize) < 0)
+ if (tracecmd_msg_initial_setting(msg_handle, pagesize) < 0)
goto out;
} else {
/* The client is using the v1 protocol */
- plog("cpus=%d\n", *cpus);
- if (*cpus < 0)
+ plog("cpus=%d\n", cpus);
+ if (cpus < 0)
goto out;
+ msg_handle->cpu_count = cpus;
+
/* next read the page size */
n = read_string(fd, buf, BUFSIZ);
if (n == BUFSIZ)
@@ -542,7 +545,7 @@ static void destroy_all_readers(int cpus, int *pid_array, const char *node,
free(pid_array);
}
-static int *create_all_readers(int cpus, const char *node, const char *port,
+static int *create_all_readers(const char *node, const char *port,
int pagesize, struct tracecmd_msg_handle *msg_handle)
{
int use_tcp = msg_handle->flags & TRACECMD_MSG_FL_USE_TCP;
@@ -551,6 +554,7 @@ static int *create_all_readers(int cpus, const char *node, const char *port,
int *pid_array;
int start_port;
int udp_port;
+ int cpus = msg_handle->cpu_count;
int cpu;
int pid;
@@ -585,7 +589,7 @@ static int *create_all_readers(int cpus, const char *node, const char *port,
if (msg_handle->version == V2_PROTOCOL) {
/* send set of port numbers to the client */
- if (tracecmd_msg_send_port_array(msg_handle, cpus, port_array) < 0) {
+ if (tracecmd_msg_send_port_array(msg_handle, port_array) < 0) {
plog("Failed sending port array\n");
goto out_free;
}
@@ -684,13 +688,13 @@ static int process_client(struct tracecmd_msg_handle *msg_handle,
int ofd;
int ret;
- ret = communicate_with_client(msg_handle, &cpus, &pagesize);
+ ret = communicate_with_client(msg_handle, &pagesize);
if (ret < 0)
return ret;
ofd = create_client_file(node, port);
- pid_array = create_all_readers(cpus, node, port, pagesize, msg_handle);
+ pid_array = create_all_readers(node, port, pagesize, msg_handle);
if (!pid_array)
return -ENOMEM;
@@ -708,6 +712,8 @@ static int process_client(struct tracecmd_msg_handle *msg_handle,
/* wait a little to let our readers finish reading */
sleep(1);
+ cpus = msg_handle->cpu_count;
+
/* stop our readers */
stop_all_readers(cpus, pid_array);
@@ -479,11 +479,12 @@ static void error_operation_for_server(struct tracecmd_msg *msg)
#define MAX_OPTION_SIZE 4096
int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle,
- int *cpus, int *pagesize)
+ int *pagesize)
{
struct tracecmd_msg_opt *opt;
struct tracecmd_msg msg;
int options, i, s;
+ int cpus;
int ret;
int offset = 0;
u32 size = MIN_TINIT_SIZE;
@@ -502,13 +503,15 @@ int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle,
goto error;
}
- *cpus = ntohl(msg.tinit.cpus);
- plog("cpus=%d\n", *cpus);
- if (*cpus < 0) {
+ cpus = ntohl(msg.tinit.cpus);
+ plog("cpus=%d\n", cpus);
+ if (cpus < 0) {
ret = -EINVAL;
goto error;
}
+ msg_handle->cpu_count = cpus;
+
*pagesize = ntohl(msg.tinit.page_size);
plog("pagesize=%d\n", *pagesize);
if (*pagesize <= 0) {
@@ -555,13 +558,13 @@ error:
}
int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle,
- int total_cpus, int *ports)
+ int *ports)
{
struct tracecmd_msg msg;
int ret;
tracecmd_msg_init(MSG_RINIT, &msg);
- ret = make_rinit(&msg, total_cpus, ports);
+ ret = make_rinit(&msg, msg_handle->cpu_count, ports);
if (ret < 0)
return ret;