All of lore.kernel.org
 help / color / mirror / Atom feed
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: Dario Faggioli <dario.faggioli@citrix.com>
Cc: Ian Campbell <Ian.Campbell@citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	xen-devel <xen-devel@lists.xen.org>,
	Jan Beulich <JBeulich@suse.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [PATCH 1/4] xen: report how much memory a domain has on each NUMA node
Date: Wed, 05 Mar 2014 15:50:05 +0100	[thread overview]
Message-ID: <5317399D.1000001@ts.fujitsu.com> (raw)
In-Reply-To: <20140305143625.6984.3763.stgit@Solace>

On 05.03.2014 15:36, Dario Faggioli wrote:
> by means of a new hypercal, XEN_DOMCTL_numainfo, doing something
> similar to what XEN_SYSCTL_numainfo does, but on a per domain basis.
>
> Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
> ---
>   xen/common/domctl.c                 |   45 +++++++++++++++++++++++++++++++++++
>   xen/include/public/domctl.h         |   22 +++++++++++++++++
>   xen/xsm/flask/hooks.c               |    3 ++
>   xen/xsm/flask/policy/access_vectors |    2 ++
>   4 files changed, 72 insertions(+)
>
> diff --git a/xen/common/domctl.c b/xen/common/domctl.c
> index 7cf610a..96bf326 100644
> --- a/xen/common/domctl.c
> +++ b/xen/common/domctl.c
> @@ -574,6 +574,51 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
>       }
>       break;
>
> +    case XEN_DOMCTL_numainfo:
> +    {
> +        uint32_t node, max_node_index, last_online_node;
> +        xen_domctl_numainfo_t *ni = &op->u.numainfo;
> +        uint64_t *memkb_on_node;
> +        struct page_info *page;
> +
> +        /*
> +         * We report back info about the min number of nodes between how
> +         * much of them the caller can handle and the number of them that
> +         * are actually online.
> +         */
> +        last_online_node = last_node(node_online_map);
> +        max_node_index = min_t(uint32_t, ni->max_node_index, last_online_node);
> +        ni->max_node_index = max_node_index;
> +
> +        ret = -ENOMEM;
> +        memkb_on_node = xzalloc_array(uint64_t, max_node_index);
> +        if ( !memkb_on_node )
> +            break;
> +
> +        spin_lock(&d->page_alloc_lock);
> +        page_list_for_each(page, &d->page_list)
> +        {
> +            node = phys_to_nid((paddr_t)page_to_mfn(page) << PAGE_SHIFT);
> +            /* For nodes that are offline, don't touch the counter */
> +            if ( node <= max_node_index && node_online(node) )
> +                memkb_on_node[node]++;
> +        }

This loop will run quite a long time for huge domains. Wouldn't it be better
to do the accounting during page allocation?

> +        spin_unlock(&d->page_alloc_lock);
> +
> +        for ( node = 0; node <= max_node_index; node++ )
> +        {
> +            memkb_on_node[node] <<= (PAGE_SHIFT-10);

If you already use a 64 bit element you could use bytes as unit.

> +            if ( copy_to_guest_offset(ni->memkb_on_node, node,
> +                                      &memkb_on_node[node], 1) )
> +                break;
> +        }
> +
> +        ret = ((node <= max_node_index) || copy_to_guest(u_domctl, op, 1))
> +            ? -EFAULT : 0;
> +        xfree(memkb_on_node);
> +    }
> +    break;
> +
>       case XEN_DOMCTL_destroydomain:
>       {
>           ret = domain_kill(d);
> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
> index f22fe2e..a455d78 100644
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -315,6 +315,26 @@ typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
>   DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
>
>
> +/* XEN_DOMCTL_numainfo */
> +struct xen_domctl_numainfo {
> +    /*
> +     * IN: maximum addressable entry in the caller-provided arrays.
> +     * OUT: minimum between the maximum addressable entry in the
> +     *      caller-provided arrays and largest online node identifier
> +     *      in the system.
> +     */
> +    uint32_t max_node_index;

Add explicit padding?

> +
> +    /*
> +     * OUT: memory, in Kb, on each node. i-eth element equal to 0 means
> +     *      either "no memory on node i" or "node i offline".
> +     */
> +    XEN_GUEST_HANDLE_64(uint64) memkb_on_node;
> +};
> +typedef struct xen_domctl_numainfo xen_domctl_numainfo_t;
> +DEFINE_XEN_GUEST_HANDLE(xen_domctl_numainfo_t);
> +
> +
>   /* XEN_DOMCTL_scheduler_op */
>   /* Scheduler types. */
>   #define XEN_SCHEDULER_SEDF     4
> @@ -966,6 +986,7 @@ struct xen_domctl {
>   #define XEN_DOMCTL_getnodeaffinity               69
>   #define XEN_DOMCTL_set_max_evtchn                70
>   #define XEN_DOMCTL_cacheflush                    71
> +#define XEN_DOMCTL_numainfo                      72
>   #define XEN_DOMCTL_gdbsx_guestmemio            1000
>   #define XEN_DOMCTL_gdbsx_pausevcpu             1001
>   #define XEN_DOMCTL_gdbsx_unpausevcpu           1002
> @@ -986,6 +1007,7 @@ struct xen_domctl {
>           struct xen_domctl_vcpucontext       vcpucontext;
>           struct xen_domctl_getvcpuinfo       getvcpuinfo;
>           struct xen_domctl_max_vcpus         max_vcpus;
> +        struct xen_domctl_numainfo          numainfo;
>           struct xen_domctl_scheduler_op      scheduler_op;
>           struct xen_domctl_setdomainhandle   setdomainhandle;
>           struct xen_domctl_setdebugging      setdebugging;
> diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
> index 96276ac..edc1d34 100644
> --- a/xen/xsm/flask/hooks.c
> +++ b/xen/xsm/flask/hooks.c
> @@ -727,6 +727,9 @@ static int flask_domctl(struct domain *d, int cmd)
>       case XEN_DOMCTL_cacheflush:
>           return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__CACHEFLUSH);
>
> +    case XEN_DOMCTL_numainfo:
> +        return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__NUMAINFO);
> +
>       default:
>           printk("flask_domctl: Unknown op %d\n", cmd);
>           return -EPERM;
> diff --git a/xen/xsm/flask/policy/access_vectors b/xen/xsm/flask/policy/access_vectors
> index a0ed13d..e218992 100644
> --- a/xen/xsm/flask/policy/access_vectors
> +++ b/xen/xsm/flask/policy/access_vectors
> @@ -198,6 +198,8 @@ class domain2
>       set_max_evtchn
>   # XEN_DOMCTL_cacheflush
>       cacheflush
> +# XEN_DOMCTL_numainfo
> +    numainfo
>   }
>
>   # Similar to class domain, but primarily contains domctls related to HVM domains


Juergen

-- 
Juergen Gross                 Principal Developer Operating Systems
PBG PDG ES&S SWE OS6                   Telephone: +49 (0) 89 62060 2932
Fujitsu                                   e-mail: juergen.gross@ts.fujitsu.com
Mies-van-der-Rohe-Str. 8                Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html

  reply	other threads:[~2014-03-05 14:50 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-05 14:36 [PATCH 0/4] report how much memory a domain has on each NUMA node Dario Faggioli
2014-03-05 14:36 ` [PATCH 1/4] xen: " Dario Faggioli
2014-03-05 14:50   ` Juergen Gross [this message]
2014-03-05 16:31     ` Dario Faggioli
2014-03-05 16:49       ` Jan Beulich
2014-03-05 17:14         ` Dario Faggioli
2014-03-05 15:04   ` Jan Beulich
2014-03-05 16:13     ` Dario Faggioli
2014-03-05 16:44       ` Jan Beulich
2014-03-05 14:36 ` [PATCH 2/4] libxc: " Dario Faggioli
2014-03-05 15:05   ` Andrew Cooper
2014-03-05 15:40     ` Dario Faggioli
2014-03-10 16:39   ` Ian Jackson
2014-03-10 17:07     ` Dario Faggioli
2014-03-10 17:09       ` Andrew Cooper
2014-03-10 17:20       ` Ian Jackson
2014-03-10 17:35         ` Dario Faggioli
2014-03-11 11:15           ` Ian Jackson
2014-03-11 17:37             ` Dario Faggioli
2014-03-11 18:16               ` Ian Jackson
2014-03-11 19:04                 ` Dario Faggioli
2014-03-13 11:54                   ` George Dunlap
2014-03-05 14:36 ` [PATCH 3/4] libxl: " Dario Faggioli
2014-03-10 16:40   ` Ian Jackson
2014-03-10 17:28     ` Dario Faggioli
2014-03-13 17:26       ` Ian Jackson
2014-03-05 14:36 ` [PATCH 4/4] xl: " Dario Faggioli
2014-03-10 16:42   ` Ian Jackson
2014-03-10 17:09     ` Dario Faggioli
2014-03-05 14:40 ` [PATCH 0/4] " Juergen Gross
2014-03-05 14:44   ` Dario Faggioli
2014-03-10 16:37 ` Ian Jackson
2014-03-10 17:12   ` Dario Faggioli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5317399D.1000001@ts.fujitsu.com \
    --to=juergen.gross@ts.fujitsu.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dario.faggioli@citrix.com \
    --cc=dgdegra@tycho.nsa.gov \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.