From patchwork Fri Nov 2 09:00:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Axtens X-Patchwork-Id: 992208 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42mbd92JFtzB4Tq; Fri, 2 Nov 2018 20:00:29 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1gIVJW-0005Xe-R2; Fri, 02 Nov 2018 09:00:22 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.86_2) (envelope-from ) id 1gIVJV-0005X9-B3 for kernel-team@lists.canonical.com; Fri, 02 Nov 2018 09:00:21 +0000 Received: from mail-qk1-f197.google.com ([209.85.222.197]) by youngberry.canonical.com with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1gIVJV-0003LK-17 for kernel-team@lists.canonical.com; Fri, 02 Nov 2018 09:00:21 +0000 Received: by mail-qk1-f197.google.com with SMTP id 92so2663567qkx.19 for ; Fri, 02 Nov 2018 02:00:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=FGqhxCIinGU5fmSR2qTWyAKGwfRmWTmN2mfgdCwI+aI=; b=RfuVbqZUmxFbiPARXeeRcyKFfBFtYNg4lxAwNpa1wj2goeHm6YimI0O/eOkiflWb4y urGqC2tldt4lnbmRo78dfdu2BLzU0ZiQmyE7bhZggjrs4uztGpmI/GlvoLJrivneJZsN n4yqu2soJjCY0xqsY69BAOm9vcWVkbYsVrPd401AO68c2BcovVuVRJ2plQiaUnSXMxAi dpLGlcjzE2CL76WHb0i2rJL9ZkgNrOpQ8IRffqGorD4SsXTNkLD/1pMVjcymp0PZ7Qai lf+yiHjBREpz5dt74r2QFQUWbPYl8ntcA70JaWWND5YfwThtdOLm5pWpu2G3+DHslgjy mNQA== X-Gm-Message-State: AGRZ1gKfsiAUsqbPKrzEbrWp/JszdNJIfLDAQb7Wj6aAJLKBHg5kDvIi faY9PPCXzAs8rRHy90HQc+RkEXZpIXvtK4qGtn5+6PtPOGHoLCXSr0X29zEZ7QPx/A948er1muS iQbGKTK2OaHWkDjFYogv98J7QSSzZAuLtUXtgtqaftZb+Uwxq X-Received: by 2002:a37:6b42:: with SMTP id g63mr9498766qkc.297.1541149220045; Fri, 02 Nov 2018 02:00:20 -0700 (PDT) X-Google-Smtp-Source: AJdET5e6+7cOg60ZCyx/bNrVG/YXkTBujVQcM9E1jhAryEmHJdoWINNs43n6wHfaOHtvJ1jjkOeO3A== X-Received: by 2002:a37:6b42:: with SMTP id g63mr9498760qkc.297.1541149219851; Fri, 02 Nov 2018 02:00:19 -0700 (PDT) Received: from linkitivity.iinet.net.au ([2001:67c:1562:8007::aac:4356]) by smtp.gmail.com with ESMTPSA id a4-v6sm23521783qkb.62.2018.11.02.02.00.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 02 Nov 2018 02:00:19 -0700 (PDT) From: Daniel Axtens To: kernel-team@lists.canonical.com Subject: [SRU bionic-aws][PATCH 1/6] xen/manage: keep track of the on-going suspend mode Date: Fri, 2 Nov 2018 20:00:05 +1100 Message-Id: <20181102090010.2643-2-daniel.axtens@canonical.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181102090010.2643-1-daniel.axtens@canonical.com> References: <20181102090010.2643-1-daniel.axtens@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Munehisa Kamata BugLink: https://bugs.launchpad.net/bugs/1801305 To differentiate between Xen suspend, PM suspend and PM hibernation, keep track of the on-going suspend mode by mainly using a new PM notifier. Since Xen suspend doesn't have corresponding PM event, its main logic is modfied to acquire pm_mutex and set the current mode. Note that we may see deadlock if PM suspend/hibernation is interrupted by Xen suspend. PM suspend/hibernation depends on xenwatch thread to process xenbus state transactions, but the thread will sleep to wait pm_mutex which is already held by PM suspend/hibernation context in the scenario. Though, acquirng pm_mutex is still right thing to do, and we would need to modify Xen shutdown code to avoid the issue. This will be fixed by a separate patch. Signed-off-by: Munehisa Kamata Signed-off-by: Anchal Agarwal Reviewed-by: Sebastian Biemueller Reviewed-by: Munehisa Kamata Reviewed-by: Eduardo Valentin CR: https://cr.amazon.com/r/8273194/ (cherry-picked from 0013-xen-manage-keep-track-of-the-on-going-suspend-mode.patch in AWS 4.14 kernel SRPM) Signed-off-by: Daniel Axtens --- drivers/xen/manage.c | 58 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index 8835065029d3..8f9ea87ba93e 100644 --- a/drivers/xen/manage.c +++ b/drivers/xen/manage.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,16 @@ enum shutdown_state { /* Ignore multiple shutdown requests. */ static enum shutdown_state shutting_down = SHUTDOWN_INVALID; +enum suspend_modes { + NO_SUSPEND = 0, + XEN_SUSPEND, + PM_SUSPEND, + PM_HIBERNATION, +}; + +/* Protected by pm_mutex */ +static enum suspend_modes suspend_mode = NO_SUSPEND; + struct suspend_info { int cancelled; }; @@ -98,6 +109,10 @@ static void do_suspend(void) int err; struct suspend_info si; + lock_system_sleep(); + + suspend_mode = XEN_SUSPEND; + shutting_down = SHUTDOWN_SUSPEND; err = freeze_processes(); @@ -161,6 +176,10 @@ static void do_suspend(void) thaw_processes(); out: shutting_down = SHUTDOWN_INVALID; + + suspend_mode = NO_SUSPEND; + + unlock_system_sleep(); } #endif /* CONFIG_HIBERNATE_CALLBACKS */ @@ -372,3 +391,42 @@ int xen_setup_shutdown_event(void) EXPORT_SYMBOL_GPL(xen_setup_shutdown_event); subsys_initcall(xen_setup_shutdown_event); + +static int xen_pm_notifier(struct notifier_block *notifier, + unsigned long pm_event, void *unused) +{ + switch (pm_event) { + case PM_SUSPEND_PREPARE: + suspend_mode = PM_SUSPEND; + break; + case PM_HIBERNATION_PREPARE: + case PM_RESTORE_PREPARE: + suspend_mode = PM_HIBERNATION; + break; + case PM_POST_SUSPEND: + case PM_POST_RESTORE: + case PM_POST_HIBERNATION: + /* Set back to the default */ + suspend_mode = NO_SUSPEND; + break; + default: + pr_warn("Receive unknown PM event 0x%lx\n", pm_event); + return -EINVAL; + } + + return 0; +}; + +static struct notifier_block xen_pm_notifier_block = { + .notifier_call = xen_pm_notifier +}; + +static int xen_setup_pm_notifier(void) +{ + if (!xen_hvm_domain()) + return -ENODEV; + + return register_pm_notifier(&xen_pm_notifier_block); +} + +subsys_initcall(xen_setup_pm_notifier);