]> xenbits.xensource.com Git - legacy/linux-2.6.18-xen.git/commitdiff
ia64, xencomm: support XEN_SYSCTL_topologyinfo and XEN_SYSCTL_numainfo
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 7 Jun 2010 05:57:35 +0000 (06:57 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 7 Jun 2010 05:57:35 +0000 (06:57 +0100)
Signed-off-by: KUWAMURA Shin'ya <kuwa@jp.fujitsu.com>
arch/ia64/xen/xcom_privcmd.c

index 90fdfa911835654e0c29297a6dc4fa8da139f136..37742117a897cc8bd43ce748d90b5edce6afd9d6 100644 (file)
@@ -87,6 +87,7 @@ xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall)
        struct xencomm_handle *op_desc;
        struct xencomm_handle *desc = NULL;
        struct xencomm_handle *desc1 = NULL;
+       struct xencomm_handle *desc2 = NULL;
        int ret = 0;
 
        user_op = (xen_sysctl_t __user *)hypercall->arg[0];
@@ -111,6 +112,7 @@ xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall)
                                     (void *)desc);
                break;
        case XEN_SYSCTL_tbuf_op:
+       case XEN_SYSCTL_physinfo:
        case XEN_SYSCTL_sched_id:
        case XEN_SYSCTL_availheap:
                break;
@@ -183,18 +185,6 @@ xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall)
                                     (void *)desc);
                break;
 
-       case XEN_SYSCTL_physinfo:
-               desc = xencomm_map(
-                       xen_guest_handle(kern_op.u.physinfo.cpu_to_node),
-                       kern_op.u.physinfo.max_cpu_id * sizeof(uint32_t));
-               if (xen_guest_handle(kern_op.u.physinfo.cpu_to_node) != NULL &&
-                   kern_op.u.physinfo.max_cpu_id > 0 && desc == NULL)
-                       return -ENOMEM;
-
-               set_xen_guest_handle(kern_op.u.physinfo.cpu_to_node,
-                                    (void *)desc);
-               break;
-
        case XEN_SYSCTL_get_pmstat:
                if (kern_op.u.get_pmstat.type == PMSTAT_get_pxstat) {
                        struct pm_px_stat *getpx =
@@ -219,6 +209,79 @@ xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall)
                }
                break;
 
+       case XEN_SYSCTL_topologyinfo:
+       {
+               xen_sysctl_topologyinfo_t *info = &kern_op.u.topologyinfo;
+               unsigned long size =
+                       (info->max_cpu_index + 1) * sizeof(uint32_t);
+
+               desc = xencomm_map(xen_guest_handle(info->cpu_to_core), size);
+               if (xen_guest_handle(info->cpu_to_core) != NULL &&
+                   info->max_cpu_index > 0 && desc == NULL)
+                       return -ENOMEM;
+
+               set_xen_guest_handle(info->cpu_to_core, (void *)desc);
+
+               desc1 = xencomm_map(
+                       xen_guest_handle(info->cpu_to_socket), size);
+               if (xen_guest_handle(info->cpu_to_socket) != NULL &&
+                   info->max_cpu_index > 0 && desc1 == NULL) {
+                       xencomm_free(desc);
+                       return -ENOMEM;
+               }
+
+               set_xen_guest_handle(info->cpu_to_socket, (void *)desc1);
+
+               desc2 = xencomm_map(xen_guest_handle(info->cpu_to_node), size);
+               if (xen_guest_handle(info->cpu_to_node) != NULL &&
+                   info->max_cpu_index > 0 && desc2 == NULL) {
+                       xencomm_free(desc1);
+                       xencomm_free(desc);
+                       return -ENOMEM;
+               }
+
+               set_xen_guest_handle(info->cpu_to_node, (void *)desc2);
+               break;
+       }
+
+       case XEN_SYSCTL_numainfo:
+       {
+               xen_sysctl_numainfo_t *info = &kern_op.u.numainfo;
+               uint32_t max = info->max_node_index;
+
+               desc = xencomm_map(xen_guest_handle(info->node_to_memsize),
+                                  (max + 1) * sizeof(uint64_t));
+               if (xen_guest_handle(info->node_to_memsize) != NULL &&
+                   desc == NULL)
+                       return -ENOMEM;
+
+               set_xen_guest_handle(info->node_to_memsize, (void *)desc);
+
+               desc1 = xencomm_map(xen_guest_handle(info->node_to_memfree),
+                                   (max + 1) * sizeof(uint64_t));
+               if (xen_guest_handle(info->node_to_memfree) != NULL &&
+                   desc1 == NULL) {
+                       xencomm_free(desc);
+                       return -ENOMEM;
+               }
+
+               set_xen_guest_handle(info->node_to_memfree, (void *)desc1);
+
+               desc2 = xencomm_map(
+                       xen_guest_handle(info->node_to_node_distance),
+                       (max + 1) * (max + 1) * sizeof(uint32_t));
+               if (xen_guest_handle(info->node_to_node_distance) != NULL &&
+                   desc2 == NULL) {
+                       xencomm_free(desc1);
+                       xencomm_free(desc);
+                       return -ENOMEM;
+               }
+
+               set_xen_guest_handle(info->node_to_node_distance,
+                                    (void *)desc2);
+               break;
+       }
+
        default:
                printk("%s: unknown sysctl cmd %d\n", __func__, kern_op.cmd);
                return -ENOSYS;
@@ -249,6 +312,7 @@ xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall)
 
        xencomm_free(desc);
        xencomm_free(desc1);
+       xencomm_free(desc2);
        return ret;
 }