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

Re: [Xen-devel] [PATCH] VT-d: make scope parsing code type safe


  • To: Jan Beulich <JBeulich@xxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxx>
  • From: Keir Fraser <keir@xxxxxxx>
  • Date: Wed, 28 Nov 2012 15:51:24 +0000
  • Cc: xiantao.zhang@xxxxxxxxx
  • Delivery-date: Wed, 28 Nov 2012 15:51:44 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac3NgDfXsWQTndbAnEe9jg4u4qAA3A==
  • Thread-topic: [Xen-devel] [PATCH] VT-d: make scope parsing code type safe

On 28/11/2012 14:32, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:

> Rather than requiring the scopes to be the first members of their
> respective structures (so that casts can be used to switch between the
> different views), properly use types and container_of().
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

Definitely an improvement.

Acked-by: Keir Fraser <keir@xxxxxxx>

> --- a/xen/drivers/passthrough/vtd/dmar.c
> +++ b/xen/drivers/passthrough/vtd/dmar.c
> @@ -304,13 +304,15 @@ static int __init scope_device_count(con
>  
>  
>  static int __init acpi_parse_dev_scope(
> -    const void *start, const void *end, void *acpi_entry, int type, u16 seg)
> +    const void *start, const void *end, struct dmar_scope *scope,
> +    int type, u16 seg)
>  {
> -    struct dmar_scope *scope = acpi_entry;
>      struct acpi_ioapic_unit *acpi_ioapic_unit;
>      const struct acpi_dmar_device_scope *acpi_scope;
>      u16 bus, sub_bus, sec_bus;
>      const struct acpi_dmar_pci_path *path;
> +    struct acpi_drhd_unit *drhd = type == DMAR_TYPE ?
> +        container_of(scope, struct acpi_drhd_unit, scope) : NULL;
>      int depth, cnt, didx = 0;
>  
>      if ( (cnt = scope_device_count(start, end)) < 0 )
> @@ -359,9 +361,8 @@ static int __init acpi_parse_dev_scope(
>                  dprintk(VTDPREFIX, " MSI HPET: %04x:%02x:%02x.%u\n",
>                          seg, bus, path->dev, path->fn);
>  
> -            if ( type == DMAR_TYPE )
> +            if ( drhd )
>              {
> -                struct acpi_drhd_unit *drhd = acpi_entry;
>                  struct acpi_hpet_unit *acpi_hpet_unit;
>  
>                  acpi_hpet_unit = xmalloc(struct acpi_hpet_unit);
> @@ -381,10 +382,8 @@ static int __init acpi_parse_dev_scope(
>                  dprintk(VTDPREFIX, " endpoint: %04x:%02x:%02x.%u\n",
>                          seg, bus, path->dev, path->fn);
>  
> -            if ( type == DMAR_TYPE )
> +            if ( drhd )
>              {
> -                struct acpi_drhd_unit *drhd = acpi_entry;
> -
>                  if ( (seg == 0) && (bus == 0) && (path->dev == 2) &&
>                       (path->fn == 0) )
>                      igd_drhd_address = drhd->address;
> @@ -397,9 +396,8 @@ static int __init acpi_parse_dev_scope(
>                  dprintk(VTDPREFIX, " IOAPIC: %04x:%02x:%02x.%u\n",
>                          seg, bus, path->dev, path->fn);
>  
> -            if ( type == DMAR_TYPE )
> +            if ( drhd )
>              {
> -                struct acpi_drhd_unit *drhd = acpi_entry;
>                  acpi_ioapic_unit = xmalloc(struct acpi_ioapic_unit);
>                  if ( !acpi_ioapic_unit )
>                      return -ENOMEM;
> @@ -463,7 +461,7 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
>      dev_scope_start = (void *)(drhd + 1);
>      dev_scope_end = ((void *)drhd) + header->length;
>      ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end,
> -                               dmaru, DMAR_TYPE, drhd->segment);
> +                               &dmaru->scope, DMAR_TYPE, drhd->segment);
>  
>      if ( dmaru->include_all )
>      {
> @@ -590,7 +588,7 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
>      dev_scope_start = (void *)(rmrr + 1);
>      dev_scope_end   = ((void *)rmrr) + header->length;
>      ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end,
> -                               rmrru, RMRR_TYPE, rmrr->segment);
> +                               &rmrru->scope, RMRR_TYPE, rmrr->segment);
>  
>      if ( ret || (rmrru->scope.devices_cnt == 0) )
>          xfree(rmrru);
> @@ -683,7 +681,7 @@ acpi_parse_one_atsr(struct acpi_dmar_hea
>          dev_scope_start = (void *)(atsr + 1);
>          dev_scope_end   = ((void *)atsr) + header->length;
>          ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end,
> -                                   atsru, ATSR_TYPE, atsr->segment);
> +                                   &atsru->scope, ATSR_TYPE, atsr->segment);
>      }
>      else
>      {
> --- a/xen/drivers/passthrough/vtd/dmar.h
> +++ b/xen/drivers/passthrough/vtd/dmar.h
> @@ -59,7 +59,7 @@ struct dmar_scope {
>  };
>  
>  struct acpi_drhd_unit {
> -    struct dmar_scope scope;            /* must be first member of struct */
> +    struct dmar_scope scope;
>      struct list_head list;
>      u64    address;                     /* register base address of the unit
> */
>      u16    segment;
> @@ -70,7 +70,7 @@ struct acpi_drhd_unit {
>  };
>  
>  struct acpi_rmrr_unit {
> -    struct dmar_scope scope;            /* must be first member of struct */
> +    struct dmar_scope scope;
>      struct list_head list;
>      u64    base_address;
>      u64    end_address;
> @@ -79,7 +79,7 @@ struct acpi_rmrr_unit {
>  };
>  
>  struct acpi_atsr_unit {
> -    struct dmar_scope scope;            /* must be first member of struct */
> +    struct dmar_scope scope;
>      struct list_head list;
>      u16    segment;
>      u8     all_ports:1;
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel



_______________________________________________
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®.