[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 20/25] x86emul: correctly handle CMPXCHG* comparison failures
On 05/02/18 08:07, Jan Beulich wrote: > >>> + >>> + memcpy(p_old, &old, bytes); >> This is redundant with ... >> >>> + >>> + return rc; >>> } >>> >>> static const struct x86_emulate_ops hvm_shadow_emulator_ops = { >>> --- a/xen/arch/x86/mm/shadow/multi.c >>> +++ b/xen/arch/x86/mm/shadow/multi.c >>> @@ -4741,11 +4741,11 @@ sh_x86_emulate_write(struct vcpu *v, uns >>> >>> static int >>> sh_x86_emulate_cmpxchg(struct vcpu *v, unsigned long vaddr, >>> - unsigned long old, unsigned long new, >>> - unsigned int bytes, struct sh_emulate_ctxt >>> *sh_ctxt) >>> + unsigned long *p_old, unsigned long new, >>> + unsigned int bytes, struct sh_emulate_ctxt *sh_ctxt) >>> { >>> void *addr; >>> - unsigned long prev; >>> + unsigned long prev, old = *p_old; >>> int rv = X86EMUL_OKAY; >>> >>> /* Unaligned writes are only acceptable on HVM */ >>> @@ -4769,7 +4769,10 @@ sh_x86_emulate_cmpxchg(struct vcpu *v, u >>> } >>> >>> if ( prev != old ) >>> - rv = X86EMUL_RETRY; >>> + { >>> + *p_old = prev; >> ... this, is it not? > No, here we copy info hvm_emulate_cmpxchg()'s local variable, > while there we copy into its caller's one. But anyway, the double > copying gets eliminated by patch 25. Ok. > >>> --- a/xen/arch/x86/pv/ro-page-fault.c >>> +++ b/xen/arch/x86/pv/ro-page-fault.c >>> @@ -65,14 +65,16 @@ static int ptwr_emulated_read(enum x86_s >>> return X86EMUL_OKAY; >>> } >>> >>> -static int ptwr_emulated_update(unsigned long addr, paddr_t old, paddr_t >>> val, >>> - unsigned int bytes, unsigned int >>> do_cmpxchg, >>> +static int ptwr_emulated_update(unsigned long addr, intpte_t *p_old, >>> + intpte_t val, unsigned int bytes, >>> struct x86_emulate_ctxt *ctxt) >>> { >>> unsigned long mfn; >>> unsigned long unaligned_addr = addr; >>> struct page_info *page; >>> l1_pgentry_t pte, ol1e, nl1e, *pl1e; >>> + intpte_t old = p_old ? *p_old : 0; >>> + unsigned int offset = 0; >> I really think this conversion to intpte needs splitting out into a >> separate patch. You're making multiple changes in this function which >> aren't at commit message at all, including introducing the distinction >> I've just noted of *p_old being NULL meaning a write rather than cmpxchg. > I can split out the type change, but you realize this means touching > twice some of the exact same code? As to changes not mentioned > in the commit message - I'm having trouble to spot those (the type > change is mentioned). What you don't mention is that you're changing how ptwr_emulated_update() evaluates what to do, and this took me a while to figure out. > >> On that note specifically, it would be clearer to have "const bool >> do_cmpxchg = *p_old; /* cmpxchg, or write? */". If you don't want to do >> it, then there needs to be a comment with the function explaining the >> semantics of p_old. > I'll add a comment, even if I have a hard time finding a good place > to put it. Ahead of the function isn't really a good place imo, but I > also can't figure anything better. With that sorted, Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |