Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp9148407ybl; Fri, 17 Jan 2020 07:07:25 -0800 (PST) X-Google-Smtp-Source: APXvYqyVXvnkhB9eM+zUXODqWpugE7kHzRjBPN43I2rQpy+sLbHm2AdxYQrFz/0PxB3/B510FFpm X-Received: by 2002:a9d:3ea:: with SMTP id f97mr6155042otf.42.1579273645278; Fri, 17 Jan 2020 07:07:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579273645; cv=none; d=google.com; s=arc-20160816; b=vlGKIzm18sPB+KLS+VEK+NIPvjaon69wFTZqEa+stoDuMGxtygeZTCVtW9+UbvGEvM vfOns618dgItQsrKHiqEbzApczc1OfToNoUseNMb+nRECin7sIHNGLjOCkDCCAbmfqT+ cHOjYQ97QR7GLPKzvvZpC5PEbUNT9vI2XpoDEMAlfropKsVaAb96PQ35AIGmxyELR4XC vcCYxpMnFjajKFMMIl5F8cYe0x5VlCkBP5XLhoDNFRc/XXVjoO9zvrogXEiorXckSk6Q 3HONrWccHI89zlO1HDHZ5kXZtbtWrhbIiUTXVvTwZK4XXkUBtLOrjcMVvsKzFqTCnA0j BLCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=78efupdkgy6ECOWXy64Sc2LddoDVCqSsJ7w/NiWV504=; b=KW/2aiHB0vHcckOvjC+GvtbZ8NdzxNhxoAIDqmo5axr8fHmrIOz8i+lEvcXL7dnuon pq/LjBCiQ2XweepMz1ZLvrsVM/PBqYiP/0S1Oh11qn5RRaHNq58Kz26z/YlRQ6s7Qza9 kXV/WdNbqw38F0/6u1eJplaEvl1q2HhyfSN44e5kDC3VpShBF0IkEXi08F5hNoCO7mB8 /32OzeuSL/c8Vg4Ialm8XDJMp6BvWi7iAJu3RgbFKFyJic9WjC9O3k+0qouhO0TCePhw 6tiWOFOBl+deeQcHaEAlIqXOgaoJkgrLnp4bWAqDoChuwam3DqElsh+iuufyAC91ZEaH Oqlw== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z15si19458144otj.235.2020.01.17.07.07.12; Fri, 17 Jan 2020 07:07:25 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729113AbgAQPD7 (ORCPT + 99 others); Fri, 17 Jan 2020 10:03:59 -0500 Received: from mx2.suse.de ([195.135.220.15]:46120 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729066AbgAQPD6 (ORCPT ); Fri, 17 Jan 2020 10:03:58 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 952F1AFA8; Fri, 17 Jan 2020 15:03:56 +0000 (UTC) From: Petr Mladek To: Jiri Kosina , Josh Poimboeuf , Miroslav Benes Cc: Joe Lawrence , Kamalesh Babulal , Nicolai Stange , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, Petr Mladek Subject: [POC 05/23] livepatch: Initialize and free livepatch submodule Date: Fri, 17 Jan 2020 16:03:05 +0100 Message-Id: <20200117150323.21801-6-pmladek@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200117150323.21801-1-pmladek@suse.com> References: <20200117150323.21801-1-pmladek@suse.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Another step when loading livepatches to livepatch modules is to initialize the structure, create sysfs entries, do livepatch specific relocations. These operation can fail and the objects must be freed that case. The error message is taken from klp_module_coming() to match selftests. Signed-off-by: Petr Mladek --- kernel/livepatch/core.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index e2c7dc6c2d5f..6c27b635e5a7 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -583,18 +583,23 @@ static void klp_free_object_loaded(struct klp_object *obj) } } +static void klp_free_object(struct klp_object *obj, bool nops_only) +{ + __klp_free_funcs(obj, nops_only); + + if (nops_only && !obj->dynamic) + return; + + list_del(&obj->node); + kobject_put(&obj->kobj); +} + static void __klp_free_objects(struct klp_patch *patch, bool nops_only) { struct klp_object *obj, *tmp_obj; klp_for_each_object_safe(patch, obj, tmp_obj) { - __klp_free_funcs(obj, nops_only); - - if (nops_only && !obj->dynamic) - continue; - - list_del(&obj->node); - kobject_put(&obj->kobj); + klp_free_object(obj, nops_only); } } @@ -812,6 +817,8 @@ static int klp_init_object_early(struct klp_patch *patch, if (obj->dynamic || try_module_get(obj->mod)) return 0; + /* patch stays when this function fails in klp_add_object() */ + list_del(&obj->node); return -ENODEV; } @@ -993,9 +1000,22 @@ int klp_add_object(struct klp_object *obj) goto err; } + ret = klp_init_object_early(patch, obj); + if (ret) + goto err; + + ret = klp_init_object(patch, obj); + if (ret) { + pr_warn("failed to initialize patch '%s' for module '%s' (%d)\n", + patch->obj->patch_name, obj->name, ret); + goto err_free; + } + mutex_unlock(&klp_mutex); return 0; +err_free: + klp_free_object(obj, false); err: /* * If a patch is unsuccessfully applied, return -- 2.16.4