From: Liu Yuan <[email protected]> The subtle case is that when tracer is in patching, we should return AGAIN to buffer reader to ask him to try again until patching is down.
Signed-off-by: Liu Yuan <[email protected]> --- collie/debug.c | 3 +++ include/sheepdog_proto.h | 1 + sheep/ops.c | 15 +++++++++++---- sheep/trace/trace.c | 7 +++++-- sheep/trace/trace.h | 4 ++-- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/collie/debug.c b/collie/debug.c index c40d164..6dbd768 100644 --- a/collie/debug.c +++ b/collie/debug.c @@ -110,6 +110,9 @@ read_buffer: return EXIT_SYSFAIL; } + if (rsp->result == SD_RES_AGAIN) + goto read_buffer; + if (rsp->result != SD_RES_SUCCESS) { fprintf(stderr, "Trace failed: %s\n", sd_strerror(rsp->result)); diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h index 2859844..75c6126 100644 --- a/include/sheepdog_proto.h +++ b/include/sheepdog_proto.h @@ -69,6 +69,7 @@ #define SD_RES_OBJ_RECOVERING 0x23 /* Object is recovering */ #define SD_RES_KILLED 0x24 /* Node is killed */ #define SD_RES_OID_EXIST 0x25 /* Object ID exists already */ +#define SD_RES_AGAIN 0x26 /* Ask to try again */ /* errors above 0x80 are sheepdog-internal */ diff --git a/sheep/ops.c b/sheep/ops.c index b4fa77f..465d73f 100644 --- a/sheep/ops.c +++ b/sheep/ops.c @@ -674,10 +674,17 @@ static int local_trace_ops(const struct sd_req *req, struct sd_rsp *rsp, void *d return ret; } -static int local_trace_read_buf(const struct sd_req *req, struct sd_rsp *rsp, - void *data) +static int local_trace_read_buf(struct request *request) { - rsp->data_length = trace_buffer_pop(data, req->data_length); + struct sd_req *req = &request->rq; + struct sd_rsp *rsp = &request->rp; + int ret; + + ret = trace_buffer_pop(request->data, req->data_length); + if (ret == -1) + return SD_RES_AGAIN; + + rsp->data_length = ret; dprintf("%u\n", rsp->data_length); return SD_RES_SUCCESS; } @@ -1090,7 +1097,7 @@ static struct sd_op_template sd_ops[] = { .name = "TRACE_READ_BUF", .type = SD_OP_TYPE_LOCAL, .force = 1, - .process_main = local_trace_read_buf, + .process_work = local_trace_read_buf, }, [SD_OP_KILL_NODE] = { diff --git a/sheep/trace/trace.c b/sheep/trace/trace.c index a906d6b..79868b7 100644 --- a/sheep/trace/trace.c +++ b/sheep/trace/trace.c @@ -299,12 +299,15 @@ int trace_init_signal(void) return 0; } -notrace uint32_t trace_buffer_pop(void *buf, uint32_t len) +notrace int trace_buffer_pop(void *buf, uint32_t len) { - uint32_t readin, count = 0, requested = len; + int readin, count = 0, requested = len; char *buff = (char *)buf; int i; + if (trace_in_patch) + return -1; + for (i = 0; i < nr_cpu; i++) { readin = strbuf_stripout(&buffer[i], buff, len); count += readin; diff --git a/sheep/trace/trace.h b/sheep/trace/trace.h index fa8eb05..cdeb2a1 100644 --- a/sheep/trace/trace.h +++ b/sheep/trace/trace.h @@ -55,7 +55,7 @@ extern unsigned long trace_return_call(void); extern int trace_enable(void); extern int trace_disable(void); extern struct caller *trace_lookup_ip(unsigned long ip, int create); - extern uint32_t trace_buffer_pop(void *buf, uint32_t len); + extern int trace_buffer_pop(void *buf, uint32_t len); extern void trace_buffer_push(int cpuid, struct trace_graph_item *item); extern void short_thread_begin(void); extern void short_thread_end(void); @@ -64,7 +64,7 @@ extern unsigned long trace_return_call(void); static inline int trace_init(void) { return 0; } static inline int trace_enable(void) { return 0; } static inline int trace_disable(void) { return 0; } - static inline uint32_t trace_buffer_pop(void *buf, uint32_t len) { return 0; } + static inline int trace_buffer_pop(void *buf, uint32_t len) { return 0; } static inline void trace_buffer_push(int cpuid, struct trace_graph_item *item) { return; } static inline void short_thread_begin(void) { return; } -- 1.7.12.84.gefa6462 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
