Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp9911371imu; Wed, 5 Dec 2018 12:26:22 -0800 (PST) X-Google-Smtp-Source: AFSGD/Upy8Y+39dYMUfGcVClIVZqIgVQH3CHJdmYDdCUWqEnTIvWzP5qD7Qb6rr2KaB9txCDvXTP X-Received: by 2002:a63:62c3:: with SMTP id w186mr20755412pgb.345.1544041582308; Wed, 05 Dec 2018 12:26:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544041582; cv=none; d=google.com; s=arc-20160816; b=F1WK66/yRWLAS6uxsI8DrhFtwdbRIRaHorVhUwL3I8OHx71BNxkS1Hmh3iIulxEGGh mrYk8/M+k8qkgc2pYVQTE3s5tcDk+SzkD1/UzZT7W2tE8eULLZZMIjcK+AzUMVAEe1wH uYmfI9A+SNBx7cEmmndZ1JgmAn551MK/DYJ0iQdOy5gKstD7cEb7FZOOKA83jijevW5Z M4skDIDKTFd5KB0JCGnG2hPcbrQ0IjnvW9V1C7xIKRxUnvM+zFCRj9K1TFLwxN7MJdhv D5DTNsZO1HQpLURyTNWE0ZmJvtL4E5amEsrMU7R41uD2LrRZxFwkhI9d6Kg0lyHLvdwT 5JnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=dPPxNV41MArcPmsF0dYhQ8XunPPnLXcm3QqK5C/ybDE=; b=mNfYJFQ6z2K6yqgLx52q7ABbFzP0ygnxSi8ED0FMQyZHPSs8T/rzTl3DseK4nQ3+3i hKZLflGZU37t7mVd0s5tUH3nFCUWNZYniCNoPgwkJ1wFYgGhLKFxoa/ArMC5TgRTTev6 1hK7xK1adWgR7FkYburMsu1kIQcYqgV94Xo6M3TcyNXR6ooG4et8TzVlvoWabMyhKnML 63P+G+zZWOZD0sFiJGsjATA8G1nGDpJXzRl/a6mzunIoZwFn8BP6yoARhzn3gbrNixoE hDXpTCdbHvonOzvHFBVKEdsuv3kpZ61kAYNtwiRXbjuPSi4VkCNYOdQjhhgH9frmsj+a FK9Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o124si8037274pfb.256.2018.12.05.12.26.06; Wed, 05 Dec 2018 12:26:22 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728269AbeLEUYS (ORCPT + 99 others); Wed, 5 Dec 2018 15:24:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45568 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727388AbeLEUYR (ORCPT ); Wed, 5 Dec 2018 15:24:17 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 369193082A34; Wed, 5 Dec 2018 20:24:17 +0000 (UTC) Received: from redhat.com (dhcp-17-208.bos.redhat.com [10.18.17.208]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 392485D756; Wed, 5 Dec 2018 20:24:15 +0000 (UTC) Date: Wed, 5 Dec 2018 15:24:14 -0500 From: Joe Lawrence To: Petr Mladek Cc: Jiri Kosina , Josh Poimboeuf , Miroslav Benes , Jason Baron , Evgenii Shatokhin , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v14 10/11] livepatch: Remove ordering and refuse loading conflicting patches Message-ID: <20181205202414.ba3an6q24cj6hxmf@redhat.com> References: <20181129094431.7801-1-pmladek@suse.com> <20181129094431.7801-11-pmladek@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181129094431.7801-11-pmladek@suse.com> User-Agent: Mutt/1.6.2-neo (2016-08-08) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Wed, 05 Dec 2018 20:24:17 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Nov 29, 2018 at 10:44:30AM +0100, Petr Mladek wrote: > The atomic replace and cumulative patches were introduced as a more secure > way to handle dependent patches. They simplify the logic: > > + Any new cumulative patch is supposed to take over shadow variables > and changes made by callbacks from previous livepatches. > > + All replaced patches are discarded and the modules can be unloaded. > As a result, there is only one scenario when a cumulative livepatch > gets disabled. > > The different handling of "normal" and cumulative patches might cause > confusion. It would make sense to keep only one mode. On the other hand, > it would be rude to enforce using the cumulative livepatches even for > trivial and independent (hot) fixes. > > This patch removes the stack of patches. The list of enabled patches > is still needed but the ordering is not longer enforced. ^^^^^^^^^^ s/not longer/no longer > > Note that it is not possible to catch all possible dependencies. It is > the responsibility of the livepatch authors to decide. > > Nevertheless this patch prevents having two patches for the same function > enabled at the same time after the transition finishes. It might help > to catch obvious mistakes. But more importantly, we do not need to > handle situation when a patch in the middle of the function stack ^^^^^^^^^^^^^^^^ s/handle situation/handle a situation > (ops->func_stack) is being removed. > > Signed-off-by: Petr Mladek > --- Acked-by: Joe Lawrence > Documentation/livepatch/cumulative-patches.txt | 11 ++---- > Documentation/livepatch/livepatch.txt | 30 ++++++++------- > kernel/livepatch/core.c | 51 ++++++++++++++++++++++++-- > 3 files changed, 68 insertions(+), 24 deletions(-) > > > [ ... snip ... ] > > diff --git a/Documentation/livepatch/livepatch.txt b/Documentation/livepatch/livepatch.txt > index ba6e83a08209..3c150ab19b99 100644 > --- a/Documentation/livepatch/livepatch.txt > +++ b/Documentation/livepatch/livepatch.txt > @@ -143,9 +143,9 @@ without HAVE_RELIABLE_STACKTRACE are not considered fully supported by > the kernel livepatching. > > The /sys/kernel/livepatch//transition file shows whether a patch > -is in transition. Only a single patch (the topmost patch on the stack) > -can be in transition at a given time. A patch can remain in transition > -indefinitely, if any of the tasks are stuck in the initial patch state. > +is in transition. Only a single patch can be in transition at a given > +time. A patch can remain in transition indefinitely, if any of the tasks > +are stuck in the initial patch state. > > A transition can be reversed and effectively canceled by writing the > opposite value to the /sys/kernel/livepatch//enabled file while > @@ -329,9 +329,10 @@ The livepatch gets enabled by calling klp_enable_patch() typically from > module_init() callback. The system will start using the new implementation > of the patched functions at this stage. > > -First, the addresses of the patched functions are found according to their > -names. The special relocations, mentioned in the section "New functions", > -are applied. The relevant entries are created under > +First, possible conflicts are checked for non-cummulative patches with ^^^^^^^^^^^^^^^ s/non-cummulative/non-cumulative > > [ ... snip ... ] > > diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c > index 0ce752e9e8bb..d8f6f49ac6b3 100644 > --- a/kernel/livepatch/core.c > +++ b/kernel/livepatch/core.c > @@ -122,6 +122,47 @@ static struct klp_object *klp_find_object(struct klp_patch *patch, > return NULL; > } > > +static int klp_check_obj_conflict(struct klp_patch *patch, > + struct klp_object *old_obj) > +{ > + struct klp_object *obj; > + struct klp_func *func, *old_func; > + > + obj = klp_find_object(patch, old_obj); > + if (!obj) > + return 0; > + > + klp_for_each_func(old_obj, old_func) { > + func = klp_find_func(obj, old_func); > + if (!func) > + continue; > + > + pr_err("Function '%s,%lu' in object '%s' has already been livepatched.\n", > + func->old_name, func->old_sympos ? func->old_sympos : 1, > + obj->name ? obj->name : "vmlinux"); > + return -EINVAL; > + } > + > + return 0; > +} Should we add a self-test check for this condition? Let me know and I can give it a go if you want to include with v15. -- Joe