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

[Xen-changelog] [xen-unstable] [IA64] convert stats to perfc, get rid of unsafe hypercall



# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 7c79d49033c67e734c73423738c71671a1bb93da
# Parent  50837fb048075ef0682456aa89e9afd1bec0b39e
[IA64] convert stats to perfc, get rid of unsafe hypercall

Convert remaining stat counter to perfc.
Get rid of unsafe hypercall.

Signed-off-by: Tristan Gingold <tristan.gingold@xxxxxxxx>
---
 xen/arch/ia64/xen/domain.c         |    1 
 xen/arch/ia64/xen/faults.c         |    1 
 xen/arch/ia64/xen/hypercall.c      |   32 ----------
 xen/arch/ia64/xen/privop.c         |    1 
 xen/arch/ia64/xen/privop_stat.c    |  113 ++++++++++++++++++-------------------
 xen/arch/ia64/xen/vcpu.c           |    4 -
 xen/arch/ia64/xen/vhpt.c           |   18 ++---
 xen/include/asm-ia64/config.h      |    6 +
 xen/include/asm-ia64/perfc.h       |   12 ++-
 xen/include/asm-ia64/perfc_defn.h  |   17 +++++
 xen/include/asm-ia64/privop_stat.h |   44 +++++++++++---
 xen/include/asm-ia64/vhpt.h        |    2 
 12 files changed, 134 insertions(+), 117 deletions(-)

diff -r 50837fb04807 -r 7c79d49033c6 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/arch/ia64/xen/domain.c        Mon Aug 14 13:20:40 2006 -0600
@@ -47,7 +47,6 @@
 #include <asm/regionreg.h>
 #include <asm/dom_fw.h>
 #include <asm/shadow.h>
-#include <asm/privop_stat.h>
 
 unsigned long dom0_size = 512*1024*1024;
 unsigned long dom0_align = 64*1024*1024;
diff -r 50837fb04807 -r 7c79d49033c6 xen/arch/ia64/xen/faults.c
--- a/xen/arch/ia64/xen/faults.c        Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/arch/ia64/xen/faults.c        Mon Aug 14 13:20:40 2006 -0600
@@ -26,7 +26,6 @@
 #include <asm/debugger.h>
 #include <asm/fpswa.h>
 #include <asm/bundle.h>
-#include <asm/privop_stat.h>
 #include <asm/asm-xsi-offsets.h>
 #include <asm/shadow.h>
 
diff -r 50837fb04807 -r 7c79d49033c6 xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c     Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/arch/ia64/xen/hypercall.c     Mon Aug 14 13:20:40 2006 -0600
@@ -28,7 +28,6 @@
 #include <xen/domain.h>
 #include <public/callback.h>
 #include <xen/event.h>
-#include <asm/privop_stat.h>
 
 static long do_physdev_op_compat(XEN_GUEST_HANDLE(physdev_op_t) uop);
 static long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg);
@@ -275,43 +274,12 @@ fw_hypercall (struct pt_regs *regs)
        return IA64_NO_FAULT;
 }
 
-/* opt_unsafe_hypercall: If true, unsafe debugging hypercalls are allowed.
-   These can create security hole.  */
-static int opt_unsafe_hypercall = 0;
-boolean_param("unsafe_hypercall", opt_unsafe_hypercall);
-
 IA64FAULT
 ia64_hypercall (struct pt_regs *regs)
 {
        struct vcpu *v = current;
        unsigned long index = regs->r2;
        int privlvl = (regs->cr_ipsr & IA64_PSR_CPL) >> IA64_PSR_CPL0_BIT;
-
-       if (index >= FW_HYPERCALL_FIRST_USER) {
-           /* Note: user hypercalls are not safe, since Xen doesn't
-              check memory access privilege: Xen does not deny reading
-              or writing to kernel memory.  */
-           if (!opt_unsafe_hypercall) {
-               printf("user xen/ia64 hypercalls disabled\n");
-               regs->r8 = -1;
-           }
-           else switch (index) {
-               case 0xffff:
-                       regs->r8 = dump_privop_counts_to_user(
-                               (char *) vcpu_get_gr(v,32),
-                               (int) vcpu_get_gr(v,33));
-                       break;
-               case 0xfffe:
-                       regs->r8 = zero_privop_counts_to_user(
-                               (char *) vcpu_get_gr(v,32),
-                               (int) vcpu_get_gr(v,33));
-                       break;
-               default:
-                       printf("unknown user xen/ia64 hypercall %lx\n", index);
-                       regs->r8 = do_ni_hypercall();
-           }
-           return IA64_NO_FAULT;
-       }
 
        /* Hypercalls are only allowed by kernel.
           Kernel checks memory accesses.  */
diff -r 50837fb04807 -r 7c79d49033c6 xen/arch/ia64/xen/privop.c
--- a/xen/arch/ia64/xen/privop.c        Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/arch/ia64/xen/privop.c        Mon Aug 14 13:20:40 2006 -0600
@@ -13,7 +13,6 @@
 #include <asm/dom_fw.h>
 #include <asm/vhpt.h>
 #include <asm/bundle.h>
-#include <asm/privop_stat.h>
 
 long priv_verbose=0;
 unsigned long privop_trace = 0;
diff -r 50837fb04807 -r 7c79d49033c6 xen/arch/ia64/xen/privop_stat.c
--- a/xen/arch/ia64/xen/privop_stat.c   Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/arch/ia64/xen/privop_stat.c   Mon Aug 14 13:20:40 2006 -0600
@@ -1,26 +1,55 @@
+#include <xen/lib.h>
+#include <public/xen.h>
+#include <xen/perfc.h>
+#include <asm/atomic.h>
 #include <asm/privop_stat.h>
-#include <asm/vhpt.h>
-#include <xen/lib.h>
-#include <asm/uaccess.h>
 
-#ifdef PRIVOP_ADDR_COUNT
-#define PRIVOP_COUNT_NINSTS 2
-#define PRIVOP_COUNT_NADDRS 30
+#ifdef CONFIG_PRIVOP_ADDRS
 
 struct privop_addr_count {
-       const char *instname;
        unsigned long addr[PRIVOP_COUNT_NADDRS];
-       unsigned long count[PRIVOP_COUNT_NADDRS];
-       unsigned long overflow;
+       unsigned int count[PRIVOP_COUNT_NADDRS];
+       unsigned int overflow;
+       atomic_t *perfc_addr;
+       atomic_t *perfc_count;
+       atomic_t *perfc_overflow;
 };
 
+#undef  PERFCOUNTER
+#define PERFCOUNTER(var, name)
 
-static struct privop_addr_count privop_addr_counter[PRIVOP_COUNT_NINSTS] = {
-       [_GET_IFA] = { "=ifa",  { 0 }, { 0 }, 0 },
-       [_THASH] = { "thash", { 0 }, { 0 }, 0 }
+#undef  PERFCOUNTER_CPU
+#define PERFCOUNTER_CPU(var, name)
+
+#undef  PERFCOUNTER_ARRAY
+#define PERFCOUNTER_ARRAY(var, name, size)
+
+#undef  PERFSTATUS
+#define PERFSTATUS(var, name)
+
+#undef  PERFSTATUS_CPU
+#define PERFSTATUS_CPU(var, name)
+
+#undef  PERFSTATUS_ARRAY
+#define PERFSTATUS_ARRAY(var, name, size)
+
+#undef PERFPRIVOPADDR
+#define PERFPRIVOPADDR(name)                        \
+    {                                               \
+        { 0 }, { 0 }, 0,                            \
+        perfcounters.privop_addr_##name##_addr,     \
+        perfcounters.privop_addr_##name##_count,    \
+        perfcounters.privop_addr_##name##_overflow  \
+    },
+
+static struct privop_addr_count privop_addr_counter[] = {
+#include <asm/perfc_defn.h>
 };
 
-void privop_count_addr(unsigned long iip, int inst)
+#define PRIVOP_COUNT_NINSTS \
+        (sizeof(privop_addr_counter) / sizeof(privop_addr_counter[0]))
+
+void privop_count_addr(unsigned long iip, enum privop_inst inst)
 {
        struct privop_addr_count *v = &privop_addr_counter[inst];
        int i;
@@ -41,29 +70,28 @@ void privop_count_addr(unsigned long iip
        v->overflow++;;
 }
 
-static int dump_privop_addrs(char *buf)
+void gather_privop_addrs(void)
 {
        int i, j;
-       char *s = buf;
-       s += sprintf(s, "Privop addresses:\n");
+       atomic_t *v;
        for (i = 0; i < PRIVOP_COUNT_NINSTS; i++) {
-               struct privop_addr_count *v = &privop_addr_counter[i];
-               s += sprintf(s, "%s:\n", v->instname);
-               for (j = 0; j < PRIVOP_COUNT_NADDRS; j++) {
-                       if (!v->addr[j])
-                               break;
-                       s += sprintf(s, " at 0x%lx #%ld\n",
-                                    v->addr[j], v->count[j]);
-               }
-               if (v->overflow) 
-                       s += sprintf(s, " other #%ld\n", v->overflow);
+               /* Note: addresses are truncated!  */
+               v = privop_addr_counter[i].perfc_addr;
+               for (j = 0; j < PRIVOP_COUNT_NADDRS; j++)
+                       atomic_set(&v[j], privop_addr_counter[i].addr[j]);
+
+               v = privop_addr_counter[i].perfc_count;
+               for (j = 0; j < PRIVOP_COUNT_NADDRS; j++)
+                       atomic_set(&v[j], privop_addr_counter[i].count[j]);
+               
+               atomic_set(privop_addr_counter[i].perfc_overflow,
+                          privop_addr_counter[i].overflow);
        }
-       return s - buf;
 }
 
-static void zero_privop_addrs(void)
+void reset_privop_addrs(void)
 {
-       int i,j;
+       int i, j;
        for (i = 0; i < PRIVOP_COUNT_NINSTS; i++) {
                struct privop_addr_count *v = &privop_addr_counter[i];
                for (j = 0; j < PRIVOP_COUNT_NADDRS; j++)
@@ -119,30 +147,3 @@ static const char * const hyperpriv_str[
        "=rr", "rr=", "kr=", "fc", "=cpuid", "=pmd", "=ar.eflg", "ar.eflg="
 };
 #endif
-
-#define TMPBUFLEN 8*1024
-int dump_privop_counts_to_user(char __user *ubuf, int len)
-{
-       char buf[TMPBUFLEN];
-       int n;
-
-       if (len < TMPBUFLEN)
-               return -1;
-
-       n = 0;
-#ifdef PRIVOP_ADDR_COUNT
-       n += dump_privop_addrs(buf + n);
-#endif
-       n += dump_vhpt_stats(buf + n);
-       if (__copy_to_user(ubuf,buf,n))
-               return -1;
-       return n;
-}
-
-int zero_privop_counts_to_user(char __user *ubuf, int len)
-{
-#ifdef PRIVOP_ADDR_COUNT
-       zero_privop_addrs();
-#endif
-       return 0;
-}
diff -r 50837fb04807 -r 7c79d49033c6 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/arch/ia64/xen/vcpu.c  Mon Aug 14 13:20:40 2006 -0600
@@ -473,7 +473,7 @@ IA64FAULT vcpu_get_iip(VCPU *vcpu, UINT6
 
 IA64FAULT vcpu_get_ifa(VCPU *vcpu, UINT64 *pval)
 {
-       PRIVOP_COUNT_ADDR(vcpu_regs(vcpu),_GET_IFA);
+       PRIVOP_COUNT_ADDR(vcpu_regs(vcpu), privop_inst_get_ifa);
        *pval = PSCB(vcpu,ifa);
        return (IA64_NO_FAULT);
 }
@@ -540,7 +540,7 @@ IA64FAULT vcpu_get_iim(VCPU *vcpu, UINT6
 
 IA64FAULT vcpu_get_iha(VCPU *vcpu, UINT64 *pval)
 {
-       PRIVOP_COUNT_ADDR(vcpu_regs(vcpu),_THASH);
+       PRIVOP_COUNT_ADDR(vcpu_regs(vcpu), privop_inst_thash);
        *pval = PSCB(vcpu,iha);
        return (IA64_NO_FAULT);
 }
diff -r 50837fb04807 -r 7c79d49033c6 xen/arch/ia64/xen/vhpt.c
--- a/xen/arch/ia64/xen/vhpt.c  Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/arch/ia64/xen/vhpt.c  Mon Aug 14 13:20:40 2006 -0600
@@ -261,13 +261,12 @@ void flush_tlb_mask(cpumask_t mask)
             (cpu, (void (*)(void *))flush_tlb_vhpt_all, NULL, 1, 1);
 }
 
-int dump_vhpt_stats(char *buf)
+#ifdef PERF_COUNTERS
+void gather_vhpt_stats(void)
 {
        int i, cpu;
-       char *s = buf;
-
-       s += sprintf(s,"VHPT usage (%ld entries):\n",
-                    (unsigned long) VHPT_NUM_ENTRIES);
+
+       perfc_set(vhpt_nbr_entries, VHPT_NUM_ENTRIES);
 
        for_each_present_cpu (cpu) {
                struct vhpt_lf_entry *v = __va(per_cpu(vhpt_paddr, cpu));
@@ -276,8 +275,7 @@ int dump_vhpt_stats(char *buf)
                for (i = 0; i < VHPT_NUM_ENTRIES; i++, v++)
                        if (!(v->ti_tag & INVALID_TI_TAG))
                                vhpt_valid++;
-               s += sprintf(s,"  cpu %d: %ld\n", cpu, vhpt_valid);
-       }
-
-       return s - buf;
-}
+               perfc_seta(vhpt_valid_entries, cpu, vhpt_valid);
+       }
+}
+#endif
diff -r 50837fb04807 -r 7c79d49033c6 xen/include/asm-ia64/config.h
--- a/xen/include/asm-ia64/config.h     Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/include/asm-ia64/config.h     Mon Aug 14 13:20:40 2006 -0600
@@ -36,6 +36,12 @@
 #define supervisor_mode_kernel (0)
 
 #define MAX_DMADOM_PFN (0x7FFFFFFFUL >> PAGE_SHIFT) /* 31 addressable bits */
+
+/* If PERFC is used, include privop maps.  */
+#ifdef PERF_COUNTERS
+#define CONFIG_PRIVOP_ADDRS
+#define PRIVOP_COUNT_NADDRS 30
+#endif
 
 #ifndef __ASSEMBLY__
 
diff -r 50837fb04807 -r 7c79d49033c6 xen/include/asm-ia64/perfc.h
--- a/xen/include/asm-ia64/perfc.h      Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/include/asm-ia64/perfc.h      Mon Aug 14 13:20:40 2006 -0600
@@ -1,16 +1,22 @@
 #ifndef __ASM_PERFC_H__
 #define __ASM_PERFC_H__
 
-static inline void arch_perfc_printall (void)
+#include <asm/vhpt.h>
+#include <asm/privop_stat.h>
+
+static inline void arch_perfc_printall(void)
 {
 }
 
-static inline void arch_perfc_reset (void)
+static inline void arch_perfc_reset(void)
 {
+  reset_privop_addrs();
 }
 
-static inline void arch_perfc_gather (void)
+static inline void arch_perfc_gather(void)
 {
+  gather_vhpt_stats();
+  gather_privop_addrs();
 }
 
 #endif
diff -r 50837fb04807 -r 7c79d49033c6 xen/include/asm-ia64/perfc_defn.h
--- a/xen/include/asm-ia64/perfc_defn.h Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/include/asm-ia64/perfc_defn.h Mon Aug 14 13:20:40 2006 -0600
@@ -40,3 +40,20 @@ PERFCOUNTER_ARRAY(fast_hyperprivop,   "f
 
 PERFCOUNTER_ARRAY(slow_reflect,       "slow reflection", 0x80)
 PERFCOUNTER_ARRAY(fast_reflect,       "fast reflection", 0x80)
+
+PERFSTATUS(vhpt_nbr_entries,          "nbr of entries per VHPT")
+PERFSTATUS_CPU(vhpt_valid_entries,    "nbr of valid entries in VHPT")
+
+#ifdef CONFIG_PRIVOP_ADDRS
+#ifndef PERFPRIVOPADDR
+#define PERFPRIVOPADDR(name) \
+PERFSTATUS_ARRAY(privop_addr_##name##_addr, "privop-addrs addr " #name, \
+                 PRIVOP_COUNT_NADDRS) \
+PERFSTATUS_ARRAY(privop_addr_##name##_count, "privop-addrs count " #name, \
+                 PRIVOP_COUNT_NADDRS) \
+PERFSTATUS(privop_addr_##name##_overflow, "privop-addrs overflow " #name)
+#endif
+
+PERFPRIVOPADDR(get_ifa)
+PERFPRIVOPADDR(thash)
+#endif
diff -r 50837fb04807 -r 7c79d49033c6 xen/include/asm-ia64/privop_stat.h
--- a/xen/include/asm-ia64/privop_stat.h        Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/include/asm-ia64/privop_stat.h        Mon Aug 14 13:20:40 2006 -0600
@@ -1,22 +1,46 @@
 #ifndef _XEN_UA64_PRIVOP_STAT_H
 #define _XEN_UA64_PRIVOP_STAT_H
-#include <public/arch-ia64.h>
+#include <asm/config.h>
 
-extern int dump_privop_counts_to_user(char *, int);
-extern int zero_privop_counts_to_user(char *, int);
+#ifdef CONFIG_PRIVOP_ADDRS
 
-#define PRIVOP_ADDR_COUNT
+extern void gather_privop_addrs(void);
+extern void reset_privop_addrs(void);
 
-#ifdef PRIVOP_ADDR_COUNT
+#undef  PERFCOUNTER
+#define PERFCOUNTER(var, name)
 
-/* INST argument of PRIVOP_COUNT_ADDR.  */
-#define _GET_IFA 0
-#define _THASH 1
+#undef  PERFCOUNTER_CPU
+#define PERFCOUNTER_CPU(var, name)
+
+#undef  PERFCOUNTER_ARRAY
+#define PERFCOUNTER_ARRAY(var, name, size)
+
+#undef  PERFSTATUS
+#define PERFSTATUS(var, name)
+
+#undef  PERFSTATUS_CPU
+#define PERFSTATUS_CPU(var, name)
+
+#undef  PERFSTATUS_ARRAY
+#define PERFSTATUS_ARRAY(var, name, size)
+
+#undef  PERFPRIVOPADDR
+#define PERFPRIVOPADDR(name) privop_inst_##name,
+
+enum privop_inst {
+#include <asm/perfc_defn.h>
+};
+
+#undef PERFPRIVOPADDR
+
 #define        PRIVOP_COUNT_ADDR(regs,inst) 
privop_count_addr(regs->cr_iip,inst)
-extern void privop_count_addr(unsigned long addr, int inst);
+extern void privop_count_addr(unsigned long addr, enum privop_inst inst);
 
 #else
-#define        PRIVOP_COUNT_ADDR(x,y) do {} while (0)
+#define PRIVOP_COUNT_ADDR(x,y) do {} while (0)
+#define gather_privop_addrs() do {} while (0)
+#define reset_privop_addrs() do {} while (0)
 #endif
 
 #endif /* _XEN_UA64_PRIVOP_STAT_H */
diff -r 50837fb04807 -r 7c79d49033c6 xen/include/asm-ia64/vhpt.h
--- a/xen/include/asm-ia64/vhpt.h       Mon Aug 14 11:46:40 2006 -0600
+++ b/xen/include/asm-ia64/vhpt.h       Mon Aug 14 13:20:40 2006 -0600
@@ -32,7 +32,7 @@ struct vhpt_lf_entry {
 #define INVALID_TI_TAG 0x8000000000000000L
 
 extern void vhpt_init (void);
-extern int dump_vhpt_stats(char *buf);
+extern void gather_vhpt_stats(void);
 extern void vhpt_multiple_insert(unsigned long vaddr, unsigned long pte,
                                 unsigned long logps);
 extern void vhpt_insert (unsigned long vadr, unsigned long pte,

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