[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 4/4] xen: add per-cpu buffer option to debugtrace
On 28.08.2019 10:00, Juergen Gross wrote: > @@ -24,32 +25,62 @@ struct debugtrace_data_s { > }; > > static struct debugtrace_data_s *debtr_data; > +static DEFINE_PER_CPU(struct debugtrace_data_s *, debtr_cpu_data); > > -static unsigned int debugtrace_kilobytes = 128; > +static unsigned int debugtrace_bytes = 128 << 10; And after patch 3 this is now left as "unsigned int"? > +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 ( !strncmp(s, "cpu:", 4) ) > + { > + debugtrace_per_cpu = true; > + s += 4; > + } > + debugtrace_bytes = parse_size_and_unit(s, NULL); Stray double blank. > + return 0; > +} > +custom_param("debugtrace", debugtrace_parse_param); > + > +static void debugtrace_dump_buffer(struct debugtrace_data_s *data, > + const char *which) > { > - if ( !debtr_data || !debugtrace_used ) > + if ( !data ) > return; > > - printk("debugtrace_dump() starting\n"); > + printk("debugtrace_dump() %s buffer starting\n", which); > > /* Print oldest portion of the ring. */ > - ASSERT(debtr_data->buf[debtr_data->bytes - 1] == 0); > - if ( debtr_data->buf[debtr_data->prd] != '\0' ) > - console_serial_puts(&debtr_data->buf[debtr_data->prd], > - debtr_data->bytes - debtr_data->prd - 1); > + ASSERT(data->buf[data->bytes - 1] == 0); > + if ( data->buf[data->prd] != '\0' ) > + console_serial_puts(&data->buf[data->prd], data->bytes - data->prd - > 1); Seeing this getting changed yet another time I now really wonder if this nul termination is really still needed now that a size is being passed into the actual output function. If you got rid of this in an early prereq patch, the subsequent (to that one) ones would shrink. Furthermore I can't help thinking that said change to pass the size into the actual output functions actually broke the logic here: By memset()-ing the buffer to zero, output on a subsequent invocation would have been suitably truncated (in fact, until prd had wrapped, I think it would have got truncated more than intended). Julien, can you please look into this apparent regression? > @@ -156,33 +195,70 @@ static void debugtrace_key(unsigned char key) > debugtrace_toggle(); > } > > -static int __init debugtrace_init(void) > +static void debugtrace_alloc_buffer(struct debugtrace_data_s **ptr) > { > int order; > - unsigned long kbytes, bytes; > struct debugtrace_data_s *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 < PAGE_SIZE || *ptr ) Why the check against PAGE_SIZE? > + return; > > - order = get_order_from_bytes(bytes); > + order = get_order_from_bytes(debugtrace_bytes); > data = alloc_xenheap_pages(order, 0); > if ( !data ) > - return -ENOMEM; > + { > + printk("failed to allocate debugtrace buffer\n"); Perhaps better to also indicate which/whose buffer? > + return; > + } > + > + memset(data, '\0', debugtrace_bytes); > + data->bytes = debugtrace_bytes - sizeof(*data); > + > + *ptr = data; > +} > + > +static int debugtrace_cpu_callback(struct notifier_block *nfb, > + unsigned long action, void *hcpu) > +{ > + unsigned int cpu = (unsigned long)hcpu; > + > + /* Buffers are only ever allocated, never freed. */ > + switch ( action ) > + { > + case CPU_UP_PREPARE: > + debugtrace_alloc_buffer(&per_cpu(debtr_cpu_data, cpu)); > + break; > + default: > + break; There no apparent need for "default:" here; quite possibly this could be if() instead of switch() anyway. 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 |