WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

Re: [Xen-ia64-devel] [PATCH 6/8] foreign p2m: rewrite dump-core with for

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: Re: [Xen-ia64-devel] [PATCH 6/8] foreign p2m: rewrite dump-core with foreign p2m
From: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
Date: Mon, 3 Sep 2007 22:57:23 +0900
Delivery-date: Mon, 03 Sep 2007 06:57:39 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <20070828065732.GA28268%yamahata@xxxxxxxxxxxxx>
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20070828065732.GA28268%yamahata@xxxxxxxxxxxxx>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.4.2.1i
This patch is superceded by the newer patch.
Please use the the patch which is posted as
http://lists.xensource.com/archives/html/xen-devel/2007-08/msg00623.html

On Tue, Aug 28, 2007 at 03:57:32PM +0900, Isaku Yamahata wrote:
> # HG changeset patch
> # User yamahata@xxxxxxxxxxxxx
> # Date 1188274218 -32400
> # Node ID 82ebc14bec8f14281401faa2eefe4ebc6e4d77bc
> # Parent  9324ed30f6eee4bf86e8929c7e4d031d79128e77
> xc_core_ia64 optimization with foreign p2m exposure
> PATCHNAME: xc_core_ia64_foreign_p2m
> 
> Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
> 
> diff -r 9324ed30f6ee -r 82ebc14bec8f tools/libxc/xc_core_ia64.c
> --- a/tools/libxc/xc_core_ia64.c      Tue Aug 28 12:55:30 2007 +0900
> +++ b/tools/libxc/xc_core_ia64.c      Tue Aug 28 13:10:18 2007 +0900
> @@ -23,6 +23,17 @@
>  #include "xc_efi.h"
>  #include "xc_dom.h"
>  #include <inttypes.h>
> +
> +int
> +xc_core_arch_gpfn_present(int xc_handle,
> +                          struct xc_core_arch_context *arch_ctxt,
> +                          uint32_t domid, unsigned long pfn)
> +{
> +    if (arch_ctxt->p2m_table.p2m == NULL)
> +        return xc_core_arch_gpfn_present_default(xc_handle, arch_ctxt,
> +                                                 domid, pfn);
> +    return xc_ia64_p2m_present(&arch_ctxt->p2m_table, pfn);
> +}
>  
>  static int
>  xc_memory_map_cmp(const void *lhs__, const void *rhs__)
> @@ -158,13 +169,18 @@ memory_map_get_old(int xc_handle, xc_dom
>  }
>  
>  int
> -xc_core_arch_memory_map_get(int xc_handle, xc_dominfo_t *info,
> -                            shared_info_t *live_shinfo,
> +xc_core_arch_memory_map_get(int xc_handle,
> +                            struct xc_core_arch_context *arch_ctxt,
> +                            xc_dominfo_t *info, shared_info_t *live_shinfo,
>                              xc_core_memory_map_t **mapp,
>                              unsigned int *nr_entries)
>  {
>      int ret = -1;
> -    xen_ia64_memmap_info_t *memmap_info;
> +    unsigned int memmap_info_num_pages;
> +    unsigned long memmap_info_pfn;
> +
> +    xen_ia64_memmap_info_t *memmap_info_live;
> +    xen_ia64_memmap_info_t *memmap_info = NULL;
>      unsigned long map_size;
>      xc_core_memory_map_t *map;
>      char *start;
> @@ -172,27 +188,46 @@ xc_core_arch_memory_map_get(int xc_handl
>      char *p;
>      efi_memory_desc_t *md;
>  
> -    if  ( live_shinfo == NULL ||
> -          live_shinfo->arch.memmap_info_num_pages == 0 ||
> -          live_shinfo->arch.memmap_info_pfn == 0 )
> +    if ( live_shinfo == NULL )
> +    {
> +        ERROR("can't access shared info");
>          goto old;
> -
> -    map_size = PAGE_SIZE * live_shinfo->arch.memmap_info_num_pages;
> -    memmap_info = xc_map_foreign_range(xc_handle, info->domid,
> -                                       map_size, PROT_READ,
> -                                       live_shinfo->arch.memmap_info_pfn);
> +    }
> +
> +    /* copy before use in case someone updating them */
> +    memmap_info_num_pages = live_shinfo->arch.memmap_info_num_pages;
> +    memmap_info_pfn = live_shinfo->arch.memmap_info_pfn;
> +    if ( memmap_info_num_pages == 0 || memmap_info_pfn == 0 )
> +    {
> +        ERROR("memmap_info_num_pages 0x%x memmap_info_pfn 0x%lx",
> +              memmap_info_num_pages, memmap_info_pfn);
> +        goto old;
> +    }
> +
> +    map_size = PAGE_SIZE * memmap_info_num_pages;
> +    memmap_info_live = xc_map_foreign_range(xc_handle, info->domid,
> +                                       map_size, PROT_READ, memmap_info_pfn);
> +    if ( memmap_info_live == NULL )
> +    {
> +        PERROR("Could not map memmap info.");
> +        return -1;
> +    }
> +    memmap_info = malloc(map_size);
>      if ( memmap_info == NULL )
>      {
> -        PERROR("Could not map memmap info.");
> -        return -1;
> -    }
> +        munmap(memmap_info_live, map_size);
> +        return -1;
> +    }
> +    memcpy(memmap_info, memmap_info_live, map_size);    /* copy before use */
> +    munmap(memmap_info_live, map_size);
> +    
>      if ( memmap_info->efi_memdesc_size != sizeof(*md) ||
>           (memmap_info->efi_memmap_size / memmap_info->efi_memdesc_size) == 0 
> ||
>           memmap_info->efi_memmap_size > map_size - sizeof(memmap_info) ||
>           memmap_info->efi_memdesc_version != EFI_MEMORY_DESCRIPTOR_VERSION )
>      {
>          PERROR("unknown memmap header. defaulting to compat mode.");
> -        munmap(memmap_info, PAGE_SIZE);
> +        free(memmap_info);
>          goto old;
>      }
>  
> @@ -201,7 +236,8 @@ xc_core_arch_memory_map_get(int xc_handl
>      if ( map == NULL )
>      {
>          PERROR("Could not allocate memory for memmap.");
> -        goto out;
> +        free(memmap_info);
> +        return -1;
>      }
>      *mapp = map;
>  
> @@ -221,12 +257,16 @@ xc_core_arch_memory_map_get(int xc_handl
>          (*nr_entries)++;
>      }
>      ret = 0;
> -out:
> -    munmap(memmap_info, map_size);
> +
> +    xc_ia64_p2m_map(&arch_ctxt->p2m_table, xc_handle, info->domid,
> +                    memmap_info, 0);
> +    if ( memmap_info != NULL )
> +        free(memmap_info);
>      qsort(map, *nr_entries, sizeof(map[0]), &xc_memory_map_cmp);
>      return ret;
>      
>  old:
> +    DPRINTF("Falling back old method.\n");
>      return memory_map_get_old(xc_handle, info, live_shinfo, mapp, 
> nr_entries);
>  }
>  
> @@ -253,6 +293,8 @@ xc_core_arch_context_init(struct xc_core
>      arch_ctxt->nr_vcpus = 0;
>      for ( i = 0; i < MAX_VIRT_CPUS; i++ )
>          arch_ctxt->mapped_regs[i] = NULL;
> +
> +    xc_ia64_p2m_init(&arch_ctxt->p2m_table);
>  }
>  
>  void
> @@ -262,6 +304,7 @@ xc_core_arch_context_free(struct xc_core
>      for ( i = 0; i < arch_ctxt->nr_vcpus; i++ )
>          if ( arch_ctxt->mapped_regs[i] != NULL )
>              munmap(arch_ctxt->mapped_regs[i], arch_ctxt->mapped_regs_size);
> +    xc_ia64_p2m_unmap(&arch_ctxt->p2m_table);
>  }
>  
>  int
> diff -r 9324ed30f6ee -r 82ebc14bec8f tools/libxc/xc_core_ia64.h
> --- a/tools/libxc/xc_core_ia64.h      Tue Aug 28 12:55:30 2007 +0900
> +++ b/tools/libxc/xc_core_ia64.h      Tue Aug 28 13:10:18 2007 +0900
> @@ -21,6 +21,8 @@
>  #ifndef XC_CORE_IA64_H
>  #define XC_CORE_IA64_H
>  
> +#include "ia64/xc_ia64.h"
> +
>  #define ELF_ARCH_DATA           ELFDATA2LSB
>  #define ELF_ARCH_MACHINE        EM_IA_64
>  
> @@ -28,6 +30,8 @@ struct xc_core_arch_context {
>      size_t mapped_regs_size;
>      int nr_vcpus;
>      mapped_regs_t* mapped_regs[MAX_VIRT_CPUS];
> +
> +    struct xen_ia64_p2m_table p2m_table;
>  };
>  
>  void
> @@ -47,6 +51,12 @@ xc_core_arch_context_dump(struct xc_core
>  xc_core_arch_context_dump(struct xc_core_arch_context* arch_ctxt,
>                            void* args, dumpcore_rtn_t dump_rtn);
>  
> +int
> +xc_core_arch_gpfn_present(int xc_handle,
> +                          struct xc_core_arch_context *arch_ctxt,
> +                          uint32_t domid, unsigned long pfn);
> +#define xc_core_arch_gpfn_present xc_core_arch_gpfn_present
> +
>  #endif /* XC_CORE_IA64_H */
>  
>  /*


> _______________________________________________
> Xen-ia64-devel mailing list
> Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-ia64-devel

-- 
yamahata

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

<Prev in Thread] Current Thread [Next in Thread>
  • Re: [Xen-ia64-devel] [PATCH 6/8] foreign p2m: rewrite dump-core with foreign p2m, Isaku Yamahata <=