|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 07/12] livepatch: Add per-function applied/reverted state tracking marker
> On 19. Sep 2019, at 17:18, Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> wrote:
>
> On 9/16/19 11:59 AM, Pawel Wieczorkiewicz wrote:
>> Livepatch only tracks an entire payload applied/reverted state. But,
>> with an option to supply the apply_payload() and/or revert_payload()
>> functions as optional hooks, it becomes possible to intermix the
>> execution of the original apply_payload()/revert_payload() functions
>> with their dynamically supplied counterparts.
>> It is important then to track the current state of every function
>> being patched and prevent situations of unintentional double-apply
>> or unapplied revert.
>> To support that, it is necessary to extend public interface of the
>> livepatch. The struct livepatch_func gets additional field holding
>> the applied/reverted state marker.
>> To reflect the livepatch payload ABI change, bump the version flag
>> LIVEPATCH_PAYLOAD_VERSION up to 2.
>> [And also update the top of the design document]
> snip> @@ -834,6 +839,8 @@ struct livepatch_func {
>> uint32_t old_size;
>> uint8_t version; /* MUST be LIVEPATCH_PAYLOAD_VERSION. */
>> uint8_t opaque[31];
>> + uint8_t applied;
>> + uint8_t _pad[7];
>> };
>> typedef struct livepatch_func livepatch_func_t;
>> #endif
>> diff --git a/xen/include/xen/livepatch.h b/xen/include/xen/livepatch.h
>> index 2aec532ee2..28f9536776 100644
>> --- a/xen/include/xen/livepatch.h
>> +++ b/xen/include/xen/livepatch.h
>> @@ -109,6 +109,31 @@ static inline int livepatch_verify_distance(const
>> struct livepatch_func *func)
>> return 0;
>> }
>> +
>> +static inline bool_t is_func_applied(const struct livepatch_func *func)
>
> Use bool rather than bool_t (throughout the patch).
>
ACK.
>> +{
>> + if ( func->applied == LIVEPATCH_FUNC_APPLIED )
>> + {
>> + printk(XENLOG_WARNING LIVEPATCH "%s: %s has been already applied
>> before\n",
>> + __func__, func->name);
>
> How about dropping this function and having a wrapper function like this:
>
> common_livepatch_apply() {
> if (func->applied == LIVEPATCH_FUNC_APPLIED) {
> WARN(...)
> return
> }
>
> arch_livepatch_apply()
>
> func->applied = LIVEPATCH_FUNC_APPLIED
> }
>
> This could be used by the normal apply code and any apply hooks.
>
> This avoids having duplicate code in each of the architectures that is not
> arch specific and also avoids having a state querying function emit a warning
> which seems odd to me.
>
Yes. That makes a lot of sense. Let me do that.
Thanks.
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> +static inline bool_t is_func_reverted(const struct livepatch_func *func)
>> +{
>> + if ( !func->old_addr || func->applied == LIVEPATCH_FUNC_NOT_APPLIED )
>> + {
>> + printk(XENLOG_WARNING LIVEPATCH "%s: %s has not been applied
>> before\n",
>> + __func__, func->name);
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> /*
>> * These functions are called around the critical region patching live code,
>> * for an architecture to take make appropratie global state adjustments.
>> @@ -117,7 +142,7 @@ int arch_livepatch_quiesce(void);
>> void arch_livepatch_revive(void);
>>
> --
> Ross Lagerwall
Best Regards,
Pawel Wieczorkiewicz
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Ralf Herbrich
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |