>>> On 07.03.18 at 16:51, <andrew.coop...@citrix.com> wrote:
> @@ -175,18 +175,47 @@ void init_or_livepatch apply_alternatives(const struct 
> alt_instr *start,
>       * So be careful if you want to change the scan order to any other
>       * order.
>       */
> -    for ( a = start; a < end; a++ )
> +    for ( a = base = start; a < end; a++ )
>      {
>          uint8_t *orig = ALT_ORIG_PTR(a);
>          uint8_t *repl = ALT_REPL_PTR(a);
>          uint8_t buf[MAX_PATCH_LEN];
> +        unsigned int total_len = a->orig_len + a->pad_len;
>  
> -        BUG_ON(a->repl_len > a->orig_len);
> -        BUG_ON(a->orig_len > sizeof(buf));
> +        BUG_ON(a->repl_len > total_len);
> +        BUG_ON(total_len > sizeof(buf));
>          BUG_ON(a->cpuid >= NCAPINTS * 32);
>  
> +        /*
> +         * Detect sequences of alt_instr's patching the same origin site, and
> +         * keep base pointing at the first alt_instr entry.  This is so we 
> can
> +         * refer to a single ->priv field for patching decisions.
> +         *
> +         * ->priv being nonzero means that the origin site has already been
> +         * modified, and we shouldn't try to optimise the nops again.
> +         */
> +        if ( ALT_ORIG_PTR(base) != orig )
> +            base = a;

I don't understand why you need the new "priv" field - have a
boolean local variable which you reset instead of base here, and
which you check/set instead of base->priv below.

Everything else looks fine to me.

Jan


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

Reply via email to