[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] tools/xenalyze: Fix build with clang



On 12/02/16 19:06, Andrew Cooper wrote:
> 1) EXIT_REASON_EXCEPTION_NMI is 0, and Clang complains:
> 
> xenalyze.c:513:33: error: initializer overrides prior initialization of this 
> subobject [-Werror,-Winitializer-overrides]
>     [EXIT_REASON_EXCEPTION_NMI]="EXCEPTION_NMI",
>                                 ^~~~~~~~~~~~~~~
> xenalyze.c:512:11: note: previous initialization is here
>     [0] = "NONE",
>           ^~~~~~
> 
> 2) cr3_time_compare(), eip_compare(), ipi_send() and cr3_compare_start() are
>    declared as nested functions, which is a GCCism not supported by Clang.
> 
>    As they don't actually make use of the interesting feature offered by
>    nested functions (i.e. dynamic scoping), move them to just being normal
>    functions.
> 
> 3) clear_interval_summary(), update_cpi() and clear_interval_cpi() are all
>    unused.  The former isn't reference anywhere, so is deleted, while the 
> other
>    two are called from currently #if 0'd code.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

All looks good, thanks.

Acked-by: George Dunlap <george.dunlap@xxxxxxxxxx>



> ---
> CC: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
> CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
>  tools/xentrace/xenalyze.c | 188 
> +++++++++++++++++++++++-----------------------
>  1 file changed, 92 insertions(+), 96 deletions(-)
> 
> diff --git a/tools/xentrace/xenalyze.c b/tools/xentrace/xenalyze.c
> index 6520790..1651302 100644
> --- a/tools/xentrace/xenalyze.c
> +++ b/tools/xentrace/xenalyze.c
> @@ -509,7 +509,6 @@ struct {
>  #define HVM_VMX_EXIT_REASON_MAX (EXIT_REASON_XSETBV+1)
>  
>  char * hvm_vmx_exit_reason_name[HVM_VMX_EXIT_REASON_MAX] = {
> -    [0] = "NONE",
>      [EXIT_REASON_EXCEPTION_NMI]="EXCEPTION_NMI",
>      [EXIT_REASON_EXTERNAL_INTERRUPT]="EXTERNAL_INTERRUPT",
>      [EXIT_REASON_TRIPLE_FAULT]="TRIPLE_FAULT",
> @@ -2270,11 +2269,6 @@ static inline void update_summary(struct 
> event_cycle_summary *s, long long c) {
>      s->count++;
>  }
>  
> -static inline void clear_interval_summary(struct event_cycle_summary *s) {
> -    s->interval.count = 0;
> -    s->interval.cycles = 0;
> -}
> -
>  static inline void update_cycles(struct cycle_summary *s, long long c) {
>  /* We don't know ahead of time how many samples there are, and working
>   * with dynamic stuff is a pain, and unnecessary.  This algorithm will
> @@ -2322,6 +2316,7 @@ static inline void clear_interval_cycles(struct 
> interval_element *e) {
>      e->instructions = 0;
>  }
>  
> +#if 0
>  static inline void update_cpi(struct weighted_cpi_summary *s,
>                                unsigned long long i,
>                                unsigned long long c) {
> @@ -2367,6 +2362,7 @@ static inline void clear_interval_cpi(struct 
> weighted_cpi_summary *s) {
>      s->interval.count = 0;
>      s->interval.instructions = 0;
>  }
> +#endif
>  
>  static inline void print_cpu_affinity(struct cycle_summary *s, char *p) {
>      if(s->count) {
> @@ -2647,6 +2643,23 @@ void interval_cr3_value_check(struct cr3_value_struct 
> *cr3) {
>      }
>  }
>  
> +int cr3_time_compare(const void *_a, const void *_b) {
> +    struct cr3_value_struct *a=*(typeof(&a))_a;
> +    struct cr3_value_struct *b=*(typeof(&a))_b;
> +
> +    if(a->total_time.interval.cycles < b->total_time.interval.cycles)
> +        return 1;
> +    else if(b->total_time.interval.cycles == a->total_time.interval.cycles) {
> +        if(a->total_time.interval.count < b->total_time.interval.count)
> +            return 1;
> +        else if(a->total_time.interval.count == b->total_time.interval.count)
> +            return 0;
> +        else
> +            return -1;
> +    } else
> +        return -1;
> +}
> +
>  void interval_cr3_schedule_ordered_output(void) {
>      struct cr3_value_struct *p;
>      int i;
> @@ -2654,23 +2667,6 @@ void interval_cr3_schedule_ordered_output(void) {
>      struct cr3_value_struct **qsort_array;
>      int N=0;
>  
> -    int cr3_time_compare(const void *_a, const void *_b) {
> -        struct cr3_value_struct *a=*(typeof(&a))_a;
> -        struct cr3_value_struct *b=*(typeof(&a))_b;
> -
> -        if(a->total_time.interval.cycles < b->total_time.interval.cycles)
> -            return 1;
> -        else if(b->total_time.interval.cycles == 
> a->total_time.interval.cycles) {
> -            if(a->total_time.interval.count < b->total_time.interval.count)
> -                return 1;
> -            else if(a->total_time.interval.count == 
> b->total_time.interval.count)
> -                return 0;
> -            else
> -                return -1;
> -        } else
> -            return -1;
> -    }
> -
>      for(p=P.cr3.head; p; p=p->gnext)
>          N++;
>  
> @@ -2966,6 +2962,23 @@ void update_eip(struct eip_list_struct **head, 
> unsigned long long eip,
>      update_summary(&p->summary, cycles);
>  }
>  
> +int eip_compare(const void *_a, const void *_b) {
> +    struct eip_list_struct *a=*(typeof(&a))_a;
> +    struct eip_list_struct *b=*(typeof(&a))_b;
> +
> +    if(a->summary.cycles < b->summary.cycles)
> +        return 1;
> +    else if(b->summary.cycles == a->summary.cycles) {
> +        if(a->summary.count < b->summary.count)
> +            return 1;
> +        else if(a->summary.count == b->summary.count)
> +            return 0;
> +        else
> +            return -1;
> +    } else
> +        return -1;
> +}
> +
>  void dump_eip(struct eip_list_struct *head) {
>      struct eip_list_struct *p;
>      int i;
> @@ -2974,23 +2987,6 @@ void dump_eip(struct eip_list_struct *head) {
>      struct eip_list_struct **qsort_array;
>      int N=0;
>  
> -    int eip_compare(const void *_a, const void *_b) {
> -        struct eip_list_struct *a=*(typeof(&a))_a;
> -        struct eip_list_struct *b=*(typeof(&a))_b;
> -
> -        if(a->summary.cycles < b->summary.cycles)
> -            return 1;
> -        else if(b->summary.cycles == a->summary.cycles) {
> -            if(a->summary.count < b->summary.count)
> -                return 1;
> -            else if(a->summary.count == b->summary.count)
> -                return 0;
> -            else
> -                return -1;
> -        } else
> -            return -1;
> -    }
> -
>      for(p=head; p; p=p->next)
>      {
>          total += p->summary.count;
> @@ -3557,6 +3553,50 @@ struct outstanding_ipi *find_vec(struct vlapic_struct 
> *vla, int vec)
>      return o;
>  }
>  
> +void ipi_send(struct vcpu_data *ov, int vec)
> +{
> +    struct vlapic_struct *vla;
> +    struct outstanding_ipi *o = NULL;
> +
> +    if(ov->runstate.state == RUNSTATE_LOST) {
> +        if(opt.dump_all)
> +            fprintf(warn, "%s: v%d in state RUNSTATE_LOST, not counting 
> ipi\n",
> +                    __func__, ov->vid);
> +        return;
> +    }
> +
> +    vla = &ov->vlapic;
> +
> +    o = find_vec(vla, vec);
> +
> +    if(!o)
> +    {
> +        fprintf(warn, "%s: Couldn't find an open slot!\n",
> +                __func__);
> +        return;
> +    }
> +
> +    if(!o->first_tsc)
> +        o->first_tsc = P.now;
> +
> +    if(opt.dump_all && o->count == 0 && o->injected)
> +        printf(" [vla] Pre-injection\n");
> +
> +    o->count++;
> +
> +    if((opt.dump_all)
> +#if 0
> +       && (ov->runstate.state != RUNSTATE_RUNNING
> +           || ov->hvm.vmexit_valid)
> +#endif
> +        )
> +        printf(" [vla] d%dv%d vec %d state %s (outstanding ipis %d)\n",
> +               ov->d->did, ov->vid,
> +               o->vec,
> +               runstate_name[ov->runstate.state],
> +               o->count);
> +}
> +
>  void hvm_vlapic_icr_handler(struct hvm_data *h)
>  {
>      struct mmio_info *m = &h->inflight.mmio;
> @@ -3575,50 +3615,6 @@ void hvm_vlapic_icr_handler(struct hvm_data *h)
>          };
>      } icr = { .val = m->data };
>  
> -    void ipi_send(struct vcpu_data *ov, int vec)
> -    {
> -        struct vlapic_struct *vla;
> -        struct outstanding_ipi *o = NULL;
> -
> -        if(ov->runstate.state == RUNSTATE_LOST) {
> -            if(opt.dump_all)
> -                fprintf(warn, "%s: v%d in state RUNSTATE_LOST, not counting 
> ipi\n",
> -                        __func__, ov->vid);
> -            return;
> -        }
> -
> -        vla = &ov->vlapic;
> -
> -        o = find_vec(vla, vec);
> -
> -        if(!o)
> -        {
> -            fprintf(warn, "%s: Couldn't find an open slot!\n",
> -                    __func__);
> -            return;
> -        }
> -
> -        if(!o->first_tsc)
> -            o->first_tsc = P.now;
> -
> -        if(opt.dump_all && o->count == 0 && o->injected)
> -            printf(" [vla] Pre-injection\n");
> -
> -        o->count++;
> -
> -        if((opt.dump_all)
> -#if 0
> -           && (ov->runstate.state != RUNSTATE_RUNNING
> -               || ov->hvm.vmexit_valid)
> -#endif
> -            )
> -            printf(" [vla] d%dv%d vec %d state %s (outstanding ipis %d)\n",
> -                   ov->d->did, ov->vid,
> -                   o->vec,
> -                   runstate_name[ov->runstate.state],
> -                   o->count);
> -    }
> -
>      if(m->is_write) {
>          if(opt.dump_all) {
>              printf("              [vla] d%dv%d icr vec %d %s\n",
> @@ -4124,23 +4120,23 @@ void cr3_prealloc_unpin(struct vcpu_data *v, unsigned 
> long long gmfn) {
>                 gmfn, cr3->prealloc_unpin.count);
>  }
>  
> +int cr3_compare_start(const void *_a, const void *_b) {
> +    struct cr3_value_struct *a=*(typeof(&a))_a;
> +    struct cr3_value_struct *b=*(typeof(&a))_b;
> +
> +    if(a->first_time > b->first_time)
> +        return 1;
> +    else if(b->first_time == a->first_time)
> +        return 0;
> +    else
> +        return -1;
> +}
> +
>  void cr3_dump_list(struct cr3_value_struct *head){
>      struct cr3_value_struct *p;
>      struct cr3_value_struct **qsort_array;
>      int i, N=0;
>  
> -    int cr3_compare_start(const void *_a, const void *_b) {
> -        struct cr3_value_struct *a=*(typeof(&a))_a;
> -        struct cr3_value_struct *b=*(typeof(&a))_b;
> -
> -        if(a->first_time > b->first_time)
> -            return 1;
> -        else if(b->first_time == a->first_time)
> -            return 0;
> -        else
> -            return -1;
> -    }
> -
>      if(!head)
>          return;
>  
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.