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

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



# HG changeset patch
# User Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
# Date 1211250813 -32400
# Node ID 6b0a85eb515569490f4a02876c95d2b1153d444a
# Parent  2d858799d109f2225882257c029c84ae10538972
# Parent  8ce60d057d0c4d4394df2c5fab4965d4ec189722
merge with linux-2.6.18-xen.hg
---
 arch/x86_64/mm/init-xen.c                 |   54 +++++++++++++--------------
 arch/x86_64/mm/pageattr-xen.c             |    2 -
 drivers/pci/msi-xen.c                     |   60 +++++++++++++++++++-----------
 drivers/xen/balloon/balloon.c             |    6 ++-
 include/asm-i386/mach-xen/asm/pgtable.h   |   17 +++-----
 include/asm-x86_64/mach-xen/asm/pgtable.h |   19 ++++-----
 include/xen/interface/sysctl.h            |   35 +++++++++++++++++
 7 files changed, 121 insertions(+), 72 deletions(-)

diff -r 2d858799d109 -r 6b0a85eb5155 arch/x86_64/mm/init-xen.c
--- a/arch/x86_64/mm/init-xen.c Thu May 15 16:26:16 2008 +0900
+++ b/arch/x86_64/mm/init-xen.c Tue May 20 11:33:33 2008 +0900
@@ -59,6 +59,8 @@ EXPORT_SYMBOL(__kernel_page_user);
 EXPORT_SYMBOL(__kernel_page_user);
 #endif
 
+int after_bootmem;
+
 extern unsigned long *contiguous_bitmap;
 
 static unsigned long dma_reserve __initdata;
@@ -82,6 +84,8 @@ static void __meminit early_make_page_re
        unsigned long addr, _va = (unsigned long)va;
        pte_t pte, *ptep;
        unsigned long *page = (unsigned long *) init_level4_pgt;
+
+       BUG_ON(after_bootmem);
 
        if (xen_feature(feature))
                return;
@@ -207,7 +211,6 @@ void show_mem(void)
        printk(KERN_INFO "%lu pages swap cached\n",cached);
 }
 
-int after_bootmem;
 
 static __init void *spp_getpage(void)
 { 
@@ -373,11 +376,6 @@ static __meminit void *alloc_static_page
 
 #define PTE_SIZE PAGE_SIZE
 
-static inline void __set_pte(pte_t *dst, pte_t val)
-{
-       *dst = val;
-}
-
 static inline int make_readonly(unsigned long paddr)
 {
        extern char __vsyscall_0;
@@ -446,28 +444,28 @@ phys_pmd_init(pmd_t *pmd, unsigned long 
                unsigned long pte_phys;
                pte_t *pte, *pte_save;
 
-               if (address >= end) {
-                       if (!after_bootmem)
-                               for (; i < PTRS_PER_PMD; i++, pmd++)
-                                       set_pmd(pmd, __pmd(0));
+               if (address >= end)
                        break;
-               }
                pte = alloc_static_page(&pte_phys);
                pte_save = pte;
                for (k = 0; k < PTRS_PER_PTE; pte++, k++, address += PTE_SIZE) {
                        unsigned long pteval = address | _PAGE_NX | 
_KERNPG_TABLE;
 
-                       if ((address >= end) ||
-                           ((address >> PAGE_SHIFT) >=
-                            xen_start_info->nr_pages))
+                       if (address >= (after_bootmem
+                                       ? end
+                                       : xen_start_info->nr_pages << 
PAGE_SHIFT))
                                pteval = 0;
                        else if (make_readonly(address))
                                pteval &= ~_PAGE_RW;
-                       __set_pte(pte, __pte(pteval & __supported_pte_mask));
-               }
-               pte = pte_save;
-               early_make_page_readonly(pte, XENFEAT_writable_page_tables);
-               set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
+                       set_pte(pte, __pte(pteval & __supported_pte_mask));
+               }
+               if (!after_bootmem) {
+                       early_make_page_readonly(pte_save, 
XENFEAT_writable_page_tables);
+                       *pmd = __pmd(pte_phys | _KERNPG_TABLE);
+               } else {
+                       make_page_readonly(pte_save, 
XENFEAT_writable_page_tables);
+                       set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
+               }
        }
 }
 
@@ -504,11 +502,13 @@ static void __meminit phys_pud_init(pud_
                        break;
 
                pmd = alloc_static_page(&pmd_phys);
-               early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
+
                spin_lock(&init_mm.page_table_lock);
-               set_pud(pud, __pud(pmd_phys | _KERNPG_TABLE));
+               *pud = __pud(pmd_phys | _KERNPG_TABLE);
                phys_pmd_init(pmd, paddr, end);
                spin_unlock(&init_mm.page_table_lock);
+
+               early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
        }
        __flush_tlb();
 } 
@@ -739,20 +739,18 @@ void __meminit init_memory_mapping(unsig
                pgd_t *pgd = pgd_offset_k(start);
                pud_t *pud;
 
-               if (after_bootmem) {
+               if (after_bootmem)
                        pud = pud_offset(pgd, start & PGDIR_MASK);
-                       make_page_readonly(pud, XENFEAT_writable_page_tables);
-                       pud_phys = __pa(pud);
-               } else {
+               else
                        pud = alloc_static_page(&pud_phys);
-                       early_make_page_readonly(pud, 
XENFEAT_writable_page_tables);
-               }
                next = start + PGDIR_SIZE;
                if (next > end) 
                        next = end; 
                phys_pud_init(pud, __pa(start), __pa(next));
-               if (!after_bootmem)
+               if (!after_bootmem) {
+                       early_make_page_readonly(pud, 
XENFEAT_writable_page_tables);
                        set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
+               }
        }
 
        if (!after_bootmem) {
diff -r 2d858799d109 -r 6b0a85eb5155 arch/x86_64/mm/pageattr-xen.c
--- a/arch/x86_64/mm/pageattr-xen.c     Thu May 15 16:26:16 2008 +0900
+++ b/arch/x86_64/mm/pageattr-xen.c     Tue May 20 11:33:33 2008 +0900
@@ -276,7 +276,7 @@ void pte_free(struct page *pte)
 }
 #endif /* CONFIG_XEN */
 
-static inline pte_t *lookup_address(unsigned long address) 
+pte_t *lookup_address(unsigned long address) 
 { 
        pgd_t *pgd = pgd_offset_k(address);
        pud_t *pud;
diff -r 2d858799d109 -r 6b0a85eb5155 drivers/pci/msi-xen.c
--- a/drivers/pci/msi-xen.c     Thu May 15 16:26:16 2008 +0900
+++ b/drivers/pci/msi-xen.c     Tue May 20 11:33:33 2008 +0900
@@ -33,7 +33,6 @@ int msi_register(struct msi_ops *ops)
 }
 
 static LIST_HEAD(msi_dev_head);
-static int msi_dev_head_inited = 0;
 DEFINE_SPINLOCK(msi_dev_lock);
 
 struct msi_dev_list {
@@ -95,6 +94,23 @@ static int attach_pirq_entry(int pirq, i
        list_add_tail(&entry->list, &msi_dev_entry->pirq_list_head);
        spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
        return 0;
+}
+
+static void detach_pirq_entry(int entry_nr,
+                                                       struct msi_dev_list 
*msi_dev_entry)
+{
+       unsigned long flags;
+       struct msi_pirq_entry *pirq_entry;
+
+       list_for_each_entry(pirq_entry, &msi_dev_entry->pirq_list_head, list) {
+               if (pirq_entry->entry_nr == entry_nr) {
+                       spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, 
flags);
+                       list_del(&pirq_entry->list);
+                       spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, 
flags);
+                       kfree(pirq_entry);
+                       return;
+               }
+       }
 }
 
 /*
@@ -379,40 +395,42 @@ static int msix_capability_init(struct p
 static int msix_capability_init(struct pci_dev *dev,
                                struct msix_entry *entries, int nvec)
 {
-       int pirq, i, pos;
+       int pirq, i, j, mapped, pos;
        struct msi_dev_list *msi_dev_entry = get_msi_dev_pirq_list(dev);
-       struct msi_pirq_entry *pirq_entry, *tmp;
-       unsigned long flags;
+       struct msi_pirq_entry *pirq_entry;
 
        if (!msi_dev_entry)
                return -ENOMEM;
 
-       spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
-       if (!list_empty(&msi_dev_entry->pirq_list_head))
-       {
-               printk(KERN_WARNING "msix pirqs for dev %02x:%02x:%01x are not 
freed \
-                      before acquire again.\n", dev->bus->number, 
PCI_SLOT(dev->devfn),
-                          PCI_FUNC(dev->devfn));
-               list_for_each_entry_safe(pirq_entry, tmp,
-                                        &msi_dev_entry->pirq_list_head, list) {
-                       msi_unmap_pirq(dev, pirq_entry->pirq);
-                       list_del(&pirq_entry->list);
-                       kfree(pirq_entry);
-               }
-       }
-       spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
-
        /* MSI-X Table Initialization */
        for (i = 0; i < nvec; i++) {
+               mapped = 0;
+               list_for_each_entry(pirq_entry, &msi_dev_entry->pirq_list_head, 
list) {
+                       if (pirq_entry->entry_nr == entries[i].entry) {
+                               printk(KERN_WARNING "msix entry %d for dev 
%02x:%02x:%01x are \
+                                      not freed before acquire again.\n", 
entries[i].entry,
+                                          dev->bus->number, 
PCI_SLOT(dev->devfn),
+                                          PCI_FUNC(dev->devfn));
+                               (entries + i)->vector = pirq_entry->pirq;
+                               mapped = 1;
+                               break;
+                       }
+               }
+               if (mapped)
+                       continue;
                pirq = msi_map_vector(dev, entries[i].entry, 0);
                if (pirq < 0)
                        break;
                attach_pirq_entry(pirq, entries[i].entry, msi_dev_entry);
                (entries + i)->vector = pirq;
        }
+
        if (i != nvec) {
-               msi_unmap_pirq(dev, dev->irq);
-               (entries + i)->vector = 0;
+               for (j = --i; j >= 0; j--) {
+                       msi_unmap_pirq(dev, entries[j].vector);
+                       detach_pirq_entry(entries[j].entry, msi_dev_entry);
+                       entries[j].vector = 0;
+               }
                return -EBUSY;
        }
 
diff -r 2d858799d109 -r 6b0a85eb5155 drivers/xen/balloon/balloon.c
--- a/drivers/xen/balloon/balloon.c     Thu May 15 16:26:16 2008 +0900
+++ b/drivers/xen/balloon/balloon.c     Tue May 20 11:33:33 2008 +0900
@@ -197,8 +197,8 @@ static unsigned long minimum_target(void
 static unsigned long minimum_target(void)
 {
 #ifndef CONFIG_XEN
-       return 0;
-#else
+#define max_pfn num_physpages
+#endif
        unsigned long min_pages, curr_pages = current_target();
 
 #define MB2PAGES(mb) ((mb) << (20 - PAGE_SHIFT))
@@ -226,6 +226,8 @@ static unsigned long minimum_target(void
 
        /* Don't enforce growth */
        return min(min_pages, curr_pages);
+#ifndef CONFIG_XEN
+#undef max_pfn
 #endif
 }
 
diff -r 2d858799d109 -r 6b0a85eb5155 include/asm-i386/mach-xen/asm/pgtable.h
--- a/include/asm-i386/mach-xen/asm/pgtable.h   Thu May 15 16:26:16 2008 +0900
+++ b/include/asm-i386/mach-xen/asm/pgtable.h   Tue May 20 11:33:33 2008 +0900
@@ -477,19 +477,16 @@ void make_pages_readonly(void *va, unsig
 void make_pages_readonly(void *va, unsigned int nr, unsigned int feature);
 void make_pages_writable(void *va, unsigned int nr, unsigned int feature);
 
-#define virt_to_ptep(__va)                                             \
+#define virt_to_ptep(va)                                               \
 ({                                                                     \
-       pgd_t *__pgd = pgd_offset_k((unsigned long)(__va));             \
-       pud_t *__pud = pud_offset(__pgd, (unsigned long)(__va));        \
-       pmd_t *__pmd = pmd_offset(__pud, (unsigned long)(__va));        \
-       pte_offset_kernel(__pmd, (unsigned long)(__va));                \
+       pte_t *__ptep = lookup_address((unsigned long)(va));            \
+       BUG_ON(!__ptep || !pte_present(*__ptep));                       \
+       __ptep;                                                         \
 })
 
-#define arbitrary_virt_to_machine(__va)                                        
\
-({                                                                     \
-       maddr_t m = (maddr_t)pte_mfn(*virt_to_ptep(__va)) << PAGE_SHIFT;\
-       m | ((unsigned long)(__va) & (PAGE_SIZE-1));                    \
-})
+#define arbitrary_virt_to_machine(va)                                  \
+       (((maddr_t)pte_mfn(*virt_to_ptep(va)) << PAGE_SHIFT)            \
+        | ((unsigned long)(va) & (PAGE_SIZE - 1)))
 
 #endif /* !__ASSEMBLY__ */
 
diff -r 2d858799d109 -r 6b0a85eb5155 include/asm-x86_64/mach-xen/asm/pgtable.h
--- a/include/asm-x86_64/mach-xen/asm/pgtable.h Thu May 15 16:26:16 2008 +0900
+++ b/include/asm-x86_64/mach-xen/asm/pgtable.h Tue May 20 11:33:33 2008 +0900
@@ -18,19 +18,18 @@ extern pud_t level3_user_pgt[512];
 
 extern void xen_init_pt(void);
 
-#define virt_to_ptep(__va)                                             \
+extern pte_t *lookup_address(unsigned long address);
+
+#define virt_to_ptep(va)                                               \
 ({                                                                     \
-       pgd_t *__pgd = pgd_offset_k((unsigned long)(__va));             \
-       pud_t *__pud = pud_offset(__pgd, (unsigned long)(__va));        \
-       pmd_t *__pmd = pmd_offset(__pud, (unsigned long)(__va));        \
-       pte_offset_kernel(__pmd, (unsigned long)(__va));                \
+       pte_t *__ptep = lookup_address((unsigned long)(va));            \
+       BUG_ON(!__ptep || !pte_present(*__ptep));                       \
+       __ptep;                                                         \
 })
 
-#define arbitrary_virt_to_machine(__va)                                        
\
-({                                                                     \
-       maddr_t m = (maddr_t)pte_mfn(*virt_to_ptep(__va)) << PAGE_SHIFT;\
-       m | ((unsigned long)(__va) & (PAGE_SIZE-1));                    \
-})
+#define arbitrary_virt_to_machine(va)                                  \
+       (((maddr_t)pte_mfn(*virt_to_ptep(va)) << PAGE_SHIFT)            \
+        | ((unsigned long)(va) & (PAGE_SIZE - 1)))
 #endif
 
 extern pud_t level3_kernel_pgt[512];
diff -r 2d858799d109 -r 6b0a85eb5155 include/xen/interface/sysctl.h
--- a/include/xen/interface/sysctl.h    Thu May 15 16:26:16 2008 +0900
+++ b/include/xen/interface/sysctl.h    Tue May 20 11:33:33 2008 +0900
@@ -212,6 +212,40 @@ struct xen_sysctl_availheap {
 };
 typedef struct xen_sysctl_availheap xen_sysctl_availheap_t;
 DEFINE_XEN_GUEST_HANDLE(xen_sysctl_availheap_t);
+
+#define XEN_SYSCTL_get_pmstat        10
+struct pm_px_val {
+    uint64_aligned_t freq;        /* Px core frequency */
+    uint64_aligned_t residency;   /* Px residency time */
+    uint64_aligned_t count;       /* Px transition count */
+};
+typedef struct pm_px_val pm_px_val_t;
+DEFINE_XEN_GUEST_HANDLE(pm_px_val_t);
+
+struct pm_px_stat {
+    uint8_t total;        /* total Px states */
+    uint8_t usable;       /* usable Px states */
+    uint8_t last;         /* last Px state */
+    uint8_t cur;          /* current Px state */
+    XEN_GUEST_HANDLE_64(uint64) trans_pt;   /* Px transition table */
+    XEN_GUEST_HANDLE_64(pm_px_val_t) pt;
+};
+typedef struct pm_px_stat pm_px_stat_t;
+DEFINE_XEN_GUEST_HANDLE(pm_px_stat_t);
+
+struct xen_sysctl_get_pmstat {
+#define PMSTAT_get_max_px   0x11
+#define PMSTAT_get_pxstat   0x12
+#define PMSTAT_reset_pxstat 0x13
+    uint32_t type;
+    uint32_t cpuid;
+    union {
+        struct pm_px_stat getpx;
+        /* other struct for cx, tx, etc */
+    } u;
+};
+typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t);
  
 struct xen_sysctl {
     uint32_t cmd;
@@ -226,6 +260,7 @@ struct xen_sysctl {
         struct xen_sysctl_debug_keys        debug_keys;
         struct xen_sysctl_getcpuinfo        getcpuinfo;
         struct xen_sysctl_availheap         availheap;
+        struct xen_sysctl_get_pmstat        get_pmstat;
         uint8_t                             pad[128];
     } u;
 };

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


 


Rackspace

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