All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Christopher Clark <christopher.w.clark@gmail.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>,
	Wei Liu <wei.liu2@citrix.com>,
	Ross Philipson <ross.philipson@gmail.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Jason Andryuk <jandryuk@gmail.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Rich Persaud <persaur@gmail.com>, Tim Deegan <tim@xen.org>,
	Daniel Smith <dpsmith@apertussolutions.com>,
	Julien Grall <julien.grall@arm.com>,
	Paul Durrant <paul.durrant@citrix.com>,
	Jan Beulich <jbeulich@suse.com>,
	xen-devel@lists.xenproject.org,
	James McKenzie <james@bromium.com>,
	Eric Chanudet <eric.chanudet@gmail.com>
Subject: Re: [PATCH v4 08/14] argo: implement the unregister op
Date: Tue, 15 Jan 2019 16:03:41 +0100	[thread overview]
Message-ID: <20190115150341.5n2uqszxx3qpdqsx@mac> (raw)
In-Reply-To: <1547544466-21135-9-git-send-email-christopher.w.clark@gmail.com>

On Tue, Jan 15, 2019 at 01:27:40AM -0800, Christopher Clark wrote:
> Takes a single argument: a handle to the ring unregistration struct,
> which specifies the port and partner domain id or wildcard.
> 
> The ring's entry is removed from the hashtable of registered rings;
> any entries for pending notifications are removed; and the ring is
> unmapped from Xen's address space.
> 
> If the ring had been registered to communicate with a single specified
> domain (ie. a non-wildcard ring) then the partner domain state is removed
> from the partner domain's argo send_info hash table.
> 
> Signed-off-by: Christopher Clark <christopher.clark6@baesystems.com>

Thanks, LGTM. I just have one question below.

> ---
> v3 #08 Jan: pull xfree out of exclusive critical sections in unregister_ring
> v3 #08 Jan: rename send_find_info to find_send_info
> v3 #07 Jan: rename ring_find_info to find_ring_info
> v3 #08 Roger: use return and remove the out label in unregister_ring
> v3 #08 Roger: better debug output in send_find_info
> v3 #10 Roger: move find functions to top of file and drop prototypes
> v3 #04 Jan: meld compat check for unregister_ring struct
> v3 #04 Roger/Jan: make lock names clearer and assert their state
> v3 #04 Jan: port -> aport with type; distinguish argo port from evtchn
> v3 feedback Roger/Jan: ASSERT currd is current->domain or use 'd' variable name
> v3 feedback #07 Roger: const the argo_ring_id structs in send_find_info
> v2 feedback Jan: drop cookie, implement teardown
> v2 feedback Jan: drop message from argo_message_op
> v2 self: OVERHAUL
> v2 self: reorder logic to shorten critical section
> v1 #13 feedback Jan: revise use of guest_handle_okay vs __copy ops
> v1 feedback Roger, Jan: drop argo prefix on static functions
> v1,2 feedback Jan/Roger/Paul: drop errno returning guest access functions
> v1 #5 (#14) feedback Paul: use currd in do_argo_message_op
> v1 #5 (#14) feedback Paul: full use currd in argo_unregister_ring
> v1 #13 (#14) feedback Paul: replace do/while with goto; reindent
> v1 self: add blank lines in unregister case in do_argo_message_op
> v1: #13 feedback Jan: public namespace: prefix with xen
> v1: #13 feedback Jan: blank line after op case in do_argo_message_op
> v1: #14 feedback Jan: replace domain id override with validation
> v1: #18 feedback Jan: meld the ring count limit into the series
> v1: feedback #15 Jan: verify zero in unused hypercall args
> 
>  xen/common/argo.c         | 118 ++++++++++++++++++++++++++++++++++++++++++++++
>  xen/common/compat/argo.c  |   1 +
>  xen/include/public/argo.h |  19 ++++++++
>  xen/include/xlat.lst      |   1 +
>  4 files changed, 139 insertions(+)
> 
> diff --git a/xen/common/argo.c b/xen/common/argo.c
> index 076ee6c..3f95f80 100644
> --- a/xen/common/argo.c
> +++ b/xen/common/argo.c
> @@ -43,6 +43,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_argo_addr_t);
>  DEFINE_XEN_GUEST_HANDLE(xen_argo_gfn_t);
>  DEFINE_XEN_GUEST_HANDLE(xen_argo_register_ring_t);
>  DEFINE_XEN_GUEST_HANDLE(xen_argo_ring_t);
> +DEFINE_XEN_GUEST_HANDLE(xen_argo_unregister_ring_t);
>  
>  /* Xen command line option to enable argo */
>  static bool __read_mostly opt_argo_enabled;
> @@ -327,6 +328,33 @@ find_ring_info(const struct domain *d, const struct argo_ring_id *id)
>      return NULL;
>  }
>  
> +static struct argo_send_info *
> +find_send_info(const struct domain *d, const struct argo_ring_id *id)
> +{
> +    struct hlist_node *node;
> +    struct argo_send_info *send_info;
> +
> +    ASSERT(LOCKING_send_L2(d));
> +
> +    hlist_for_each_entry(send_info, node, &d->argo->send_hash[hash_index(id)],
> +                         node)
> +    {
> +        const struct argo_ring_id *cmpid = &send_info->id;
> +
> +        if ( cmpid->aport == id->aport &&
> +             cmpid->domain_id == id->domain_id &&
> +             cmpid->partner_id == id->partner_id )
> +        {
> +            argo_dprintk("send_info=%p\n", send_info);
> +            return send_info;
> +        }
> +    }
> +    argo_dprintk("no send_info found for ring(%u:%x %u)\n",
> +                 id->domain_id, id->aport, id->partner_id);
> +
> +    return NULL;
> +}
> +
>  static void
>  ring_unmap(const struct domain *d, struct argo_ring_info *ring_info)
>  {
> @@ -695,6 +723,81 @@ find_ring_mfns(struct domain *d, struct argo_ring_info *ring_info,
>   * * simplify the out label path when lock release has been moved.
>   */
>  static long
> +unregister_ring(struct domain *currd,
> +                XEN_GUEST_HANDLE_PARAM(xen_argo_unregister_ring_t) unreg_hnd)
> +{
> +    xen_argo_unregister_ring_t unreg;
> +    struct argo_ring_id ring_id;
> +    struct argo_ring_info *ring_info;
> +    struct argo_send_info *send_info = NULL;
> +    struct domain *dst_d = NULL;
> +    int ret = 0;
> +
> +    ASSERT(currd == current->domain);
> +
> +    if ( copy_from_guest(&unreg, unreg_hnd, 1) )
> +        return -EFAULT;
> +
> +    if ( unreg.pad )
> +        return -EINVAL;
> +
> +    ring_id.partner_id = unreg.partner_id;
> +    ring_id.aport = unreg.aport;
> +    ring_id.domain_id = currd->domain_id;
> +
> +    read_lock(&L1_global_argo_rwlock);
> +
> +    if ( !currd->argo )
> +    {
> +        ret = -ENODEV;
> +        goto out_unlock;
> +    }
> +
> +    write_lock(&currd->argo->rings_L2_rwlock);
> +
> +    ring_info = find_ring_info(currd, &ring_id);
> +    if ( ring_info )
> +    {
> +        ring_remove_info(currd, ring_info);
> +        currd->argo->ring_count--;
> +    }
> +
> +    dst_d = get_domain_by_id(ring_id.partner_id);
> +    if ( dst_d )
> +    {
> +        if ( dst_d->argo )
> +        {
> +            spin_lock(&dst_d->argo->send_L2_lock);
> +
> +            send_info = find_send_info(dst_d, &ring_id);
> +            if ( send_info )
> +                hlist_del(&send_info->node);
> +
> +            spin_unlock(&dst_d->argo->send_L2_lock);
> +
> +        }
> +        put_domain(dst_d);
> +    }

Can you actually find send_info if ring_info returns NULL?

The ringid in send_info would then be stale, and point to a
non-existing ring?

Thanks, Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2019-01-15 15:07 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-15  9:27 [PATCH v4 00/14] Argo: hypervisor-mediated interdomain communication Christopher Clark
2019-01-15  9:27 ` [PATCH v4 01/14] argo: Introduce the Kconfig option to govern inclusion of Argo Christopher Clark
2019-01-15  9:27 ` [PATCH v4 02/14] argo: introduce the argo_op hypercall boilerplate Christopher Clark
2019-01-15  9:27 ` [PATCH v4 03/14] argo: define argo_dprintk for subsystem debugging Christopher Clark
2019-01-15  9:27 ` [PATCH v4 04/14] argo: init, destroy and soft-reset, with enable command line opt Christopher Clark
2019-01-15 12:29   ` Roger Pau Monné
2019-01-15 12:42     ` Jan Beulich
2019-01-15 14:16       ` Roger Pau Monné
2019-01-15 14:15     ` Ian Jackson
2019-01-16  1:07     ` Christopher Clark
2019-01-15  9:27 ` [PATCH v4 05/14] errno: add POSIX error codes EMSGSIZE, ECONNREFUSED to the ABI Christopher Clark
2019-01-15  9:27 ` [PATCH v4 06/14] xen/arm: introduce guest_handle_for_field() Christopher Clark
2019-01-15  9:27 ` [PATCH v4 07/14] argo: implement the register op Christopher Clark
2019-01-15 14:40   ` Roger Pau Monné
2019-01-15 22:37     ` Christopher Clark
2019-01-15  9:27 ` [PATCH v4 08/14] argo: implement the unregister op Christopher Clark
2019-01-15 15:03   ` Roger Pau Monné [this message]
2019-01-17  6:40     ` Christopher Clark
2019-01-15  9:27 ` [PATCH v4 09/14] argo: implement the sendv op; evtchn: expose send_guest_global_virq Christopher Clark
2019-01-15 15:49   ` Roger Pau Monné
2019-01-15 16:10     ` Jan Beulich
2019-01-15 16:19       ` Roger Pau Monné
2019-01-17  6:48     ` Christopher Clark
2019-01-17 10:53       ` Roger Pau Monné
2019-01-15  9:27 ` [PATCH v4 10/14] argo: implement the notify op Christopher Clark
2019-01-15 16:17   ` Roger Pau Monné
2019-01-17  6:54     ` Christopher Clark
2019-01-17 11:12       ` Roger Pau Monné
2019-01-17 12:04         ` Jan Beulich
2019-01-17 21:44         ` Christopher Clark
2019-01-18  9:44           ` Roger Pau Monné
2019-01-18 23:54             ` Christopher Clark
2019-01-18 23:59               ` Christopher Clark
2019-01-19 12:06               ` Roger Pau Monné
2019-01-21  1:59                 ` Christopher Clark
2019-01-21  8:21                   ` Roger Pau Monné
2019-01-15  9:27 ` [PATCH v4 11/14] xsm, argo: XSM control for argo register Christopher Clark
2019-01-15  9:27 ` [PATCH v4 12/14] xsm, argo: XSM control for argo message send operation Christopher Clark
2019-01-15  9:27 ` [PATCH v4 13/14] xsm, argo: XSM control for any access to argo by a domain Christopher Clark
2019-01-15  9:27 ` [PATCH v4 14/14] xsm, argo: notify: don't describe rings that cannot be sent to Christopher Clark
2019-01-15 16:34 ` [PATCH v4 00/14] Argo: hypervisor-mediated interdomain communication Roger Pau Monné
2019-01-15 22:39   ` Christopher Clark

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=20190115150341.5n2uqszxx3qpdqsx@mac \
    --to=roger.pau@citrix.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=christopher.w.clark@gmail.com \
    --cc=dpsmith@apertussolutions.com \
    --cc=eric.chanudet@gmail.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=james@bromium.com \
    --cc=jandryuk@gmail.com \
    --cc=jbeulich@suse.com \
    --cc=julien.grall@arm.com \
    --cc=konrad.wilk@oracle.com \
    --cc=paul.durrant@citrix.com \
    --cc=persaur@gmail.com \
    --cc=ross.philipson@gmail.com \
    --cc=sstabellini@kernel.org \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.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.