All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [rfc] [patch] "frame number" size in hypercall ABI
       [not found] <E1FWBAp-0008KG-7d@host-192-168-0-1-bcn-london>
@ 2006-04-19 15:32 ` Joe Bonasera
  2006-04-19 15:43   ` Keir Fraser
  0 siblings, 1 reply; 16+ messages in thread
From: Joe Bonasera @ 2006-04-19 15:32 UTC (permalink / raw)
  To: xen-devel


> Message: 3
> Date: Wed, 19 Apr 2006 08:24:44 +0100
> From: Keir Fraser <Keir.Fraser@cl.cam.ac.uk>
> Subject: [Xen-devel] Re: [rfc] [patch] "frame number" size in
> 	hypercall ABI
> To: Hollis Blanchard <hollisb@us.ibm.com>
> Cc: xen-devel <xen-devel@lists.xensource.com>
> Message-ID: <e3a01a5452fa05ddd61fde154e01d557@cl.cam.ac.uk>
> Content-Type: text/plain; charset=US-ASCII; format=flowed
> 
> 
> On 18 Apr 2006, at 20:17, Hollis Blanchard wrote:
> 
...
>>
>>I also haven't converted Xen itself to use frameno_t except where
>>absolutely necessary. It isn't required to solve my immediate 
>>problem...
> 
> 
> I think the patch looks okay in principle, except I notice a couple of 
> 'framno_t' misspellings. I think 'pfn_t' would be more in keeping with 
> the Xen naming scheme for arbitrary page frame numbers, but perhaps 
> that name is a bit unnecessarily cryptic. What is the immediate problem 
> you're needing to solve?
> 
>   -- Keir

Please don't use pfn_t, that's what Solaris already uses internally for
physical frame numbers. In the Xen code for Solaris, I introduced
mfn_t as the corresponding type for Xen's machine frame numbers.
frameno_t is fine, as I can just define mfn_t and frameno_t to be
the same, but conflicting pfn_t's would be problematic.

Joe

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Re: [rfc] [patch] "frame number" size in hypercall ABI
  2006-04-19 15:32 ` [rfc] [patch] "frame number" size in hypercall ABI Joe Bonasera
@ 2006-04-19 15:43   ` Keir Fraser
  2006-04-19 16:44     ` Hollis Blanchard
  0 siblings, 1 reply; 16+ messages in thread
From: Keir Fraser @ 2006-04-19 15:43 UTC (permalink / raw)
  To: Joe Bonasera; +Cc: xen-devel


On 19 Apr 2006, at 16:32, Joe Bonasera wrote:

>> I think the patch looks okay in principle, except I notice a couple 
>> of 'framno_t' misspellings. I think 'pfn_t' would be more in keeping 
>> with the Xen naming scheme for arbitrary page frame numbers, but 
>> perhaps that name is a bit unnecessarily cryptic. What is the 
>> immediate problem you're needing to solve?
>>   -- Keir
>
> Please don't use pfn_t, that's what Solaris already uses internally for
> physical frame numbers. In the Xen code for Solaris, I introduced
> mfn_t as the corresponding type for Xen's machine frame numbers.
> frameno_t is fine, as I can just define mfn_t and frameno_t to be
> the same, but conflicting pfn_t's would be problematic.

Fair enough. We should really avoid polluting the typedef namespace 
with such short names anyway.

  -- Keir

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-19 15:43   ` Keir Fraser
@ 2006-04-19 16:44     ` Hollis Blanchard
  2006-04-19 18:25       ` Keir Fraser
  0 siblings, 1 reply; 16+ messages in thread
From: Hollis Blanchard @ 2006-04-19 16:44 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel, Joe Bonasera

On Wed, 2006-04-19 at 16:43 +0100, Keir Fraser wrote:
> On 19 Apr 2006, at 16:32, Joe Bonasera wrote:
> 
> >> I think the patch looks okay in principle, except I notice a couple 
> >> of 'framno_t' misspellings. I think 'pfn_t' would be more in keeping 
> >> with the Xen naming scheme for arbitrary page frame numbers, but 
> >> perhaps that name is a bit unnecessarily cryptic. What is the 
> >> immediate problem you're needing to solve?
> >>   -- Keir
> >
> > Please don't use pfn_t, that's what Solaris already uses internally for
> > physical frame numbers. In the Xen code for Solaris, I introduced
> > mfn_t as the corresponding type for Xen's machine frame numbers.
> > frameno_t is fine, as I can just define mfn_t and frameno_t to be
> > the same, but conflicting pfn_t's would be problematic.
> 
> Fair enough. We should really avoid polluting the typedef namespace 
> with such short names anyway.

"xen_frameno_t" then?

Attached is the updated patch, with typos fixed and a couple other
corrections. I've also added the type to arch-x86_64.h and arch-ia64.h,
so I think the patch is ready to be applied.

-- 
Hollis Blanchard
IBM Linux Technology Center

Represent frame numbers with a typedef instead of "unsigned long".

Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>

diff -r c4eead8a925b linux-2.6-xen-sparse/include/xen/public/privcmd.h
--- a/linux-2.6-xen-sparse/include/xen/public/privcmd.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/linux-2.6-xen-sparse/include/xen/public/privcmd.h	Wed Apr 19 11:39:31 2006 -0500
@@ -45,7 +45,7 @@ typedef struct privcmd_hypercall
 
 typedef struct privcmd_mmap_entry {
 	unsigned long va;
-	unsigned long mfn;
+	frameno_t mfn;
 	unsigned long npages;
 } privcmd_mmap_entry_t; 
 
diff -r c4eead8a925b tools/debugger/libxendebug/xendebug.c
--- a/tools/debugger/libxendebug/xendebug.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/debugger/libxendebug/xendebug.c	Wed Apr 19 11:39:31 2006 -0500
@@ -57,7 +57,7 @@ typedef struct domain_context           
     vcpu_guest_context_t context[MAX_VIRT_CPUS];
 
     long            total_pages;
-    unsigned long  *page_array;
+    frameno_t      *page_array;
 
     unsigned long   cr3_phys[MAX_VIRT_CPUS];
     unsigned long  *cr3_virt[MAX_VIRT_CPUS];
diff -r c4eead8a925b tools/ioemu/vl.c
--- a/tools/ioemu/vl.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/ioemu/vl.c	Wed Apr 19 11:39:31 2006 -0500
@@ -149,11 +149,11 @@ TextConsole *vga_console;
 TextConsole *vga_console;
 CharDriverState *serial_hds[MAX_SERIAL_PORTS];
 int xc_handle;
-unsigned long *vgapage_array;
-unsigned long *freepage_array;
+frameno_t *vgapage_array;
+frameno_t *freepage_array;
 unsigned long free_pages;
 void *vtop_table;
-unsigned long toptab;
+frameno_t toptab;
 unsigned long vgaram_pages;
 
 /***********************************************************/
@@ -2673,7 +2673,8 @@ int main(int argc, char **argv)
     int serial_device_index;
     char qemu_dm_logfilename[64];
     const char *loadvm = NULL;
-    unsigned long nr_pages, extra_pages, ram_pages, *page_array;
+    unsigned long nr_pages, extra_pages, ram_pages;
+    frameno_t *page_array;
     xc_dominfo_t info;
     extern void *shared_page;
     extern void *shared_vram;
@@ -3156,8 +3157,8 @@ int main(int argc, char **argv)
         exit(-1);
     }
 
-    if ( (page_array = (unsigned long *)
-                        malloc(nr_pages * sizeof(unsigned long))) == NULL)
+    if ( (page_array = (frameno_t *)
+                        malloc(nr_pages * sizeof(frameno_t))) == NULL)
     {
         fprintf(logfile, "malloc returned error %d\n", errno);
         exit(-1);
@@ -3239,7 +3240,7 @@ int main(int argc, char **argv)
                                        page_array[0]);
 #endif
 
-    fprintf(logfile, "shared page at pfn:%lx, mfn: %lx\n", (nr_pages-1),
+    fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", (nr_pages-1),
            (page_array[nr_pages - 1]));
 
     /* we always create the cdrom drive, even if no disk is there */
diff -r c4eead8a925b tools/libxc/xc_core.c
--- a/tools/libxc/xc_core.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_core.c	Wed Apr 19 11:39:31 2006 -0500
@@ -11,7 +11,7 @@ static int
 static int
 copy_from_domain_page(int xc_handle,
                       uint32_t domid,
-                      unsigned long mfn,
+                      frameno_t mfn,
                       void *dst_page)
 {
     void *vaddr = xc_map_foreign_range(
@@ -93,7 +93,7 @@ xc_domain_dumpcore_via_callback(int xc_h
         printf("Could not get the page frame list\n");
         goto error_out;
     }
-    sts = dump_rtn(args, (char *)page_array, nr_pages * sizeof(unsigned long));
+    sts = dump_rtn(args, (char *)page_array, nr_pages * sizeof(frameno_t));
     if ( sts != 0 )
         goto error_out;
 
diff -r c4eead8a925b tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_domain.c	Wed Apr 19 11:39:31 2006 -0500
@@ -291,7 +291,7 @@ int xc_domain_memory_increase_reservatio
                                           unsigned long nr_extents,
                                           unsigned int extent_order,
                                           unsigned int address_bits,
-                                          unsigned long *extent_start)
+                                          frameno_t *extent_start)
 {
     int err;
     struct xen_memory_reservation reservation = {
@@ -322,7 +322,7 @@ int xc_domain_memory_decrease_reservatio
                                           uint32_t domid,
                                           unsigned long nr_extents,
                                           unsigned int extent_order,
-                                          unsigned long *extent_start)
+                                          frameno_t *extent_start)
 {
     int err;
     struct xen_memory_reservation reservation = {
diff -r c4eead8a925b tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_hvm_build.c	Wed Apr 19 11:39:31 2006 -0500
@@ -135,7 +135,7 @@ static void set_hvm_info_checksum(struct
  * hvmloader will use this info to set BIOS accordingly
  */
 static int set_hvm_info(int xc_handle, uint32_t dom,
-                        unsigned long *pfn_list, unsigned int vcpus,
+                        frameno_t *pfn_list, unsigned int vcpus,
                         unsigned int pae, unsigned int acpi, unsigned int apic)
 {
     char *va_map;
@@ -176,9 +176,9 @@ static int setup_guest(int xc_handle,
                        unsigned int acpi,
                        unsigned int apic,
                        unsigned int store_evtchn,
-                       unsigned long *store_mfn)
-{
-    unsigned long *page_array = NULL;
+                       frameno_t *store_mfn)
+{
+    frameno_t *page_array = NULL;
     unsigned long count, i;
     unsigned long long ptr;
     xc_mmu_t *mmu = NULL;
@@ -190,7 +190,7 @@ static int setup_guest(int xc_handle,
     struct domain_setup_info dsi;
     unsigned long long v_end;
 
-    unsigned long shared_page_frame = 0;
+    frameno_t shared_page_frame = 0;
     shared_iopage_t *sp;
 
     memset(&dsi, 0, sizeof(struct domain_setup_info));
@@ -223,7 +223,7 @@ static int setup_guest(int xc_handle,
         goto error_out;
     }
 
-    if ( (page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL )
+    if ( (page_array = malloc(nr_pages * sizeof(frameno_t))) == NULL )
     {
         PERROR("Could not allocate memory.\n");
         goto error_out;
@@ -346,7 +346,7 @@ static int xc_hvm_build_internal(int xc_
                                  unsigned int acpi,
                                  unsigned int apic,
                                  unsigned int store_evtchn,
-                                 unsigned long *store_mfn)
+                                 frameno_t *store_mfn)
 {
     dom0_op_t launch_op, op;
     int rc, i;
@@ -592,7 +592,7 @@ int xc_hvm_build(int xc_handle,
                  unsigned int acpi,
                  unsigned int apic,
                  unsigned int store_evtchn,
-                 unsigned long *store_mfn)
+                 frameno_t *store_mfn)
 {
     char *image;
     int  sts;
@@ -628,7 +628,7 @@ int xc_hvm_build_mem(int xc_handle,
                      unsigned int acpi,
                      unsigned int apic,
                      unsigned int store_evtchn,
-                     unsigned long *store_mfn)
+                     frameno_t *store_mfn)
 {
     int           sts;
     unsigned long img_len;
diff -r c4eead8a925b tools/libxc/xc_ia64_stubs.c
--- a/tools/libxc/xc_ia64_stubs.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_ia64_stubs.c	Wed Apr 19 11:39:31 2006 -0500
@@ -31,8 +31,8 @@ int xc_linux_save(int xc_handle, int io_
 }
 
 int xc_linux_restore(int xc_handle, int io_fd, uint32_t dom, unsigned long nr_pfns,
-                     unsigned int store_evtchn, unsigned long *store_mfn,
-                     unsigned int console_evtchn, unsigned long *console_mfn)
+                     unsigned int store_evtchn, frameno_t *store_mfn,
+                     unsigned int console_evtchn, frameno_t *console_mfn)
 {
     PERROR("xc_linux_restore not implemented\n");
     return -1;
@@ -51,7 +51,7 @@ xc_plan9_build(int xc_handle,
 
 int xc_ia64_get_pfn_list(int xc_handle,
                          uint32_t domid,
-                         unsigned long *pfn_buf,
+                         frameno_t *pfn_buf, 
                          unsigned int start_page,
                          unsigned int nr_pages)
 {
@@ -65,7 +65,7 @@ int xc_ia64_get_pfn_list(int xc_handle,
     op.u.getmemlist.buffer   = pfn_buf;
 
     if ( (max_pfns != -1UL)
-        && mlock(pfn_buf, nr_pages * sizeof(unsigned long)) != 0 )
+        && mlock(pfn_buf, nr_pages * sizeof(frameno_t)) != 0 )
     {
         PERROR("Could not lock pfn list buffer");
         return -1;
@@ -74,7 +74,7 @@ int xc_ia64_get_pfn_list(int xc_handle,
     ret = do_dom0_op(xc_handle, &op);
 
     if (max_pfns != -1UL)
-        (void)munlock(pfn_buf, nr_pages * sizeof(unsigned long));
+        (void)munlock(pfn_buf, nr_pages * sizeof(frameno_t));
 
     return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
 }
@@ -93,10 +93,10 @@ int xc_ia64_copy_to_domain_pages(int xc_
 {
     // N.B. gva should be page aligned
 
-    unsigned long *page_array = NULL;
+    frameno_t *page_array = NULL;
     int i;
 
-    if ( (page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL ){
+    if ( (page_array = malloc(nr_pages * sizeof(frameno_t))) == NULL ){
         PERROR("Could not allocate memory");
         goto error_out;
     }
@@ -643,7 +643,7 @@ int xc_hvm_build(int xc_handle,
                  unsigned int acpi,
                  unsigned int apic,
                  unsigned int store_evtchn,
-                 unsigned long *store_mfn)
+                 frameno_t *store_mfn)
 {
     dom0_op_t launch_op, op;
     int rc ;
diff -r c4eead8a925b tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_linux_build.c	Wed Apr 19 11:39:31 2006 -0500
@@ -18,6 +18,7 @@
 #include "xc_aout9.h"
 #include <stdlib.h>
 #include <unistd.h>
+#include <inttypes.h>
 #include <zlib.h>
 
 #if defined(__i386__)
@@ -144,7 +145,7 @@ int load_initrd(int xc_handle, domid_t d
 int load_initrd(int xc_handle, domid_t dom,
                 struct initrd_info *initrd,
                 unsigned long physbase,
-                unsigned long *phys_to_mach)
+                frameno_t *phys_to_mach)
 {
     char page[PAGE_SIZE];
     unsigned long pfn_start, pfn, nr_pages;
@@ -197,7 +198,7 @@ static int setup_pg_tables(int xc_handle
                            vcpu_guest_context_t *ctxt,
                            unsigned long dsi_v_start,
                            unsigned long v_end,
-                           unsigned long *page_array,
+                           frameno_t *page_array,
                            unsigned long vpt_start,
                            unsigned long vpt_end,
                            unsigned shadow_mode_enabled)
@@ -259,7 +260,7 @@ static int setup_pg_tables_pae(int xc_ha
                                vcpu_guest_context_t *ctxt,
                                unsigned long dsi_v_start,
                                unsigned long v_end,
-                               unsigned long *page_array,
+                               frameno_t *page_array,
                                unsigned long vpt_start,
                                unsigned long vpt_end,
                                unsigned shadow_mode_enabled)
@@ -352,7 +353,7 @@ static int setup_pg_tables_64(int xc_han
                               vcpu_guest_context_t *ctxt,
                               unsigned long dsi_v_start,
                               unsigned long v_end,
-                              unsigned long *page_array,
+                              frameno_t *page_array,
                               unsigned long vpt_start,
                               unsigned long vpt_end,
                               int shadow_mode_enabled)
@@ -459,11 +460,11 @@ static int setup_guest(int xc_handle,
                        const char *cmdline,
                        unsigned long shared_info_frame,
                        unsigned long flags,
-                       unsigned int store_evtchn, unsigned long *store_mfn,
-                       unsigned int console_evtchn, unsigned long *console_mfn,
+                       unsigned int store_evtchn, frameno_t *store_mfn,
+                       unsigned int console_evtchn, frameno_t *console_mfn,
                        uint32_t required_features[XENFEAT_NR_SUBMAPS])
 {
-    unsigned long *page_array = NULL;
+    frameno_t *page_array = NULL;
     struct load_funcs load_funcs;
     struct domain_setup_info dsi;
     unsigned long vinitrd_start;
@@ -490,7 +491,7 @@ static int setup_guest(int xc_handle,
 
     start_page = dsi.v_start >> PAGE_SHIFT;
     pgnr = (v_end - dsi.v_start) >> PAGE_SHIFT;
-    if ( (page_array = malloc(pgnr * sizeof(unsigned long))) == NULL )
+    if ( (page_array = malloc(pgnr * sizeof(frameno_t))) == NULL )
     {
         PERROR("Could not allocate memory");
         goto error_out;
@@ -614,11 +615,11 @@ static int setup_guest(int xc_handle,
                        const char *cmdline,
                        unsigned long shared_info_frame,
                        unsigned long flags,
-                       unsigned int store_evtchn, unsigned long *store_mfn,
-                       unsigned int console_evtchn, unsigned long *console_mfn,
+                       unsigned int store_evtchn, frameno_t *store_mfn,
+                       unsigned int console_evtchn, frameno_t *console_mfn,
                        uint32_t required_features[XENFEAT_NR_SUBMAPS])
 {
-    unsigned long *page_array = NULL;
+    frameno_t *page_array = NULL;
     unsigned long count, i, hypercall_pfn;
     start_info_t *start_info;
     shared_info_t *shared_info;
@@ -629,7 +630,7 @@ static int setup_guest(int xc_handle,
 
     unsigned long nr_pt_pages;
     unsigned long physmap_pfn;
-    unsigned long *physmap, *physmap_e;
+    frameno_t *physmap, *physmap_e;
 
     struct load_funcs load_funcs;
     struct domain_setup_info dsi;
@@ -782,7 +783,7 @@ static int setup_guest(int xc_handle,
         goto error_out;
     }
 
-    if ( (page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL )
+    if ( (page_array = malloc(nr_pages * sizeof(frameno_t))) == NULL )
     {
         PERROR("Could not allocate memory");
         goto error_out;
@@ -872,8 +873,8 @@ static int setup_guest(int xc_handle,
             ((uint64_t)page_array[count] << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE,
             count) )
         {
-            fprintf(stderr,"m2p update failure p=%lx m=%lx\n",
-                    count, page_array[count]);
+            fprintf(stderr,"m2p update failure p=%lx m=%"PRIx64"\n",
+                    count, (unsigned long long)page_array[count]);
             munmap(physmap, PAGE_SIZE);
             goto error_out;
         }
@@ -1041,9 +1042,9 @@ static int xc_linux_build_internal(int x
                                    const char *features,
                                    unsigned long flags,
                                    unsigned int store_evtchn,
-                                   unsigned long *store_mfn,
+                                   frameno_t *store_mfn,
                                    unsigned int console_evtchn,
-                                   unsigned long *console_mfn)
+                                   frameno_t *console_mfn)
 {
     dom0_op_t launch_op;
     DECLARE_DOM0_OP;
@@ -1201,9 +1202,9 @@ int xc_linux_build_mem(int xc_handle,
                        const char *features,
                        unsigned long flags,
                        unsigned int store_evtchn,
-                       unsigned long *store_mfn,
+                       frameno_t *store_mfn,
                        unsigned int console_evtchn,
-                       unsigned long *console_mfn)
+                       frameno_t *console_mfn)
 {
     int            sts;
     char          *img_buf;
@@ -1267,9 +1268,9 @@ int xc_linux_build(int xc_handle,
                    const char *features,
                    unsigned long flags,
                    unsigned int store_evtchn,
-                   unsigned long *store_mfn,
+                   frameno_t *store_mfn,
                    unsigned int console_evtchn,
-                   unsigned long *console_mfn)
+                   frameno_t *console_mfn)
 {
     char *image = NULL;
     unsigned long image_size;
diff -r c4eead8a925b tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_linux_restore.c	Wed Apr 19 11:39:31 2006 -0500
@@ -104,18 +104,18 @@ int uncanonicalize_pagetable(unsigned lo
 
 int xc_linux_restore(int xc_handle, int io_fd,
                      uint32_t dom, unsigned long nr_pfns,
-                     unsigned int store_evtchn, unsigned long *store_mfn,
-                     unsigned int console_evtchn, unsigned long *console_mfn)
+                     unsigned int store_evtchn, frameno_t *store_mfn,
+                     unsigned int console_evtchn, frameno_t *console_mfn)
 {
     DECLARE_DOM0_OP;
     int rc = 1, i, n;
-    unsigned long mfn, pfn;
+    frameno_t mfn, pfn;
     unsigned int prev_pc, this_pc;
     int verify = 0;
     int nraces = 0;
 
     /* The new domain's shared-info frame number. */
-    unsigned long shared_info_frame;
+    frameno_t shared_info_frame;
     unsigned char shared_info_page[PAGE_SIZE]; /* saved contents from file */
     shared_info_t *shared_info = (shared_info_t *)shared_info_page;
 
@@ -126,7 +126,7 @@ int xc_linux_restore(int xc_handle, int 
     unsigned long *pfn_type = NULL;
 
     /* A table of MFNs to map in the current region */
-    unsigned long *region_mfn = NULL;
+    frameno_t *region_mfn = NULL;
 
     /* Types of the pfns in the current region */
     unsigned long region_pfn_type[MAX_BATCH_SIZE];
@@ -135,7 +135,7 @@ int xc_linux_restore(int xc_handle, int 
     unsigned long *page = NULL;
 
     /* A copy of the pfn-to-mfn table frame list. */
-    unsigned long *p2m_frame_list = NULL;
+    frameno_t *p2m_frame_list = NULL;
 
     /* A temporary mapping of the guest's start_info page. */
     start_info_t *start_info;
@@ -183,9 +183,9 @@ int xc_linux_restore(int xc_handle, int 
 
 
     /* We want zeroed memory so use calloc rather than malloc. */
-    p2m        = calloc(sizeof(unsigned long), max_pfn);
+    p2m        = calloc(sizeof(frameno_t), max_pfn);
     pfn_type   = calloc(sizeof(unsigned long), max_pfn);
-    region_mfn = calloc(sizeof(unsigned long), MAX_BATCH_SIZE);
+    region_mfn = calloc(sizeof(frameno_t), MAX_BATCH_SIZE);
 
     if ((p2m == NULL) || (pfn_type == NULL) || (region_mfn == NULL)) {
         ERR("memory alloc failed");
@@ -193,7 +193,7 @@ int xc_linux_restore(int xc_handle, int 
         goto out;
     }
 
-    if (mlock(region_mfn, sizeof(unsigned long) * MAX_BATCH_SIZE)) {
+    if (mlock(region_mfn, sizeof(frameno_t) * MAX_BATCH_SIZE)) {
         ERR("Could not mlock region_mfn");
         goto out;
     }
diff -r c4eead8a925b tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_linux_save.c	Wed Apr 19 11:39:31 2006 -0500
@@ -27,7 +27,7 @@
 
 
 /* max mfn of the whole machine */
-static unsigned long max_mfn;
+static frameno_t max_mfn;
 
 /* virtual starting address of the hypervisor */
 static unsigned long hvirt_start;
@@ -36,13 +36,13 @@ static unsigned int pt_levels;
 static unsigned int pt_levels;
 
 /* total number of pages used by the current guest */
-static unsigned long max_pfn;
+static frameno_t max_pfn;
 
 /* Live mapping of the table mapping each PFN to its current MFN. */
-static unsigned long *live_p2m = NULL;
+static frameno_t *live_p2m = NULL;
 
 /* Live mapping of system MFN to PFN table. */
-static unsigned long *live_m2p = NULL;
+static frameno_t *live_m2p = NULL;
 
 /* grep fodder: machine_to_phys */
 
@@ -324,7 +324,7 @@ static int print_stats(int xc_handle, ui
 }
 
 
-static int analysis_phase(int xc_handle, uint32_t domid, int max_pfn,
+static int analysis_phase(int xc_handle, uint32_t domid, frameno_t max_pfn,
                           unsigned long *arr, int runs)
 {
     long long start, now;
@@ -508,14 +508,14 @@ static unsigned long *xc_map_m2p(int xc_
     privcmd_mmap_t ioctlx;
     privcmd_mmap_entry_t *entries;
     unsigned long m2p_chunks, m2p_size;
-    unsigned long *m2p;
+    frameno_t *m2p; 
     int i, rc;
 
     m2p_size   = M2P_SIZE(max_mfn);
     m2p_chunks = M2P_CHUNKS(max_mfn);
 
     xmml.max_extents = m2p_chunks;
-    if (!(xmml.extent_start = malloc(m2p_chunks * sizeof(unsigned long)))) {
+    if (!(xmml.extent_start = malloc(m2p_chunks * sizeof(frameno_t)))) { 
         ERR("failed to allocate space for m2p mfns");
         return NULL;
     }
@@ -571,7 +571,7 @@ int xc_linux_save(int xc_handle, int io_
     int sent_last_iter, skip_this_iter;
 
     /* The new domain's shared-info frame number. */
-    unsigned long shared_info_frame;
+    frameno_t shared_info_frame;
 
     /* A copy of the CPU context of the guest. */
     vcpu_guest_context_t ctxt;
@@ -584,11 +584,11 @@ int xc_linux_save(int xc_handle, int io_
     char page[PAGE_SIZE];
 
     /* Double and single indirect references to the live P2M table */
-    unsigned long *live_p2m_frame_list_list = NULL;
-    unsigned long *live_p2m_frame_list = NULL;
+    frameno_t *live_p2m_frame_list_list = NULL;
+    frameno_t *live_p2m_frame_list = NULL;
 
     /* A copy of the pfn-to-mfn table frame list. */
-    unsigned long *p2m_frame_list = NULL;
+    frameno_t *p2m_frame_list = NULL;
 
     /* Live mapping of shared info structure */
     shared_info_t *live_shinfo = NULL;
@@ -713,11 +713,11 @@ int xc_linux_save(int xc_handle, int io_
     memcpy(p2m_frame_list, live_p2m_frame_list, P2M_FL_SIZE);
 
     /* Canonicalise the pfn-to-mfn table frame-number list. */
-    for (i = 0; i < max_pfn; i += ulpp) {
-        if (!translate_mfn_to_pfn(&p2m_frame_list[i/ulpp])) {
+    for (i = 0; i < max_pfn; i += fpp) {
+        if (!translate_mfn_to_pfn(&p2m_frame_list[i/fpp])) {
             ERR("Frame# in pfn-to-mfn frame list is not in pseudophys");
-            ERR("entry %d: p2m_frame_list[%ld] is 0x%lx", i, i/ulpp,
-                p2m_frame_list[i/ulpp]);
+            ERR("entry %d: p2m_frame_list[%ld] is 0x"PRIx64, i, i/fpp,
+                p2m_frame_list[i/fpp]);
             goto out;
         }
     }
@@ -819,7 +819,7 @@ int xc_linux_save(int xc_handle, int io_
 
     /* Start writing out the saved-domain record. */
 
-    if(!write_exact(io_fd, &max_pfn, sizeof(unsigned long))) {
+    if(!write_exact(io_fd, &max_pfn, sizeof(frameno_t))) {
         ERR("write: max_pfn");
         goto out;
     }
diff -r c4eead8a925b tools/libxc/xc_load_elf.c
--- a/tools/libxc/xc_load_elf.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_load_elf.c	Wed Apr 19 11:39:31 2006 -0500
@@ -24,10 +24,10 @@ static int
 static int
 loadelfimage(
     const char *image, unsigned long image_size, int xch, uint32_t dom,
-    unsigned long *parray, struct domain_setup_info *dsi);
+    frameno_t *parray, struct domain_setup_info *dsi);
 static int
 loadelfsymtab(
-    const char *image, int xch, uint32_t dom, unsigned long *parray,
+    const char *image, int xch, uint32_t dom, frameno_t *parray,
     struct domain_setup_info *dsi);
 
 int probe_elf(const char *image,
@@ -187,7 +187,7 @@ static int
 static int
 loadelfimage(
     const char *image, unsigned long elfsize, int xch, uint32_t dom,
-    unsigned long *parray, struct domain_setup_info *dsi)
+    frameno_t *parray, struct domain_setup_info *dsi)
 {
     Elf_Ehdr *ehdr = (Elf_Ehdr *)image;
     Elf_Phdr *phdr;
@@ -237,7 +237,7 @@ loadelfimage(
 
 static int
 loadelfsymtab(
-    const char *image, int xch, uint32_t dom, unsigned long *parray,
+    const char *image, int xch, uint32_t dom, frameno_t *parray,
     struct domain_setup_info *dsi)
 {
     Elf_Ehdr *ehdr = (Elf_Ehdr *)image, *sym_ehdr;
diff -r c4eead8a925b tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xc_private.c	Wed Apr 19 11:39:31 2006 -0500
@@ -8,7 +8,7 @@
 #include <xen/memory.h>
 
 void *xc_map_foreign_batch(int xc_handle, uint32_t dom, int prot,
-                           unsigned long *arr, int num )
+                           frameno_t *arr, int num )
 {
     privcmd_mmapbatch_t ioctlx;
     void *addr;
@@ -36,7 +36,7 @@ void *xc_map_foreign_batch(int xc_handle
 
 void *xc_map_foreign_range(int xc_handle, uint32_t dom,
                            int size, int prot,
-                           unsigned long mfn )
+                           frameno_t mfn )
 {
     privcmd_mmap_t ioctlx;
     privcmd_mmap_entry_t entry;
@@ -309,7 +309,7 @@ long long xc_domain_get_cpu_usage( int x
 
 int xc_get_pfn_list(int xc_handle,
                     uint32_t domid,
-                    unsigned long *pfn_buf,
+                    frameno_t *pfn_buf, 
                     unsigned long max_pfns)
 {
     DECLARE_DOM0_OP;
@@ -320,10 +320,10 @@ int xc_get_pfn_list(int xc_handle,
     op.u.getmemlist.buffer   = pfn_buf;
 
 #ifdef VALGRIND
-    memset(pfn_buf, 0, max_pfns * sizeof(unsigned long));
+    memset(pfn_buf, 0, max_pfns * sizeof(frameno_t));
 #endif
 
-    if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
+    if ( mlock(pfn_buf, max_pfns * sizeof(frameno_t)) != 0 )
     {
         PERROR("xc_get_pfn_list: pfn_buf mlock failed");
         return -1;
@@ -331,7 +331,7 @@ int xc_get_pfn_list(int xc_handle,
 
     ret = do_dom0_op(xc_handle, &op);
 
-    safe_munlock(pfn_buf, max_pfns * sizeof(unsigned long));
+    safe_munlock(pfn_buf, max_pfns * sizeof(frameno_t));
 
 #if 0
 #ifdef DEBUG
@@ -362,7 +362,7 @@ long xc_get_tot_pages(int xc_handle, uin
 
 int xc_copy_to_domain_page(int xc_handle,
                            uint32_t domid,
-                           unsigned long dst_pfn,
+                           frameno_t dst_pfn, 
                            const char *src_page)
 {
     void *vaddr = xc_map_foreign_range(
@@ -410,7 +410,7 @@ unsigned long xc_get_filesz(int fd)
 }
 
 void xc_map_memcpy(unsigned long dst, const char *src, unsigned long size,
-                   int xch, uint32_t dom, unsigned long *parray,
+                   int xch, uint32_t dom, frameno_t *parray,
                    unsigned long vstart)
 {
     char *va;
@@ -477,9 +477,9 @@ int xc_version(int xc_handle, int cmd, v
 }
 
 unsigned long xc_make_page_below_4G(
-    int xc_handle, uint32_t domid, unsigned long mfn)
-{
-    unsigned long new_mfn;
+    int xc_handle, uint32_t domid, frameno_t mfn)
+{
+    frameno_t new_mfn;
 
     if ( xc_domain_memory_decrease_reservation(
         xc_handle, domid, 1, 0, &mfn) != 0 )
diff -r c4eead8a925b tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xenguest.h	Wed Apr 19 11:39:31 2006 -0500
@@ -39,8 +39,8 @@ int xc_linux_save(int xc_handle, int io_
  */
 int xc_linux_restore(int xc_handle, int io_fd, uint32_t dom,
                      unsigned long nr_pfns, unsigned int store_evtchn,
-                     unsigned long *store_mfn, unsigned int console_evtchn,
-                     unsigned long *console_mfn);
+                     frameno_t *store_mfn, unsigned int console_evtchn,
+                     frameno_t *console_mfn);
 
 /**
  * This function will create a domain for a paravirtualized Linux
@@ -66,9 +66,9 @@ int xc_linux_build(int xc_handle,
                    const char *features,
                    unsigned long flags,
                    unsigned int store_evtchn,
-                   unsigned long *store_mfn,
+                   frameno_t *store_mfn,
                    unsigned int console_evtchn,
-                   unsigned long *console_mfn);
+                   frameno_t *console_mfn);
 
 /**
  * This function will create a domain for a paravirtualized Linux
@@ -98,9 +98,9 @@ int xc_linux_build_mem(int xc_handle,
                        const char *features,
                        unsigned long flags,
                        unsigned int store_evtchn,
-                       unsigned long *store_mfn,
+                       frameno_t *store_mfn,
                        unsigned int console_evtchn,
-                       unsigned long *console_mfn);
+                       frameno_t *console_mfn);
 
 int xc_hvm_build(int xc_handle,
                  uint32_t domid,
@@ -111,7 +111,7 @@ int xc_hvm_build(int xc_handle,
                  unsigned int acpi,
                  unsigned int apic,
                  unsigned int store_evtchn,
-                 unsigned long *store_mfn);
+                 frameno_t *store_mfn);
 
 int xc_hvm_build_mem(int xc_handle,
                      uint32_t domid,
@@ -123,6 +123,6 @@ int xc_hvm_build_mem(int xc_handle,
                      unsigned int acpi,
                      unsigned int apic,
                      unsigned int store_evtchn,
-                     unsigned long *store_mfn);
+                     frameno_t *store_mfn);
 
 #endif /* XENGUEST_H */
diff -r c4eead8a925b tools/libxc/xg_save_restore.h
--- a/tools/libxc/xg_save_restore.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/libxc/xg_save_restore.h	Wed Apr 19 11:39:31 2006 -0500
@@ -105,23 +105,23 @@ static int get_platform_info(int xc_hand
 */
 #define M2P_SHIFT       L2_PAGETABLE_SHIFT_PAE
 #define M2P_CHUNK_SIZE  (1 << M2P_SHIFT)
-#define M2P_SIZE(_m)    ROUNDUP(((_m) * sizeof(unsigned long)), M2P_SHIFT)
+#define M2P_SIZE(_m)    ROUNDUP(((_m) * sizeof(frameno_t)), M2P_SHIFT)
 #define M2P_CHUNKS(_m)  (M2P_SIZE((_m)) >> M2P_SHIFT)
 
 /* Size in bytes of the P2M (rounded up to the nearest PAGE_SIZE bytes) */
-#define P2M_SIZE        ROUNDUP((max_pfn * sizeof(unsigned long)), PAGE_SHIFT)
+#define P2M_SIZE        ROUNDUP((max_pfn * sizeof(frameno_t)), PAGE_SHIFT)
 
 /* Number of unsigned longs in a page */
-#define ulpp            (PAGE_SIZE/sizeof(unsigned long))
+#define fpp            (PAGE_SIZE/sizeof(frameno_t))
 
 /* Number of entries in the pfn_to_mfn_frame_list */
-#define P2M_FL_ENTRIES  (((max_pfn)+ulpp-1)/ulpp)
+#define P2M_FL_ENTRIES  (((max_pfn)+fpp-1)/fpp)
 
 /* Size in bytes of the pfn_to_mfn_frame_list     */
-#define P2M_FL_SIZE     ((P2M_FL_ENTRIES)*sizeof(unsigned long))
+#define P2M_FL_SIZE     ((P2M_FL_ENTRIES)*sizeof(frameno_t))
 
 /* Number of entries in the pfn_to_mfn_frame_list_list */
-#define P2M_FLL_ENTRIES (((max_pfn)+(ulpp*ulpp)-1)/(ulpp*ulpp))
+#define P2M_FLL_ENTRIES (((max_pfn)+(fpp*fpp)-1)/(fpp*fpp))
 
 /* Current guests allow 8MB 'slack' in their P2M */
 #define NR_SLACK_ENTRIES   ((8 * 1024 * 1024) / PAGE_SIZE)
diff -r c4eead8a925b tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/tools/python/xen/lowlevel/xc/xc.c	Wed Apr 19 11:39:31 2006 -0500
@@ -371,7 +371,7 @@ static PyObject *pyxc_hvm_build(XcObject
     int pae  = 0;
     int acpi = 0;
     int apic = 0;
-    unsigned long store_mfn = 0;
+    frameno_t store_mfn = 0;
 
     static char *kwd_list[] = { "dom", "store_evtchn",
 				"memsize", "image", "vcpus", "pae", "acpi", "apic",
diff -r c4eead8a925b xen/common/memory.c
--- a/xen/common/memory.c	Sun Apr 16 15:41:31 2006 +0100
+++ b/xen/common/memory.c	Wed Apr 19 11:39:31 2006 -0500
@@ -31,7 +31,7 @@ static long
 static long
 increase_reservation(
     struct domain *d, 
-    GUEST_HANDLE(ulong) extent_list,
+    GUEST_HANDLE(frameno_t) extent_list,
     unsigned int   nr_extents,
     unsigned int   extent_order,
     unsigned int   flags,
@@ -80,7 +80,7 @@ static long
 static long
 populate_physmap(
     struct domain *d, 
-    GUEST_HANDLE(ulong) extent_list,
+    GUEST_HANDLE(frameno_t) extent_list,
     unsigned int  nr_extents,
     unsigned int  extent_order,
     unsigned int  flags,
@@ -177,7 +177,7 @@ static long
 static long
 decrease_reservation(
     struct domain *d,
-    GUEST_HANDLE(ulong) extent_list,
+    GUEST_HANDLE(frameno_t) extent_list,
     unsigned int   nr_extents,
     unsigned int   extent_order,
     unsigned int   flags,
diff -r c4eead8a925b xen/include/asm-x86/shadow.h
--- a/xen/include/asm-x86/shadow.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/xen/include/asm-x86/shadow.h	Wed Apr 19 11:39:31 2006 -0500
@@ -1231,8 +1231,8 @@ static inline unsigned long __shadow_sta
  * Either returns PGT_none, or PGT_l{1,2,3,4}_page_table.
  */
 static inline u32
-shadow_max_pgtable_type(struct domain *d, unsigned long gpfn,
-                        unsigned long *smfn)
+shadow_max_pgtable_type(struct domain *d, frameno_t gpfn,
+                        frameno_t *smfn)
 {
     struct shadow_status *x;
     u32 pttype = PGT_none, type;
@@ -1503,7 +1503,7 @@ static inline void guest_physmap_add_pag
 }
 
 static inline void guest_physmap_remove_page(
-    struct domain *d, unsigned long gpfn, unsigned long mfn)
+    struct domain *d, frameno_t gpfn, frameno_t mfn)
 {
     struct domain_mmap_cache c1, c2;
     unsigned long type;
diff -r c4eead8a925b xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/xen/include/public/arch-ia64.h	Wed Apr 19 11:39:31 2006 -0500
@@ -27,6 +27,9 @@ DEFINE_GUEST_HANDLE(int);
 DEFINE_GUEST_HANDLE(int);
 DEFINE_GUEST_HANDLE(long);
 DEFINE_GUEST_HANDLE(void);
+
+typedef unsigned long frameno_t;
+DEFINE_GUEST_HANDLE(frameno_t);
 #endif
 
 /* Maximum number of virtual CPUs in multi-processor guests. */
@@ -295,7 +298,7 @@ typedef mapped_regs_t vpd_t;
 
 typedef struct {
     unsigned int flags;
-    unsigned long start_info_pfn;
+    frameno_t start_info_pfn;
 } arch_shared_info_t;
 
 typedef struct {
diff -r c4eead8a925b xen/include/public/arch-x86_32.h
--- a/xen/include/public/arch-x86_32.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/xen/include/public/arch-x86_32.h	Wed Apr 19 11:39:31 2006 -0500
@@ -29,6 +29,9 @@ DEFINE_GUEST_HANDLE(int);
 DEFINE_GUEST_HANDLE(int);
 DEFINE_GUEST_HANDLE(long);
 DEFINE_GUEST_HANDLE(void);
+
+typedef unsigned long frameno_t;
+DEFINE_GUEST_HANDLE(frameno_t);
 #endif
 
 /*
@@ -157,9 +160,9 @@ DEFINE_GUEST_HANDLE(vcpu_guest_context_t
 DEFINE_GUEST_HANDLE(vcpu_guest_context_t);
 
 typedef struct arch_shared_info {
-    unsigned long max_pfn;                  /* max pfn that appears in table */
+    frameno_t max_pfn;                  /* max pfn that appears in table */
     /* Frame containing list of mfns containing list of mfns containing p2m. */
-    unsigned long pfn_to_mfn_frame_list_list;
+    frameno_t pfn_to_mfn_frame_list_list;
     unsigned long nmi_reason;
 } arch_shared_info_t;
 
diff -r c4eead8a925b xen/include/public/arch-x86_64.h
--- a/xen/include/public/arch-x86_64.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/xen/include/public/arch-x86_64.h	Wed Apr 19 11:39:31 2006 -0500
@@ -29,6 +29,9 @@ DEFINE_GUEST_HANDLE(int);
 DEFINE_GUEST_HANDLE(int);
 DEFINE_GUEST_HANDLE(long);
 DEFINE_GUEST_HANDLE(void);
+
+typedef unsigned long frameno_t;
+DEFINE_GUEST_HANDLE(frameno_t);
 #endif
 
 /*
@@ -233,9 +236,9 @@ DEFINE_GUEST_HANDLE(vcpu_guest_context_t
 DEFINE_GUEST_HANDLE(vcpu_guest_context_t);
 
 typedef struct arch_shared_info {
-    unsigned long max_pfn;                  /* max pfn that appears in table */
+    frameno_t max_pfn;                  /* max pfn that appears in table */
     /* Frame containing list of mfns containing list of mfns containing p2m. */
-    unsigned long pfn_to_mfn_frame_list_list;
+    frameno_t pfn_to_mfn_frame_list_list;
     unsigned long nmi_reason;
 } arch_shared_info_t;
 
diff -r c4eead8a925b xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/xen/include/public/dom0_ops.h	Wed Apr 19 11:39:31 2006 -0500
@@ -28,7 +28,7 @@ typedef struct dom0_getmemlist {
     /* IN variables. */
     domid_t       domain;
     unsigned long max_pfns;
-    GUEST_HANDLE(ulong) buffer;
+    GUEST_HANDLE(frameno_t) buffer;
     /* OUT variables. */
     unsigned long num_pfns;
 } dom0_getmemlist_t;
@@ -468,7 +468,7 @@ DEFINE_GUEST_HANDLE(dom0_iomem_permissio
 #define DOM0_HYPERCALL_INIT   48
 typedef struct dom0_hypercall_init {
     domid_t  domain;          /* domain to be affected */
-    unsigned long mfn;        /* machine frame to be initialised */
+    frameno_t mfn;            /* machine frame to be initialised */
 } dom0_hypercall_init_t;
 DEFINE_GUEST_HANDLE(dom0_hypercall_init_t);
 
diff -r c4eead8a925b xen/include/public/memory.h
--- a/xen/include/public/memory.h	Sun Apr 16 15:41:31 2006 +0100
+++ b/xen/include/public/memory.h	Wed Apr 19 11:39:31 2006 -0500
@@ -29,7 +29,7 @@ typedef struct xen_memory_reservation {
      *   OUT: GMFN bases of extents that were allocated
      *   (NB. This command also updates the mach_to_phys translation table)
      */
-    GUEST_HANDLE(ulong) extent_start;
+    GUEST_HANDLE(frameno_t) extent_start;
 
     /* Number of extents, and size/alignment of each (2^extent_order pages). */
     unsigned long  nr_extents;

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-19 16:44     ` Hollis Blanchard
@ 2006-04-19 18:25       ` Keir Fraser
  2006-04-19 19:14         ` Joe Bonasera
                           ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Keir Fraser @ 2006-04-19 18:25 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: xen-devel, Joe Bonasera


On 19 Apr 2006, at 17:44, Hollis Blanchard wrote:

> "xen_frameno_t" then?

xen_pfn_t? Definitely won't conflict with anyone, and I prefer 'pfn' to 
'frameno' as it's more consistent with other names we have in the 
interface.

> Attached is the updated patch, with typos fixed and a couple other
> corrections. I've also added the type to arch-x86_64.h and arch-ia64.h,
> so I think the patch is ready to be applied.

What about the Linux kernel -- shouldn't that be changed too? At least 
where it handles arrays of longs passed to memory_op()?

Inside Xen, does shadow.h really need changing at all? Once entries are 
unpacked from an array by a hypercall they could just be passed round 
as longs, right?

Sorry about the to'ing-and-fro'ing but we need to make sure interface 
changes are complete and correct and this one is inevitably pretty 
far-reaching.

  -- Keir

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-19 18:25       ` Keir Fraser
@ 2006-04-19 19:14         ` Joe Bonasera
  2006-04-19 19:30         ` Hollis Blanchard
  2006-04-20 16:09         ` [patch] "frame number" size in hypercall ABI Hollis Blanchard
  2 siblings, 0 replies; 16+ messages in thread
From: Joe Bonasera @ 2006-04-19 19:14 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel, Hollis Blanchard

Keir Fraser wrote:
> 
> On 19 Apr 2006, at 17:44, Hollis Blanchard wrote:
> 
>> "xen_frameno_t" then?
> 
> 
> xen_pfn_t? Definitely won't conflict with anyone, and I prefer 'pfn' to 
> 'frameno' as it's more consistent with other names we have in the 
> interface.

why not xen_mfn_t? Is "p" here for "page" or "physical"? using
"m" makes it a bit more explicit.

> 
>> Attached is the updated patch, with typos fixed and a couple other
>> corrections. I've also added the type to arch-x86_64.h and arch-ia64.h,
>> so I think the patch is ready to be applied.
> 
> 
> What about the Linux kernel -- shouldn't that be changed too? At least 
> where it handles arrays of longs passed to memory_op()?
> 
> Inside Xen, does shadow.h really need changing at all? Once entries are 
> unpacked from an array by a hypercall they could just be passed round as 
> longs, right?
> 
> Sorry about the to'ing-and-fro'ing but we need to make sure interface 
> changes are complete and correct and this one is inevitably pretty 
> far-reaching.
> 
>   -- Keir
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-19 18:25       ` Keir Fraser
  2006-04-19 19:14         ` Joe Bonasera
@ 2006-04-19 19:30         ` Hollis Blanchard
  2006-04-19 20:11           ` Keir Fraser
  2006-04-20 16:09         ` [patch] "frame number" size in hypercall ABI Hollis Blanchard
  2 siblings, 1 reply; 16+ messages in thread
From: Hollis Blanchard @ 2006-04-19 19:30 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel, Joe Bonasera

On Wed, 2006-04-19 at 19:25 +0100, Keir Fraser wrote:
> On 19 Apr 2006, at 17:44, Hollis Blanchard wrote:
> 
> > "xen_frameno_t" then?
> 
> xen_pfn_t? Definitely won't conflict with anyone, and I prefer 'pfn' to 
> 'frameno' as it's more consistent with other names we have in the 
> interface.

Well technically the PFN list is actually a list of MFNs, right? I think
both PFNs and MFNs are passed across this interface... would you want
separate types for those?

> > Attached is the updated patch, with typos fixed and a couple other
> > corrections. I've also added the type to arch-x86_64.h and arch-ia64.h,
> > so I think the patch is ready to be applied.
> 
> What about the Linux kernel -- shouldn't that be changed too? At least 
> where it handles arrays of longs passed to memory_op()?

In theory yes. I've been trying to limit myself to changes that I
absolutely need. A typical ppc64 system has 32-bit userland, 64-bit
kernel, 64-bit hypervisor, so practically speaking the kernel doesn't
need to change.

> Inside Xen, does shadow.h really need changing at all? Once entries are 
> unpacked from an array by a hypercall they could just be passed round 
> as longs, right?

Right, it looks like that part of the patch is bogus. I removed the
shadow.h changes; I can resubmit, or I can wait to see if other issues
are found...

> Sorry about the to'ing-and-fro'ing but we need to make sure interface 
> changes are complete and correct and this one is inevitably pretty 
> far-reaching.

I agree.

-- 
Hollis Blanchard
IBM Linux Technology Center

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-19 19:30         ` Hollis Blanchard
@ 2006-04-19 20:11           ` Keir Fraser
  2006-04-20 18:13             ` Xen terminology wiki page Hollis Blanchard
  0 siblings, 1 reply; 16+ messages in thread
From: Keir Fraser @ 2006-04-19 20:11 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: xen-devel, Joe Bonasera


On 19 Apr 2006, at 20:30, Hollis Blanchard wrote:

>> xen_pfn_t? Definitely won't conflict with anyone, and I prefer 'pfn' 
>> to
>> 'frameno' as it's more consistent with other names we have in the
>> interface.
>
> Well technically the PFN list is actually a list of MFNs, right? I 
> think
> both PFNs and MFNs are passed across this interface... would you want
> separate types for those?

Ah, well I came up with a reasonably consistent naming scheme some time 
ago. It is commented in one of the interface header files I believe, 
and here it is again:
  MFN: machine frame number (real host machine address)
  GPFN: guest pseudo-physical frame number (the illusory contiguous phys 
addr space)
  GMFN: guest machine frame number (this is the special one -- it's 
==GPFN for an auto-translated guest, and ==MFN for normal 
paravirtualised guests). It represents what the guest *thinks* are 
MFNs.
  PFN: a catch-all for any kind of frame number. 'Physical' here can 
mean guest-physical, machine-physical or guest-machine-physical.

So, for us, 'pfn' is kind of a polymorphic name. What you are thinking 
of as 'pfn' we usually call 'gpfn'. This is just the most convenient 
way the naming turned out when I was looking to apply a consistent 
naming scheme across the hypervisor and its interfaces with least 
changes. :-)

>>> Attached is the updated patch, with typos fixed and a couple other
>>> corrections. I've also added the type to arch-x86_64.h and 
>>> arch-ia64.h,
>>> so I think the patch is ready to be applied.
>>
>> What about the Linux kernel -- shouldn't that be changed too? At least
>> where it handles arrays of longs passed to memory_op()?
>
> In theory yes. I've been trying to limit myself to changes that I
> absolutely need. A typical ppc64 system has 32-bit userland, 64-bit
> kernel, 64-bit hypervisor, so practically speaking the kernel doesn't
> need to change.

An interface change must be consistently applied. I'd rather have a 
bigger self-consistent patch than a small one that nibbles at the issue 
it is trying to solve.

  -- Keir

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-19 18:25       ` Keir Fraser
  2006-04-19 19:14         ` Joe Bonasera
  2006-04-19 19:30         ` Hollis Blanchard
@ 2006-04-20 16:09         ` Hollis Blanchard
  2006-04-20 16:18           ` Keir Fraser
  2 siblings, 1 reply; 16+ messages in thread
From: Hollis Blanchard @ 2006-04-20 16:09 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel, Joe Bonasera

On Wed, 2006-04-19 at 19:25 +0100, Keir Fraser wrote:
> On 19 Apr 2006, at 17:44, Hollis Blanchard wrote:
> 
> > Attached is the updated patch, with typos fixed and a couple other
> > corrections. I've also added the type to arch-x86_64.h and arch-ia64.h,
> > so I think the patch is ready to be applied.
> 
> What about the Linux kernel -- shouldn't that be changed too? At least 
> where it handles arrays of longs passed to memory_op()?
> 
> Inside Xen, does shadow.h really need changing at all? Once entries are 
> unpacked from an array by a hypercall they could just be passed round 
> as longs, right?
> 
> Sorry about the to'ing-and-fro'ing but we need to make sure interface 
> changes are complete and correct and this one is inevitably pretty 
> far-reaching.

So are you saying you want the patch to include Linux kernel changes?
But not Xen changes (e.g. shadow.h) other than right at the interface?

I needed to change all users in libxc because they all index into
page_array[] as unsigned long. Theoretically speaking you could have the
same problem within Linux and Xen as well. The word "unpacking" suggests
a conversion step, which is something I'm not introducing here.

-- 
Hollis Blanchard
IBM Linux Technology Center

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-20 16:09         ` [patch] "frame number" size in hypercall ABI Hollis Blanchard
@ 2006-04-20 16:18           ` Keir Fraser
  2006-04-20 21:15             ` Hollis Blanchard
  0 siblings, 1 reply; 16+ messages in thread
From: Keir Fraser @ 2006-04-20 16:18 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: xen-devel, Joe Bonasera


On 20 Apr 2006, at 17:09, Hollis Blanchard wrote:

> So are you saying you want the patch to include Linux kernel changes?
> But not Xen changes (e.g. shadow.h) other than right at the interface?

Yes, at least where Linux is handling arrays that will get passed to a 
hypercall or the array could end up the wrong size! Of course it really 
doesn't matter for singleton values so they can safely be left as-is.

The same goes for Xen too, but I believe the arrays are only handled in 
the very hypercall functions that receive them. For example, many 
functions in common/memory.c will need to read/write values to from a 
xen_pfn_t, but these singleton values can then be passed around inside 
Xen as longs.

> I needed to change all users in libxc because they all index into
> page_array[] as unsigned long. Theoretically speaking you could have 
> the
> same problem within Linux and Xen as well. The word "unpacking" 
> suggests
> a conversion step, which is something I'm not introducing here.

The arrays aren't passed around inside Xen (I'm pretty sure). As I say 
above, we read/write one-by-one.

  -- Keir

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Xen terminology wiki page
  2006-04-19 20:11           ` Keir Fraser
@ 2006-04-20 18:13             ` Hollis Blanchard
  2006-04-20 18:53               ` Keir Fraser
  0 siblings, 1 reply; 16+ messages in thread
From: Hollis Blanchard @ 2006-04-20 18:13 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel

On Wed, 2006-04-19 at 21:11 +0100, Keir Fraser wrote:
> 
> Ah, well I came up with a reasonably consistent naming scheme some time 
> ago. It is commented in one of the interface header files I believe, 
> and here it is again:
>   MFN: machine frame number (real host machine address)
>   GPFN: guest pseudo-physical frame number (the illusory contiguous phys 
> addr space)
>   GMFN: guest machine frame number (this is the special one -- it's 
> ==GPFN for an auto-translated guest, and ==MFN for normal 
> paravirtualised guests). It represents what the guest *thinks* are 
> MFNs.
>   PFN: a catch-all for any kind of frame number. 'Physical' here can 
> mean guest-physical, machine-physical or guest-machine-physical.

FYI, I've put this into a wiki page:
http://wiki.xensource.com/xenwiki/XenTerminology . The list should be
expanded to include HVM, SVM, VT(-x, -i), xenbus, xen store, ...

Probably the best approach would be a 1- or 2-line definition, followed
by a link to more details when available (other wiki pages, external web
pages, etc).

-- 
Hollis Blanchard
IBM Linux Technology Center

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Xen terminology wiki page
  2006-04-20 18:13             ` Xen terminology wiki page Hollis Blanchard
@ 2006-04-20 18:53               ` Keir Fraser
  0 siblings, 0 replies; 16+ messages in thread
From: Keir Fraser @ 2006-04-20 18:53 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: xen-devel


On 20 Apr 2006, at 19:13, Hollis Blanchard wrote:

> FYI, I've put this into a wiki page:
> http://wiki.xensource.com/xenwiki/XenTerminology . The list should be
> expanded to include HVM, SVM, VT(-x, -i), xenbus, xen store, ...
>
> Probably the best approach would be a 1- or 2-line definition, followed
> by a link to more details when available (other wiki pages, external 
> web
> pages, etc).

This looks like a neat idea.

  Thanks,
  Keir

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-20 16:18           ` Keir Fraser
@ 2006-04-20 21:15             ` Hollis Blanchard
  2006-04-20 22:35               ` Keir Fraser
  0 siblings, 1 reply; 16+ messages in thread
From: Hollis Blanchard @ 2006-04-20 21:15 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel

On Thu, 2006-04-20 at 17:18 +0100, Keir Fraser wrote:
> On 20 Apr 2006, at 17:09, Hollis Blanchard wrote:
> 
> > So are you saying you want the patch to include Linux kernel changes?
> > But not Xen changes (e.g. shadow.h) other than right at the interface?
> 
> Yes, at least where Linux is handling arrays that will get passed to a 
> hypercall or the array could end up the wrong size! Of course it really 
> doesn't matter for singleton values so they can safely be left as-is.
> 
> The same goes for Xen too, but I believe the arrays are only handled in 
> the very hypercall functions that receive them. For example, many 
> functions in common/memory.c will need to read/write values to from a 
> xen_pfn_t, but these singleton values can then be passed around inside 
> Xen as longs.

But those single values can't be passed around as longs in other areas,
such as libxc. In libxc there is usually a path of xc_get_pfn_list()
-> ... -> xc_map_foreign_page() (or whatever), and I need to make sure
that the PFNs don't get truncated to 32 bits anywhere along that path.

So I don't want to limit this patch to just *arrays* of PFNs. That means
it would have to encompass all "frame numbers" in the Xen interface,
including dom0_ops, memory_ops, start_info, shared_info... Is that a
logical split for you?

Are you waiting for this patch to be finalized before applying the
GET/SET_HANDLE patch?

-- 
Hollis Blanchard
IBM Linux Technology Center

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-20 21:15             ` Hollis Blanchard
@ 2006-04-20 22:35               ` Keir Fraser
  2006-04-24 16:43                 ` Hollis Blanchard
  0 siblings, 1 reply; 16+ messages in thread
From: Keir Fraser @ 2006-04-20 22:35 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: xen-devel


On 20 Apr 2006, at 22:15, Hollis Blanchard wrote:

> But those single values can't be passed around as longs in other areas,
> such as libxc. In libxc there is usually a path of xc_get_pfn_list()
> -> ... -> xc_map_foreign_page() (or whatever), and I need to make sure
> that the PFNs don't get truncated to 32 bits anywhere along that path.

Is 44 bits of machine address not enough on ppc? That's a pretty big 
address space, even if RAM is moderately sparse.

> So I don't want to limit this patch to just *arrays* of PFNs. That 
> means
> it would have to encompass all "frame numbers" in the Xen interface,
> including dom0_ops, memory_ops, start_info, shared_info... Is that a
> logical split for you?

It makes sense in the interface as you really care about the size there.

> Are you waiting for this patch to be finalized before applying the
> GET/SET_HANDLE patch?

You wanted to do the xen_pfn_t patch first. For the other, the names 
should be GET/SET_GUEST_HANDLE.

  -- Keir

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [patch] "frame number" size in hypercall ABI
  2006-04-20 22:35               ` Keir Fraser
@ 2006-04-24 16:43                 ` Hollis Blanchard
  0 siblings, 0 replies; 16+ messages in thread
From: Hollis Blanchard @ 2006-04-24 16:43 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel

On Thu, 2006-04-20 at 23:35 +0100, Keir Fraser wrote:
> 
> > Are you waiting for this patch to be finalized before applying the
> > GET/SET_HANDLE patch?
> 
> You wanted to do the xen_pfn_t patch first. For the other, the names 
> should be GET/SET_GUEST_HANDLE. 

I didn't actually; I'm submitting in parallel. :) I will resend that
patch with the rename.

-- 
Hollis Blanchard
IBM Linux Technology Center

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Re: [rfc] [patch] "frame number" size in hypercall ABI
  2006-04-19 15:05       ` Ewan Mellor
@ 2006-04-19 15:37         ` Hollis Blanchard
  0 siblings, 0 replies; 16+ messages in thread
From: Hollis Blanchard @ 2006-04-19 15:37 UTC (permalink / raw)
  To: Ewan Mellor; +Cc: xen-devel

On Apr 19, 2006, at 10:05 AM, Ewan Mellor wrote:

> On Wed, Apr 19, 2006 at 09:08:49AM -0500, Hollis Blanchard wrote:
>
>> (If we require a 64-bit libxc in this case, that will also require a
>> 64-bit python, and 64-bit versions of all the python modules. No
>> distribution, other than maybe Gentoo, currently does this, and it
>> would be a big PITA for them to do so.)
>
> Silence your heretic anti-Debian libels!  ;-)  Comparing them to 
> Gentoo,
> indeed...
>
> There is a Debian AMD64 / EM64T port, which will become official with 
> the next
> release (insert compulsory "some time in 2010" joke here).

Sorry for being unclear; I'm not talking about x86-64. AFAIK it is 
always a performance win to use 64-bit binaries on x86-64 because 
32-bit x86 is so bad.

This is not at all the case with 64-bit PowerPC: it is usually a 
performance loss to simply recompile 32-bit binaries as 64-bit. 
Accordingly, only some initially misguided PowerPC distributions are 
100% 64-bit.

-- 
Hollis Blanchard
IBM Linux Technology Center

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Re: [rfc] [patch] "frame number" size in hypercall ABI
  2006-04-19 14:08     ` Hollis Blanchard
@ 2006-04-19 15:05       ` Ewan Mellor
  2006-04-19 15:37         ` Hollis Blanchard
  0 siblings, 1 reply; 16+ messages in thread
From: Ewan Mellor @ 2006-04-19 15:05 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: xen-devel

On Wed, Apr 19, 2006 at 09:08:49AM -0500, Hollis Blanchard wrote:

> (If we require a 64-bit libxc in this case, that will also require a 
> 64-bit python, and 64-bit versions of all the python modules. No 
> distribution, other than maybe Gentoo, currently does this, and it 
> would be a big PITA for them to do so.)

Silence your heretic anti-Debian libels!  ;-)  Comparing them to Gentoo,
indeed...

There is a Debian AMD64 / EM64T port, which will become official with the next
release (insert compulsory "some time in 2010" joke here).

Ewan.

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2006-04-24 16:43 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <E1FWBAp-0008KG-7d@host-192-168-0-1-bcn-london>
2006-04-19 15:32 ` [rfc] [patch] "frame number" size in hypercall ABI Joe Bonasera
2006-04-19 15:43   ` Keir Fraser
2006-04-19 16:44     ` Hollis Blanchard
2006-04-19 18:25       ` Keir Fraser
2006-04-19 19:14         ` Joe Bonasera
2006-04-19 19:30         ` Hollis Blanchard
2006-04-19 20:11           ` Keir Fraser
2006-04-20 18:13             ` Xen terminology wiki page Hollis Blanchard
2006-04-20 18:53               ` Keir Fraser
2006-04-20 16:09         ` [patch] "frame number" size in hypercall ABI Hollis Blanchard
2006-04-20 16:18           ` Keir Fraser
2006-04-20 21:15             ` Hollis Blanchard
2006-04-20 22:35               ` Keir Fraser
2006-04-24 16:43                 ` Hollis Blanchard
2006-04-15  8:57 [rfc] " Keir Fraser
2006-04-18 19:17 ` [rfc] [patch] " Hollis Blanchard
2006-04-19  7:24   ` Keir Fraser
2006-04-19 14:08     ` Hollis Blanchard
2006-04-19 15:05       ` Ewan Mellor
2006-04-19 15:37         ` Hollis Blanchard

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.