[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC 2/5] xen/livepatch: Allow tracers to schedule livepatch


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Ryo Takakura <takakura@xxxxxxxxxxxxx>
  • Date: Fri, 23 Oct 2026 13:53:46 +0900
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xAdKilPb0/9LuUkjGbAwn7u5vPJDH2Al5yQD43o4oA0=; b=h5uehEbZlMj0k/8afK7sLPPQxuAucddfpL8fbA8utBVj2nLtFPwImWCw3Q61RxLeJm9M3dKYXm1RGWg5JtVZ9lkW3BMdv4kqmkct9bE3gSrubY7FibfSMr4M9UPDQYV2PbDtqq3yqS8hPvmBm0Wjo8qNFr22tv5l6LyUSR1WAgwL1q9sg+XSMCLnfff/pkMgUO6OTekJWT0g1kRi3+cKFzrZ1r67oLacitM+3S1WSJCsJP4/GHf08EyVbcXxfDk+0ZlZr1FbLwg6Sk4g24wxCwacBgvbEU5R0CQW+bR5b4+LjdAMQ2L5bxPFIcQZiH8NV6uxOhOKz404SDgSUHkIkQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hBiw4vR+DAgUd7jTENUklIfb8beVK0JJ9JwIY+mrYTBOl/oi2RgdsPvig8om9l+UMEPlT6P5b2Rb0piVrBxn4j7zZ/qYfzeqmP3GTiD9I0ZBDoMjX546IRLy0Nq5t0J/6x8kL74OYP1EFMcnaKmJ8WkQw6jmPMyslMk06S70sF26U3FjkN9M01/TYzHTTpDtONdkQmjlINey8w4RUSIUc6XW402UxDlmqSMgJ6Gr9pJOf7C6bcD2fYXIVXX9LvT0E200L+lUIm1yDCiV+SWMdzS03wQYoVONQzE8sGhzVvz6yBqjKyFAgoWMd193k0RZGV8NrgsqnJVtSBsvGNDAlg==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=valinux.co.jp header.i="@valinux.co.jp" header.h="From:Date:Subject:Message-Id:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp;
  • Cc: roger@xxxxxxxxxxxxxx, ross.lagerwall@xxxxxxxxxx, Ryo Takakura <takakura@xxxxxxxxxxxxx>
  • Delivery-date: Fri, 23 Oct 2026 04:54:12 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Tracers need to patch function entries without uploading
a fully filled payload. Add TRACE_ON and TRACE_OFF for
scheduling partially filled payloads from tracers.

It lets tracers reuse the existing livepatch logic and
keeps the payload uploaded by tracers separate from the
ones uploaded by users.

Signed-off-by: Ryo Takakura <takakura@xxxxxxxxxxxxx>
---
 xen/common/livepatch.c      | 60 ++++++++++++++++++++++++++++++++++++-
 xen/include/xen/livepatch.h |  5 ++++
 2 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
index 70f601846f..a76403af59 100644
--- a/xen/common/livepatch.c
+++ b/xen/common/livepatch.c
@@ -49,6 +49,9 @@ static LIST_HEAD(applied_list);
 static unsigned int payload_cnt;
 static unsigned int payload_version = 1;
 
+#define LIVEPATCH_TRACE_ON  100
+#define LIVEPATCH_TRACE_OFF 101
+
 /* Defines an outstanding patching action. */
 struct livepatch_work
 {
@@ -58,7 +61,7 @@ struct livepatch_work
     struct payload *data;        /* The payload on which to act. */
     volatile bool do_work;       /* Signals work to do. */
     volatile bool ready;         /* Signals all CPUs synchronized. */
-    unsigned int cmd;            /* Action request: LIVEPATCH_ACTION_* */
+    unsigned int cmd;            /* Action request: LIVEPATCH_ACTION_* or 
LIVEPATCH_TRACE_* */
 };
 
 /* There can be only one outstanding patching action. */
@@ -1737,6 +1740,14 @@ static void livepatch_do_action(void)
         }
         break;
 
+    case LIVEPATCH_TRACE_ON:
+        rc = apply_payload(data);
+        break;
+
+    case LIVEPATCH_TRACE_OFF:
+        rc = revert_payload(data);
+        break;
+
     default:
         rc = -EINVAL; /* Make GCC5 happy. */
         ASSERT_UNREACHABLE();
@@ -1823,6 +1834,51 @@ static int schedule_work(struct payload *data, uint32_t 
cmd, uint32_t timeout)
     return 0;
 }
 
+int livepatch_schedule_trace_on(struct payload *payload, struct livepatch_func 
*func, unsigned long ip)
+{
+    void *old_addr;
+    int rc;
+
+    spin_lock(&payload_lock);
+    if ( is_work_scheduled(payload) )
+    {
+        rc = -EBUSY;
+        goto out;
+    }
+
+    old_addr = func->old_addr;
+    func->old_addr = (void *)ip;
+
+    payload->rc = -EAGAIN;
+    rc = schedule_work(payload, LIVEPATCH_TRACE_ON, 0);
+    if ( rc )
+        func->old_addr = old_addr;
+
+out:
+    spin_unlock(&payload_lock);
+
+    return rc;
+}
+
+int livepatch_schedule_trace_off(struct payload *payload)
+{
+    int rc;
+
+    spin_lock(&payload_lock);
+    if ( is_work_scheduled(payload) )
+    {
+        spin_unlock(&payload_lock);
+        return -EBUSY;
+    }
+
+    payload->rc = -EAGAIN;
+    rc = schedule_work(payload, LIVEPATCH_TRACE_OFF, 0);
+
+    spin_unlock(&payload_lock);
+
+    return rc;
+}
+
 static void cf_check tasklet_fn(void *unused)
 {
     this_cpu(work_to_do) = 1;
@@ -1861,6 +1917,8 @@ static void noinline do_livepatch_work(void)
             ACTION(APPLY),
             ACTION(REVERT),
             ACTION(REPLACE),
+            [LIVEPATCH_TRACE_ON] = "TRACE_ON",
+            [LIVEPATCH_TRACE_OFF] = "TRACE_OFF",
     };
 #undef ACTION
     unsigned int cpu = smp_processor_id();
diff --git a/xen/include/xen/livepatch.h b/xen/include/xen/livepatch.h
index ae34c938d6..1b927af8ee 100644
--- a/xen/include/xen/livepatch.h
+++ b/xen/include/xen/livepatch.h
@@ -140,6 +140,11 @@ struct payload;
 int revert_payload(struct payload *data);
 void revert_payload_tail(struct payload *data);
 
+int livepatch_schedule_trace_on(struct payload *payload,
+                                struct livepatch_func *func,
+                                unsigned long ip);
+int livepatch_schedule_trace_off(struct payload *payload);
+
 #else /* !CONFIG_LIVEPATCH */
 
 static inline int livepatch_op(struct xen_sysctl_livepatch_op *op)
-- 
2.34.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.