From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [PATCH] gnttab: miscellaneous fixes
Date: Thu, 09 Feb 2012 04:37:17 -0800 [thread overview]
Message-ID: <CB58FDFD.2AC04%keir.xen@gmail.com> (raw)
In-Reply-To: <4F33B8E30200007800071DD0@nat28.tlf.novell.com>
On 09/02/2012 03:15, "Jan Beulich" <JBeulich@suse.com> wrote:
> - _GTF_* constants name bit positions, so binary arithmetic on them is
> wrong
> - gnttab_clear_flag() cannot (on x86 and ia64 at least) simply use
> clear_bit(), as that may access more than the two bytes that are
> intended to be accessed
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -397,7 +397,8 @@ static int _set_status_v2(domid_t domid
> (id != domid) ||
> (!readonly && (flags & GTF_readonly)) )
> {
> - gnttab_clear_flag(_GTF_reading | _GTF_writing, status);
> + gnttab_clear_flag(_GTF_writing, status);
> + gnttab_clear_flag(_GTF_reading, status);
> PIN_FAIL(done, GNTST_general_error,
> "Unstable flags (%x) or dom (%d). (expected dom %d) "
> "(r/w: %d)\n",
> @@ -1716,14 +1717,14 @@ __release_grant_for_copy(
> under the domain's grant table lock. */
> /* Only safe on transitive grants. Even then, note that we don't
> attempt to drop any pin on the referent grant. */
> -static void __fixup_status_for_pin(struct active_grant_entry *act,
> +static void __fixup_status_for_pin(const struct active_grant_entry *act,
> uint16_t *status)
> {
> if ( !(act->pin & GNTPIN_hstw_mask) )
> - *status &= ~_GTF_writing;
> + *status &= ~GTF_writing;
>
> if ( !(act->pin & GNTPIN_hstr_mask) )
> - *status &= ~_GTF_reading;
> + *status &= ~GTF_reading;
> }
>
> /* Grab a frame number from a grant entry and update the flags and pin
> --- a/xen/include/asm-ia64/grant_table.h
> +++ b/xen/include/asm-ia64/grant_table.h
> @@ -5,6 +5,8 @@
> #ifndef __ASM_GRANT_TABLE_H__
> #define __ASM_GRANT_TABLE_H__
>
> +#include <asm/intrinsics.h>
> +
> #define INITIAL_NR_GRANT_FRAMES 1
>
> // for grant map/unmap
> @@ -82,9 +84,19 @@ int guest_physmap_add_page(struct domain
>
> #define gnttab_mark_dirty(d, f) ((void)f)
>
> -static inline void gnttab_clear_flag(unsigned long nr, uint16_t *addr)
> +static inline void gnttab_clear_flag(unsigned int nr, volatile uint16_t *st)
> {
> - clear_bit(nr, addr);
> + /*
> + * Note that this cannot be clear_bit(), as the access must be
> + * confined to the specified 2 bytes.
> + */
> + uint16_t mask = ~(1 << nr), old;
> + CMPXCHG_BUGCHECK_DECL
> +
> + do {
> + CMPXCHG_BUGCHECK(st);
> + old = *st;
> + } while (cmpxchg_rel(st, old, old & mask) != old);
> }
>
> #define gnttab_host_mapping_get_page_type(op, ld, rd) \
> --- a/xen/include/asm-x86/grant_table.h
> +++ b/xen/include/asm-x86/grant_table.h
> @@ -48,9 +48,13 @@ int replace_grant_host_mapping(
>
> #define gnttab_mark_dirty(d, f) paging_mark_dirty((d), (f))
>
> -static inline void gnttab_clear_flag(unsigned long nr, uint16_t *addr)
> +static inline void gnttab_clear_flag(unsigned int nr, uint16_t *st)
> {
> - clear_bit(nr, (unsigned long *)addr);
> + /*
> + * Note that this cannot be clear_bit(), as the access must be
> + * confined to the specified 2 bytes.
> + */
> + asm volatile ("lock btrw %1,%0" : "=m" (*st) : "Ir" (nr), "m" (*st));
> }
>
> /* Foreign mappings of HHVM-guest pages do not modify the type count. */
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
prev parent reply other threads:[~2012-02-09 12:37 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-09 11:15 [PATCH] gnttab: miscellaneous fixes Jan Beulich
2012-02-09 12:37 ` Keir Fraser [this message]
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=CB58FDFD.2AC04%keir.xen@gmail.com \
--to=keir.xen@gmail.com \
--cc=JBeulich@suse.com \
--cc=xen-devel@lists.xensource.com \
/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.