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-changelog

[Xen-changelog] [linux-2.6.18-xen] merge with linux-2.6.18-xen.hg

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [linux-2.6.18-xen] merge with linux-2.6.18-xen.hg
From: "Xen patchbot-linux-2.6.18-xen" <patchbot-linux-2.6.18-xen@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 20 May 2008 08:30:46 -0700
Delivery-date: Tue, 20 May 2008 08:32:29 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1208279427 21600
# Node ID ae505684a995b9aa366fffc4d78cebfdf0552ddc
# Parent  dbe8a35dcaf7c12b816e358c596f7fcc9b926e77
# Parent  7f8b544237bf70b05d0ac2b2ee9d537b6fa50100
merge with linux-2.6.18-xen.hg
---
 arch/i386/kernel/acpi/sleep-xen.c       |   21 -------------
 arch/i386/kernel/sysenter.c             |   12 ++++---
 arch/powerpc/kernel/vdso.c              |    7 ++++
 arch/x86_64/ia32/ia32_binfmt.c          |   49 --------------------------------
 arch/x86_64/ia32/syscall32.c            |    7 ++++
 arch/x86_64/kernel/acpi/sleep-xen.c     |   21 -------------
 drivers/acpi/hardware/hwsleep.c         |   21 ++++++++-----
 drivers/char/mem.c                      |   10 ++++++
 drivers/pci/quirks.c                    |   14 ++++++++-
 drivers/xen/balloon/balloon.c           |   37 +++++++++++++++++++++++-
 drivers/xen/blkback/common.h            |    2 -
 drivers/xen/blkback/vbd.c               |    4 +-
 drivers/xen/blkback/xenbus.c            |   10 +++++-
 drivers/xen/blktap/blktap.c             |    2 -
 drivers/xen/evtchn/evtchn.c             |    2 +
 drivers/xen/gntdev/gntdev.c             |    2 -
 drivers/xen/netfront/netfront.c         |   38 ++++++++++++++++++------
 drivers/xen/xenbus/xenbus_probe.c       |    3 +
 fs/binfmt_elf.c                         |    4 ++
 fs/compat_ioctl.c                       |    2 +
 include/asm-i386/acpi.h                 |   28 +++++++++++++++---
 include/asm-i386/elf.h                  |   44 ----------------------------
 include/asm-i386/mach-xen/asm/pgtable.h |    4 +-
 include/asm-x86_64/acpi.h               |   29 +++++++++++++++---
 include/linux/mm.h                      |    1 
 25 files changed, 197 insertions(+), 177 deletions(-)

diff -r dbe8a35dcaf7 -r ae505684a995 arch/i386/kernel/acpi/sleep-xen.c
--- a/arch/i386/kernel/acpi/sleep-xen.c Mon Apr 14 13:29:37 2008 -0600
+++ b/arch/i386/kernel/acpi/sleep-xen.c Tue Apr 15 11:10:27 2008 -0600
@@ -110,25 +110,4 @@ static int __init acpisleep_dmi_init(voi
 }
 
 core_initcall(acpisleep_dmi_init);
-
-#else /* CONFIG_ACPI_PV_SLEEP */
-#include <asm/hypervisor.h>
-#include <xen/interface/platform.h>
-int acpi_notify_hypervisor_state(u8 sleep_state,
-       u32 pm1a_cnt, u32 pm1b_cnt)
-{
-       struct xen_platform_op op = {
-               .cmd = XENPF_enter_acpi_sleep,
-               .interface_version = XENPF_INTERFACE_VERSION,
-               .u = {
-                       .enter_acpi_sleep = {
-                               .pm1a_cnt_val = (u16)pm1a_cnt,
-                               .pm1b_cnt_val = (u16)pm1b_cnt,
-                               .sleep_state = sleep_state,
-                       },
-               },
-       };
-
-       return HYPERVISOR_platform_op(&op);
-}
 #endif /* CONFIG_ACPI_PV_SLEEP */
diff -r dbe8a35dcaf7 -r ae505684a995 arch/i386/kernel/sysenter.c
--- a/arch/i386/kernel/sysenter.c       Mon Apr 14 13:29:37 2008 -0600
+++ b/arch/i386/kernel/sysenter.c       Tue Apr 15 11:10:27 2008 -0600
@@ -109,11 +109,6 @@ int __init sysenter_setup(void)
 #ifdef CONFIG_COMPAT_VDSO
        __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
        printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO));
-#else
-       /*
-        * In the non-compat case the ELF coredumping code needs the fixmap:
-        */
-       __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_KERNEL_RO);
 #endif
 
        if (!boot_cpu_has(X86_FEATURE_SEP)) {
@@ -176,6 +171,13 @@ int arch_setup_additional_pages(struct l
        vma->vm_end = addr + PAGE_SIZE;
        /* MAYWRITE to allow gdb to COW and set breakpoints */
        vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
+       /*
+        * Make sure the vDSO gets into every core dump.
+        * Dumping its contents makes post-mortem fully interpretable later
+        * without matching up the same kernel and hardware config to see
+        * what PC values meant.
+        */
+       vma->vm_flags |= VM_ALWAYSDUMP;
        vma->vm_flags |= mm->def_flags;
        vma->vm_page_prot = protection_map[vma->vm_flags & 7];
        vma->vm_ops = &syscall_vm_ops;
diff -r dbe8a35dcaf7 -r ae505684a995 arch/powerpc/kernel/vdso.c
--- a/arch/powerpc/kernel/vdso.c        Mon Apr 14 13:29:37 2008 -0600
+++ b/arch/powerpc/kernel/vdso.c        Tue Apr 15 11:10:27 2008 -0600
@@ -282,6 +282,13 @@ int arch_setup_additional_pages(struct l
         * pages though
         */
        vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC;
+       /*
+        * Make sure the vDSO gets into every core dump.
+        * Dumping its contents makes post-mortem fully interpretable later
+        * without matching up the same kernel and hardware config to see
+        * what PC values meant.
+        */
+       vma->vm_flags |= VM_ALWAYSDUMP;
        vma->vm_flags |= mm->def_flags;
        vma->vm_page_prot = protection_map[vma->vm_flags & 0x7];
        vma->vm_ops = &vdso_vmops;
diff -r dbe8a35dcaf7 -r ae505684a995 arch/x86_64/ia32/ia32_binfmt.c
--- a/arch/x86_64/ia32/ia32_binfmt.c    Mon Apr 14 13:29:37 2008 -0600
+++ b/arch/x86_64/ia32/ia32_binfmt.c    Tue Apr 15 11:10:27 2008 -0600
@@ -64,55 +64,6 @@ typedef unsigned int elf_greg_t;
 
 #define ELF_NGREG (sizeof (struct user_regs_struct32) / sizeof(elf_greg_t))
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
-
-/*
- * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out
- * extra segments containing the vsyscall DSO contents.  Dumping its
- * contents makes post-mortem fully interpretable later without matching up
- * the same kernel and hardware config to see what PC values meant.
- * Dumping its extra ELF program headers includes all the other information
- * a debugger needs to easily find how the vsyscall DSO was being used.
- */
-#define ELF_CORE_EXTRA_PHDRS   (find_vma(current->mm, VSYSCALL32_BASE) ?     \
-    (VSYSCALL32_EHDR->e_phnum) : 0)
-#define ELF_CORE_WRITE_EXTRA_PHDRS                                           \
-do {                                                                         \
-       if (find_vma(current->mm, VSYSCALL32_BASE)) {                         \
-               const struct elf32_phdr *const vsyscall_phdrs =               \
-                       (const struct elf32_phdr *) (VSYSCALL32_BASE          \
-                                                  + VSYSCALL32_EHDR->e_phoff);\
-               int i;                                                        \
-               Elf32_Off ofs = 0;                                            \
-               for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) {              \
-                       struct elf32_phdr phdr = vsyscall_phdrs[i];           \
-                       if (phdr.p_type == PT_LOAD) {                         \
-                               BUG_ON(ofs != 0);                             \
-                               ofs = phdr.p_offset = offset;                 \
-                               phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz);      \
-                               phdr.p_filesz = phdr.p_memsz;                 \
-                               offset += phdr.p_filesz;                      \
-                       }                                                     \
-                       else                                                  \
-                               phdr.p_offset += ofs;                         \
-                       phdr.p_paddr = 0; /* match other core phdrs */        \
-                       DUMP_WRITE(&phdr, sizeof(phdr));                      \
-               }                                                             \
-       }                                                                     \
-} while (0)
-#define ELF_CORE_WRITE_EXTRA_DATA                                            \
-do {                                                                         \
-       if (find_vma(current->mm, VSYSCALL32_BASE)) {                         \
-               const struct elf32_phdr *const vsyscall_phdrs =               \
-                       (const struct elf32_phdr *) (VSYSCALL32_BASE          \
-                                                  + VSYSCALL32_EHDR->e_phoff); 
     \
-               int i;                                                        \
-               for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) {              \
-                       if (vsyscall_phdrs[i].p_type == PT_LOAD)              \
-                               DUMP_WRITE((void *) (u64) 
vsyscall_phdrs[i].p_vaddr,\
-                                   PAGE_ALIGN(vsyscall_phdrs[i].p_memsz));   \
-               }                                                             \
-       }                                                                     \
-} while (0)
 
 struct elf_siginfo
 {
diff -r dbe8a35dcaf7 -r ae505684a995 arch/x86_64/ia32/syscall32.c
--- a/arch/x86_64/ia32/syscall32.c      Mon Apr 14 13:29:37 2008 -0600
+++ b/arch/x86_64/ia32/syscall32.c      Tue Apr 15 11:10:27 2008 -0600
@@ -59,6 +59,13 @@ int syscall32_setup_pages(struct linux_b
        vma->vm_end = VSYSCALL32_END;
        /* MAYWRITE to allow gdb to COW and set breakpoints */
        vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
+       /*
+        * Make sure the vDSO gets into every core dump.
+        * Dumping its contents makes post-mortem fully interpretable later
+        * without matching up the same kernel and hardware config to see
+        * what PC values meant.
+        */
+       vma->vm_flags |= VM_ALWAYSDUMP;
        vma->vm_flags |= mm->def_flags;
        vma->vm_page_prot = protection_map[vma->vm_flags & 7];
        vma->vm_ops = &syscall32_vm_ops;
diff -r dbe8a35dcaf7 -r ae505684a995 arch/x86_64/kernel/acpi/sleep-xen.c
--- a/arch/x86_64/kernel/acpi/sleep-xen.c       Mon Apr 14 13:29:37 2008 -0600
+++ b/arch/x86_64/kernel/acpi/sleep-xen.c       Tue Apr 15 11:10:27 2008 -0600
@@ -137,27 +137,6 @@ static int __init acpi_sleep_setup(char 
 }
 
 __setup("acpi_sleep=", acpi_sleep_setup);
-
-#else /* CONFIG_ACPI_PV_SLEEP */
-#include <asm/hypervisor.h>
-#include <xen/interface/platform.h>
-int acpi_notify_hypervisor_state(u8 sleep_state,
-       u32 pm1a_cnt, u32 pm1b_cnt)
-{
-       struct xen_platform_op op = {
-               .cmd = XENPF_enter_acpi_sleep,
-               .interface_version = XENPF_INTERFACE_VERSION,
-               .u = {
-                       .enter_acpi_sleep = {
-                               .pm1a_cnt_val = (u16)pm1a_cnt,
-                               .pm1b_cnt_val = (u16)pm1b_cnt,
-                               .sleep_state = sleep_state,
-                       },
-               },
-       };
-
-       return HYPERVISOR_platform_op(&op);
-}
 #endif                         /* CONFIG_ACPI_PV_SLEEP */
 
 #endif                         /*CONFIG_ACPI_SLEEP */
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/acpi/hardware/hwsleep.c
--- a/drivers/acpi/hardware/hwsleep.c   Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/acpi/hardware/hwsleep.c   Tue Apr 15 11:10:27 2008 -0600
@@ -227,7 +227,11 @@ acpi_status asmlinkage acpi_enter_sleep_
        u32 PM1Bcontrol;
        struct acpi_bit_register_info *sleep_type_reg_info;
        struct acpi_bit_register_info *sleep_enable_reg_info;
+#if !(defined(CONFIG_XEN) && defined(CONFIG_X86))
        u32 in_value;
+#else
+       int err;
+#endif
        acpi_status status;
 
        ACPI_FUNCTION_TRACE(acpi_enter_sleep_state);
@@ -327,7 +331,7 @@ acpi_status asmlinkage acpi_enter_sleep_
 
        ACPI_FLUSH_CPU_CACHE();
 
-#ifndef CONFIG_ACPI_PV_SLEEP
+#if !(defined(CONFIG_XEN) && defined(CONFIG_X86))
        status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
                                        ACPI_REGISTER_PM1A_CONTROL,
                                        PM1Acontrol);
@@ -377,17 +381,18 @@ acpi_status asmlinkage acpi_enter_sleep_
                /* Spin until we wake */
 
        } while (!in_value);
-
-       return_ACPI_STATUS(AE_OK);
 #else
        /* PV ACPI just need check hypercall return value */
-       status = acpi_notify_hypervisor_state(sleep_state,
+       err = acpi_notify_hypervisor_state(sleep_state,
                        PM1Acontrol, PM1Bcontrol);
-       if (ACPI_FAILURE(status))
-               return_ACPI_STATUS(status);
-       else
-               return_ACPI_STATUS(AE_OK);
+       if (err) {
+               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+                                 "Hypervisor failure [%d]\n", err));
+               return_ACPI_STATUS(AE_ERROR);
+       }
 #endif
+
+       return_ACPI_STATUS(AE_OK);
 }
 
 ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state)
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/char/mem.c
--- a/drivers/char/mem.c        Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/char/mem.c        Tue Apr 15 11:10:27 2008 -0600
@@ -264,6 +264,9 @@ static int mmap_kmem(struct file * file,
 static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
 {
        unsigned long pfn;
+#ifdef CONFIG_XEN
+       unsigned long i, count;
+#endif
 
        /* Turn a kernel-virtual address into a physical page frame */
        pfn = __pa((u64)vma->vm_pgoff << PAGE_SHIFT) >> PAGE_SHIFT;
@@ -277,6 +280,13 @@ static int mmap_kmem(struct file * file,
         */
        if (!pfn_valid(pfn))
                return -EIO;
+
+#ifdef CONFIG_XEN
+       count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
+       for (i = 0; i < count; i++)
+               if ((pfn + i) != mfn_to_local_pfn(pfn_to_mfn(pfn + i)))
+                       return -EIO;
+#endif
 
        vma->vm_pgoff = pfn;
        return mmap_mem(file, vma);
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/pci/quirks.c
--- a/drivers/pci/quirks.c      Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/pci/quirks.c      Tue Apr 15 11:10:27 2008 -0600
@@ -1528,10 +1528,11 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_N
 
 static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
 {
-       u16 command;
+       u16 command, pmcsr;
        u32 bar;
        u8 __iomem *csr;
        u8 cmd_hi;
+       int pm;
 
        switch (dev->device) {
        /* PCI IDs taken from drivers/net/e100.c */
@@ -1566,6 +1567,17 @@ static void __devinit quirk_e100_interru
        if (!(command & PCI_COMMAND_MEMORY) || !bar)
                return;
 
+        /*
+         * Check that the device is in the D0 power state. If it's not,
+         * there is no point to look any further.
+         */
+        pm = pci_find_capability(dev, PCI_CAP_ID_PM);
+        if (pm) {
+                pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
+                if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0)
+                        return;
+        }
+
        csr = ioremap(bar, 8);
        if (!csr) {
                printk(KERN_WARNING "PCI: Can't map %s e100 registers\n",
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/balloon/balloon.c
--- a/drivers/xen/balloon/balloon.c     Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/balloon/balloon.c     Tue Apr 15 11:10:27 2008 -0600
@@ -194,6 +194,41 @@ static unsigned long current_target(void
        return target;
 }
 
+static unsigned long minimum_target(void)
+{
+#ifndef CONFIG_XEN
+       return 0;
+#else
+       unsigned long min_pages, curr_pages = current_target();
+
+#define MB2PAGES(mb) ((mb) << (20 - PAGE_SHIFT))
+       /* Simple continuous piecewiese linear function:
+        *  max MiB -> min MiB  gradient
+        *       0         0
+        *      16        16
+        *      32        24
+        *     128        72    (1/2)
+        *     512       168    (1/4)
+        *    2048       360    (1/8)
+        *    8192       552    (1/32)
+        *   32768      1320
+        *  131072      4392
+        */
+       if (max_pfn < MB2PAGES(128))
+               min_pages = MB2PAGES(8) + (max_pfn >> 1);
+       else if (max_pfn < MB2PAGES(512))
+               min_pages = MB2PAGES(40) + (max_pfn >> 2);
+       else if (max_pfn < MB2PAGES(2048))
+               min_pages = MB2PAGES(104) + (max_pfn >> 3);
+       else
+               min_pages = MB2PAGES(296) + (max_pfn >> 5);
+#undef MB2PAGES
+
+       /* Don't enforce growth */
+       return min(min_pages, curr_pages);
+#endif
+}
+
 static int increase_reservation(unsigned long nr_pages)
 {
        unsigned long  pfn, i, flags;
@@ -384,7 +419,7 @@ void balloon_set_new_target(unsigned lon
 {
        /* No need for lock. Not read-modify-write updates. */
        bs.hard_limit   = ~0UL;
-       bs.target_pages = target;
+       bs.target_pages = max(target, minimum_target());
        schedule_work(&balloon_worker);
 }
 
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/blkback/common.h
--- a/drivers/xen/blkback/common.h      Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/blkback/common.h      Tue Apr 15 11:10:27 2008 -0600
@@ -110,7 +110,7 @@ int blkif_map(blkif_t *blkif, unsigned l
 
 /* Create a vbd. */
 int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, unsigned major,
-              unsigned minor, int readonly);
+              unsigned minor, int readonly, int cdrom);
 void vbd_free(struct vbd *vbd);
 
 unsigned long long vbd_size(struct vbd *vbd);
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/blkback/vbd.c
--- a/drivers/xen/blkback/vbd.c Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/blkback/vbd.c Tue Apr 15 11:10:27 2008 -0600
@@ -51,7 +51,7 @@ unsigned long vbd_secsize(struct vbd *vb
 }
 
 int vbd_create(blkif_t *blkif, blkif_vdev_t handle, unsigned major,
-              unsigned minor, int readonly)
+              unsigned minor, int readonly, int cdrom)
 {
        struct vbd *vbd;
        struct block_device *bdev;
@@ -81,7 +81,7 @@ int vbd_create(blkif_t *blkif, blkif_vde
                return -ENOENT;
        }
 
-       if (vbd->bdev->bd_disk->flags & GENHD_FL_CD)
+       if (vbd->bdev->bd_disk->flags & GENHD_FL_CD || cdrom)
                vbd->type |= VDISK_CDROM;
        if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE)
                vbd->type |= VDISK_REMOVABLE;
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/blkback/xenbus.c
--- a/drivers/xen/blkback/xenbus.c      Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/blkback/xenbus.c      Tue Apr 15 11:10:27 2008 -0600
@@ -270,6 +270,8 @@ static void backend_changed(struct xenbu
        struct backend_info *be
                = container_of(watch, struct backend_info, backend_watch);
        struct xenbus_device *dev = be->dev;
+       int cdrom = 0;
+       char *device_type;
 
        DPRINTK("");
 
@@ -303,6 +305,12 @@ static void backend_changed(struct xenbu
                return;
        }
 
+       device_type = xenbus_read(XBT_NIL, dev->otherend, "device-type", NULL);
+       if (!IS_ERR(device_type)) {
+               cdrom = strcmp(device_type, "cdrom") == 0;
+               kfree(device_type);
+       }
+
        if (be->major == 0 && be->minor == 0) {
                /* Front end dir is a number, which is used as the handle. */
 
@@ -313,7 +321,7 @@ static void backend_changed(struct xenbu
                be->minor = minor;
 
                err = vbd_create(be->blkif, handle, major, minor,
-                                (NULL == strchr(be->mode, 'w')));
+                                (NULL == strchr(be->mode, 'w')), cdrom);
                if (err) {
                        be->major = be->minor = 0;
                        xenbus_dev_fatal(dev, err, "creating vbd structure");
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/blktap/blktap.c
--- a/drivers/xen/blktap/blktap.c       Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/blktap/blktap.c       Tue Apr 15 11:10:27 2008 -0600
@@ -684,7 +684,7 @@ static int blktap_mmap(struct file *filp
 
        /* Mark this VM as containing foreign pages, and set up mappings. */
        map = kzalloc(((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)
-                     * sizeof(struct page_struct*),
+                     * sizeof(struct page *),
                      GFP_KERNEL);
        if (map == NULL) {
                WPRINTK("Couldn't alloc VM_FOREIGN map.\n");
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/evtchn/evtchn.c
--- a/drivers/xen/evtchn/evtchn.c       Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/evtchn/evtchn.c       Tue Apr 15 11:10:27 2008 -0600
@@ -349,6 +349,7 @@ static long evtchn_ioctl(struct file *fi
 
                port_user[unbind.port] = NULL;
                mask_evtchn(unbind.port);
+               rebind_evtchn_to_cpu(unbind.port, 0);
 
                spin_unlock_irq(&port_user_lock);
 
@@ -458,6 +459,7 @@ static int evtchn_release(struct inode *
 
                port_user[i] = NULL;
                mask_evtchn(i);
+               rebind_evtchn_to_cpu(i, 0);
 
                close.port = i;
                ret = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/gntdev/gntdev.c
--- a/drivers/xen/gntdev/gntdev.c       Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/gntdev/gntdev.c       Tue Apr 15 11:10:27 2008 -0600
@@ -555,7 +555,7 @@ static int gntdev_mmap (struct file *fli
     
        /* The VM area contains pages from another VM. */
        vma->vm_flags |= VM_FOREIGN;
-       vma->vm_private_data = kzalloc(size * sizeof(struct page_struct *), 
+       vma->vm_private_data = kzalloc(size * sizeof(struct page *),
                                       GFP_KERNEL);
        if (vma->vm_private_data == NULL) {
                printk(KERN_ERR "Couldn't allocate mapping structure for VM "
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/netfront/netfront.c
--- a/drivers/xen/netfront/netfront.c   Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/netfront/netfront.c   Tue Apr 15 11:10:27 2008 -0600
@@ -366,10 +366,14 @@ static int talk_to_backend(struct xenbus
        struct xenbus_transaction xbt;
        int err;
 
-       err = xen_net_read_mac(dev, info->mac);
-       if (err) {
-               xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename);
-               goto out;
+       /* Read mac only in the first setup. */
+       if (!is_valid_ether_addr(info->mac)) {
+               err = xen_net_read_mac(dev, info->mac);
+               if (err) {
+                       xenbus_dev_fatal(dev, err, "parsing %s/mac",
+                                        dev->nodename);
+                       goto out;
+               }
        }
 
        /* Create shared ring, alloc event channel. */
@@ -1027,6 +1031,7 @@ static int network_start_xmit(struct sk_
 
        np->stats.tx_bytes += skb->len;
        np->stats.tx_packets++;
+       dev->trans_start = jiffies;
 
        /* Note: It is not safe to access skb after network_tx_buf_gc()! */
        network_tx_buf_gc(dev);
@@ -1059,6 +1064,7 @@ static irqreturn_t netif_int(int irq, vo
                        netfront_accelerator_call_stop_napi_irq(np, dev);
 
                        netif_rx_schedule(dev);
+                       dev->last_rx = jiffies;
                }
        }
 
@@ -1688,6 +1694,23 @@ static struct net_device_stats *network_
        return &np->stats;
 }
 
+static int xennet_set_mac_address(struct net_device *dev, void *p)
+{
+       struct netfront_info *np = netdev_priv(dev);
+       struct sockaddr *addr = p;
+
+       if (netif_running(dev))
+               return -EBUSY;
+
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EADDRNOTAVAIL;
+
+       memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+       memcpy(np->mac, addr->sa_data, ETH_ALEN);
+
+       return 0;
+}
+
 static int xennet_change_mtu(struct net_device *dev, int mtu)
 {
        int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
@@ -2075,6 +2098,7 @@ static struct net_device * __devinit cre
        netdev->poll            = netif_poll;
        netdev->set_multicast_list = network_set_multicast_list;
        netdev->uninit          = netif_uninit;
+       netdev->set_mac_address = xennet_set_mac_address;
        netdev->change_mtu      = xennet_change_mtu;
        netdev->weight          = 64;
        netdev->features        = NETIF_F_IP_CSUM;
@@ -2189,9 +2213,6 @@ static int __init netif_init(void)
                MODPARM_rx_flip = 1; /* Default is to flip. */
 #endif
 
-       if (is_initial_xendomain())
-               return 0;
-
        netif_init_accel();
 
        IPRINTK("Initialising virtual ethernet driver.\n");
@@ -2207,9 +2228,6 @@ module_init(netif_init);
 
 static void __exit netif_exit(void)
 {
-       if (is_initial_xendomain())
-               return;
-
 #ifdef CONFIG_INET
        unregister_inetaddr_notifier(&notifier_inetdev);
 #endif
diff -r dbe8a35dcaf7 -r ae505684a995 drivers/xen/xenbus/xenbus_probe.c
--- a/drivers/xen/xenbus/xenbus_probe.c Mon Apr 14 13:29:37 2008 -0600
+++ b/drivers/xen/xenbus/xenbus_probe.c Tue Apr 15 11:10:27 2008 -0600
@@ -347,6 +347,9 @@ static void xenbus_dev_shutdown(struct d
 
        DPRINTK("%s", dev->nodename);
 
+       if (is_initial_xendomain())
+               return;
+
        get_device(&dev->dev);
        if (dev->state != XenbusStateConnected) {
                printk("%s: %s: %s != Connected, skipping\n", __FUNCTION__,
diff -r dbe8a35dcaf7 -r ae505684a995 fs/binfmt_elf.c
--- a/fs/binfmt_elf.c   Mon Apr 14 13:29:37 2008 -0600
+++ b/fs/binfmt_elf.c   Tue Apr 15 11:10:27 2008 -0600
@@ -1170,6 +1170,10 @@ static int dump_seek(struct file *file, 
  */
 static int maydump(struct vm_area_struct *vma)
 {
+       /* The vma can be set up to tell us the answer directly.  */
+       if (vma->vm_flags & VM_ALWAYSDUMP)
+               return 1;
+
        /* Do not dump I/O mapped devices or special mappings */
        if (vma->vm_flags & (VM_IO | VM_RESERVED))
                return 0;
diff -r dbe8a35dcaf7 -r ae505684a995 fs/compat_ioctl.c
--- a/fs/compat_ioctl.c Mon Apr 14 13:29:37 2008 -0600
+++ b/fs/compat_ioctl.c Tue Apr 15 11:10:27 2008 -0600
@@ -124,10 +124,12 @@
 #include <linux/dvb/video.h>
 #include <linux/lp.h>
 
+#ifdef CONFIG_XEN
 #include <xen/interface/xen.h>
 #include <xen/public/evtchn.h>
 #include <xen/public/privcmd.h>
 #include <xen/compat_ioctl.h>
+#endif
 
 /* Aiee. Someone does not find a difference between int and long */
 #define EXT2_IOC32_GETFLAGS               _IOR('f', 1, int)
diff -r dbe8a35dcaf7 -r ae505684a995 include/asm-i386/acpi.h
--- a/include/asm-i386/acpi.h   Mon Apr 14 13:29:37 2008 -0600
+++ b/include/asm-i386/acpi.h   Tue Apr 15 11:10:27 2008 -0600
@@ -31,6 +31,9 @@
 #include <acpi/pdc_intel.h>
 
 #include <asm/system.h>                /* defines cmpxchg */
+#ifdef CONFIG_XEN
+#include <xen/interface/platform.h>
+#endif
 
 #define COMPILER_DEPENDENT_INT64   long long
 #define COMPILER_DEPENDENT_UINT64  unsigned long long
@@ -156,6 +159,27 @@ static inline void acpi_disable_pci(void
 }
 extern int acpi_irq_balance_set(char *str);
 
+#ifdef CONFIG_XEN
+static inline int acpi_notify_hypervisor_state(u8 sleep_state,
+                                              u32 pm1a_cnt_val,
+                                              u32 pm1b_cnt_val)
+{
+       struct xen_platform_op op = {
+               .cmd = XENPF_enter_acpi_sleep,
+               .interface_version = XENPF_INTERFACE_VERSION,
+               .u = {
+                       .enter_acpi_sleep = {
+                               .pm1a_cnt_val = pm1a_cnt_val,
+                               .pm1b_cnt_val = pm1b_cnt_val,
+                               .sleep_state = sleep_state,
+                       },
+               },
+       };
+
+       return HYPERVISOR_platform_op(&op);
+}
+#endif /* CONFIG_XEN */
+
 #else  /* !CONFIG_ACPI */
 
 #define acpi_lapic 0
@@ -177,10 +201,6 @@ extern unsigned long acpi_wakeup_address
 /* early initialization routine */
 extern void acpi_reserve_bootmem(void);
 
-#ifdef CONFIG_ACPI_PV_SLEEP
-extern int acpi_notify_hypervisor_state(u8 sleep_state,
-       u32 pm1a_cnt, u32 pm1b_cnt);
-#endif /* CONFIG_ACPI_PV_SLEEP */
 #endif /*CONFIG_ACPI_SLEEP*/
 
 extern u8 x86_acpiid_to_apicid[];
diff -r dbe8a35dcaf7 -r ae505684a995 include/asm-i386/elf.h
--- a/include/asm-i386/elf.h    Mon Apr 14 13:29:37 2008 -0600
+++ b/include/asm-i386/elf.h    Tue Apr 15 11:10:27 2008 -0600
@@ -169,50 +169,6 @@ do if (vdso_enabled) {                                     
        \
                NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_COMPAT_BASE); \
 } while (0)
 
-/*
- * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out
- * extra segments containing the vsyscall DSO contents.  Dumping its
- * contents makes post-mortem fully interpretable later without matching up
- * the same kernel and hardware config to see what PC values meant.
- * Dumping its extra ELF program headers includes all the other information
- * a debugger needs to easily find how the vsyscall DSO was being used.
- */
-#define ELF_CORE_EXTRA_PHDRS           (VDSO_HIGH_EHDR->e_phnum)
-#define ELF_CORE_WRITE_EXTRA_PHDRS                                           \
-do {                                                                         \
-       const struct elf_phdr *const vsyscall_phdrs =                         \
-               (const struct elf_phdr *) (VDSO_HIGH_BASE                     \
-                                          + VDSO_HIGH_EHDR->e_phoff);    \
-       int i;                                                                \
-       Elf32_Off ofs = 0;                                                    \
-       for (i = 0; i < VDSO_HIGH_EHDR->e_phnum; ++i) {               \
-               struct elf_phdr phdr = vsyscall_phdrs[i];                     \
-               if (phdr.p_type == PT_LOAD) {                                 \
-                       BUG_ON(ofs != 0);                                     \
-                       ofs = phdr.p_offset = offset;                         \
-                       phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz);              \
-                       phdr.p_filesz = phdr.p_memsz;                         \
-                       offset += phdr.p_filesz;                              \
-               }                                                             \
-               else                                                          \
-                       phdr.p_offset += ofs;                                 \
-               phdr.p_paddr = 0; /* match other core phdrs */                \
-               DUMP_WRITE(&phdr, sizeof(phdr));                              \
-       }                                                                     \
-} while (0)
-#define ELF_CORE_WRITE_EXTRA_DATA                                            \
-do {                                                                         \
-       const struct elf_phdr *const vsyscall_phdrs =                         \
-               (const struct elf_phdr *) (VDSO_HIGH_BASE                     \
-                                          + VDSO_HIGH_EHDR->e_phoff);    \
-       int i;                                                                \
-       for (i = 0; i < VDSO_HIGH_EHDR->e_phnum; ++i) {               \
-               if (vsyscall_phdrs[i].p_type == PT_LOAD)                      \
-                       DUMP_WRITE((void *) vsyscall_phdrs[i].p_vaddr,        \
-                                  PAGE_ALIGN(vsyscall_phdrs[i].p_memsz));    \
-       }                                                                     \
-} while (0)
-
 #endif
 
 #endif
diff -r dbe8a35dcaf7 -r ae505684a995 include/asm-i386/mach-xen/asm/pgtable.h
--- a/include/asm-i386/mach-xen/asm/pgtable.h   Mon Apr 14 13:29:37 2008 -0600
+++ b/include/asm-i386/mach-xen/asm/pgtable.h   Tue Apr 15 11:10:27 2008 -0600
@@ -105,7 +105,7 @@ void paging_init(void);
 #define _PAGE_BIT_DIRTY                6
 #define _PAGE_BIT_PSE          7       /* 4 MB (or 2MB) page, Pentium+, if 
present.. */
 #define _PAGE_BIT_GLOBAL       8       /* Global TLB entry PPro+ */
-#define _PAGE_BIT_UNUSED1      9       /* available for programmer */
+/*#define _PAGE_BIT_UNUSED1    9*/     /* available for programmer */
 #define _PAGE_BIT_UNUSED2      10
 #define _PAGE_BIT_UNUSED3      11
 #define _PAGE_BIT_NX           63
@@ -119,7 +119,7 @@ void paging_init(void);
 #define _PAGE_DIRTY    0x040
 #define _PAGE_PSE      0x080   /* 4 MB (or 2MB) page, Pentium+, if present.. */
 #define _PAGE_GLOBAL   0x100   /* Global TLB entry PPro+ */
-#define _PAGE_UNUSED1  0x200   /* available for programmer */
+/*#define _PAGE_UNUSED1        0x200*/ /* available for programmer */
 #define _PAGE_UNUSED2  0x400
 #define _PAGE_UNUSED3  0x800
 
diff -r dbe8a35dcaf7 -r ae505684a995 include/asm-x86_64/acpi.h
--- a/include/asm-x86_64/acpi.h Mon Apr 14 13:29:37 2008 -0600
+++ b/include/asm-x86_64/acpi.h Tue Apr 15 11:10:27 2008 -0600
@@ -28,6 +28,9 @@
 
 #ifdef __KERNEL__
 
+#ifdef CONFIG_XEN
+#include <xen/interface/platform.h>
+#endif
 #include <acpi/pdc_intel.h>
 
 #define COMPILER_DEPENDENT_INT64   long long
@@ -129,6 +132,27 @@ static inline void acpi_disable_pci(void
 }
 extern int acpi_irq_balance_set(char *str);
 
+#ifdef CONFIG_XEN
+static inline int acpi_notify_hypervisor_state(u8 sleep_state,
+                                              u32 pm1a_cnt_val,
+                                              u32 pm1b_cnt_val)
+{
+       struct xen_platform_op op = {
+               .cmd = XENPF_enter_acpi_sleep,
+               .interface_version = XENPF_INTERFACE_VERSION,
+               .u = {
+                       .enter_acpi_sleep = {
+                               .pm1a_cnt_val = pm1a_cnt_val,
+                               .pm1b_cnt_val = pm1b_cnt_val,
+                               .sleep_state = sleep_state,
+                       },
+               },
+       };
+
+       return HYPERVISOR_platform_op(&op);
+}
+#endif /* CONFIG_XEN */
+
 #else  /* !CONFIG_ACPI */
 
 #define acpi_lapic 0
@@ -152,11 +176,6 @@ extern unsigned long acpi_wakeup_address
 
 /* early initialization routine */
 extern void acpi_reserve_bootmem(void);
-
-#ifdef CONFIG_ACPI_PV_SLEEP
-extern int acpi_notify_hypervisor_state(u8 sleep_state,
-       u32 pm1a_cnt, u32 pm1b_cnt);
-#endif /* CONFIG_ACPI_PV_SLEEP */
 #endif /*CONFIG_ACPI_SLEEP*/
 
 #define boot_cpu_physical_apicid boot_cpu_id
diff -r dbe8a35dcaf7 -r ae505684a995 include/linux/mm.h
--- a/include/linux/mm.h        Mon Apr 14 13:29:37 2008 -0600
+++ b/include/linux/mm.h        Tue Apr 15 11:10:27 2008 -0600
@@ -167,6 +167,7 @@ extern unsigned int kobjsize(const void 
 #ifdef CONFIG_XEN
 #define VM_FOREIGN     0x04000000      /* Has pages belonging to another VM */
 #endif
+#define VM_ALWAYSDUMP  0x08000000      /* Always include in core dumps */
 
 #ifndef VM_STACK_DEFAULT_FLAGS         /* arch can override this */
 #define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS

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

<Prev in Thread] Current Thread [Next in Thread>