[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 4/4] xen: add per-cpu buffer option to debugtrace
On 04.09.2019 15:46, Juergen Gross wrote: > @@ -25,33 +26,63 @@ struct debugtrace_data { > }; > > static struct debugtrace_data *dt_data; > +static DEFINE_PER_CPU(struct debugtrace_data *, dt_cpu_data); > > -static unsigned int debugtrace_kilobytes = 128; > +static unsigned long debugtrace_bytes = 128 << 10; > +static bool debugtrace_per_cpu; > static bool debugtrace_used; > static DEFINE_SPINLOCK(debugtrace_lock); > -integer_param("debugtrace", debugtrace_kilobytes); > > -static void debugtrace_dump_worker(void) > +static int __init debugtrace_parse_param(const char *s) > { > - if ( !debugtrace_used ) > + if ( !strncmp(s, "cpu:", 4) ) > + { > + debugtrace_per_cpu = true; > + s += 4; > + } > + debugtrace_bytes = parse_size_and_unit(s, NULL); I'm afraid you can't pass NULL here, or a trailing % will be at best ambiguous. In fact, the latest with the addition of % support to the function I can't see (anymore) how calling the function with a NULL 2nd arg can be a good idea at all. > +static void debugtrace_dump_worker(void) > +{ > + unsigned int cpu; > + char buf[16]; > + > + if ( !debugtrace_used ) > + return; > + > + debugtrace_dump_buffer(dt_data, "global"); > + > + for ( cpu = 0; cpu < nr_cpu_ids; cpu++ ) > + { > + snprintf(buf, sizeof(buf), "cpu %u", cpu); > + debugtrace_dump_buffer(per_cpu(dt_cpu_data, cpu), buf); > + } I think it would be nice if buf[]'s scope was just the for() body. > void debugtrace_printk(const char *fmt, ...) > { > static char buf[1024], last_buf[1024]; > - static unsigned int count, last_count; > + static unsigned int count, last_count, last_cpu; > > char cntbuf[24]; > va_list args; > unsigned long flags; > unsigned int nr; > + struct debugtrace_data *data; > + unsigned int cpu; > > - if ( !dt_data ) > + data = debugtrace_per_cpu ? this_cpu(dt_cpu_data) : dt_data; > + cpu = debugtrace_per_cpu ? smp_processor_id() : 0; You use "cpu" only ... > @@ -131,16 +169,17 @@ void debugtrace_printk(const char *fmt, ...) > } > else > { > - if ( strcmp(buf, last_buf) ) > + if ( strcmp(buf, last_buf) || cpu != last_cpu ) > { > - dt_data->prd_last = dt_data->prd; > + data->prd_last = data->prd; > last_count = ++count; > + last_cpu = cpu; > safe_strcpy(last_buf, buf); > snprintf(cntbuf, sizeof(cntbuf), "%u ", count); > } > else > { > - dt_data->prd = dt_data->prd_last; > + data->prd = data->prd_last; > snprintf(cntbuf, sizeof(cntbuf), "%u-%u ", last_count, ++count); > } > debugtrace_add_to_buf(cntbuf); .. in this scope, so perhaps worth latching (and declaring) it only inside the first "else" above? > @@ -155,34 +194,70 @@ static void debugtrace_key(unsigned char key) > debugtrace_toggle(); > } > > -static int __init debugtrace_init(void) > +static void debugtrace_alloc_buffer(struct debugtrace_data **ptr, > + unsigned int cpu) > { > int order; > - unsigned long kbytes, bytes; > struct debugtrace_data *data; > > - /* Round size down to next power of two. */ > - while ( (kbytes = (debugtrace_kilobytes & (debugtrace_kilobytes-1))) != > 0 ) > - debugtrace_kilobytes = kbytes; > - > - bytes = debugtrace_kilobytes << 10; > - if ( bytes == 0 ) > - return 0; > + if ( !debugtrace_bytes || *ptr ) > + return; > > - order = get_order_from_bytes(bytes); > + order = get_order_from_bytes(debugtrace_bytes); > data = alloc_xenheap_pages(order, 0); > if ( !data ) > - return -ENOMEM; > + { > + if ( debugtrace_per_cpu ) > + printk("failed to allocate debugtrace buffer for cpu %u\n", cpu); Could I talk you into using the more common "CPU%u: ..." layout here? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |