From patchwork Mon Jun 19 09:14:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans Dedecker X-Patchwork-Id: 777650 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wrlgf3gKsz9s71 for ; Mon, 19 Jun 2017 19:15:26 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ShPv8ekf"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="FPRqN0ct"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Subject:Message-Id: Date:To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=PNWoUxO2vqBFpdS3YpQkLOCXNAfGeJZREbVPgVA+0EM=; b=ShPv8ekfHt5zS6 7WeIFWlWi1sYfq75WfwxmIk3TwdCnrfwL8kqa6rPcApkxd2dkWW2fjsqwoFsByG1Z/k6rJsKRixS0 wqkfIBtIOvQH4NHt65rlBKmwBrT5pv9A9HxFjp8ikey5X7wd2J5C8FTlZzXLlY8Q4J22Ygsw7TPpW 6P49mukteU4+Ur3HxUlK2+5/1b67hJymo9DOvUpYwlYZwQm4umv0OcaILBA25YG8HRQCJpYshpGTi i2LPFMJE4FTDiznYQq6907GZDv/lbp8GWjVTzGQjgu69moPtVJ5v1Ocnpo5E0hdB4aPsknGoUpGZy gBuTJgzLv5kydChzzxQQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1dMsly-0004Vi-Vj; Mon, 19 Jun 2017 09:15:03 +0000 Received: from mail-io0-x241.google.com ([2607:f8b0:4001:c06::241]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dMslv-0004Pg-Dn for lede-dev@lists.infradead.org; Mon, 19 Jun 2017 09:15:01 +0000 Received: by mail-io0-x241.google.com with SMTP id a96so10618612ioj.1 for ; Mon, 19 Jun 2017 02:14:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=YMivpGq8or5YmnLvU9Gxt6ZWsw06C9HRaTRYjDzUdgM=; b=FPRqN0ctgTS1NckNYPfLRYk4df9xXw7TrlS9cihJNPrLKQZ2GGl3QTrMIqM7UTtyAL GQsCh1IKmBzq+GxL2k8a3R8s/oNRg0psafSi3VXr6Yv7K8+rPWJw0ZKUJCVZ9SMM6F7N f1iPhFLfVPneIjehLs6IxceSts5k+bq+FQ6V8vYbVlo/hl2H6cXkopn2Jqsf4G0tqVR7 hT7kLQ5LS1H7Hl73sYtFlDSZ70oKdf35rgk0IQE9iL+FZM3mXH00cTrjoDPU9+mdZddV cxi2d6DVukOv1w4oEsUxNIcdvkXflb2jP9inc/ttTTol/Apk2NhwNB4RsN96tM4x36S0 PFnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=YMivpGq8or5YmnLvU9Gxt6ZWsw06C9HRaTRYjDzUdgM=; b=RfZNtAC3fF4Sry87BSJ+kjHTLFDc2EJkgvHMIlO72SdtlSuwGhq+6ZdE6qv276X3F/ +5ILrZ1XES7AvsGHkaeRWom2DAn+RYyvMuRTiiIpjy0owA79+Pu9TBs1BxovlcVJlcAo JeQD7s1Ob5hYDLUCswImm08Bycs2ERwMQgOZuTCg6DVqoMXnRggGqgmnfUFwCr3OdmI/ rEjQHtHPpNzuZMJU6anFCx6Wem1G6U9R+bqmjZU1Q69Vrv3e3W0mxAQs62ZkhyDfPEHC AIw9wl+Ei5XeSRTDwB4C6IErp4Dv3EsQBbdR0L/hIxaKHr2+01rH0PqtGlHeRQz8dHj8 bnzg== X-Gm-Message-State: AKS2vOwBrhPWgOCq/lZDoI1W7tLO+4lz/GSbEGLP21VX9T43aYNctfKx RqK5nrTZqrkJLQ== X-Received: by 10.107.59.211 with SMTP id i202mr20651293ioa.159.1497863678024; Mon, 19 Jun 2017 02:14:38 -0700 (PDT) Received: from cplx43.eu.thmulti.com ([141.11.62.7]) by smtp.gmail.com with ESMTPSA id a11sm5503718ioj.4.2017.06.19.02.14.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 19 Jun 2017 02:14:37 -0700 (PDT) From: Hans Dedecker To: john@phrozen.org, lede-dev@lists.infradead.org Date: Mon, 19 Jun 2017 11:14:27 +0200 Message-Id: <1497863667-31606-1-git-send-email-dedeckeh@gmail.com> X-Mailer: git-send-email 1.9.1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170619_021459_529330_6FD93F2C X-CRM114-Status: GOOD ( 15.99 ) X-Spam-Score: -2.7 (--) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-2.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [2607:f8b0:4001:c06:0:0:0:241 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dedeckeh[at]gmail.com) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature Subject: [LEDE-DEV] [PATCH procd] watchdog: add support for starting/stopping kernel watchdog X-BeenThere: lede-dev@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hans Dedecker MIME-Version: 1.0 Sender: "Lede-dev" Errors-To: lede-dev-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Extend the ubus watchdog cmd with the parameter magicclose; when set and in case the stopped parameter is enabled the kernel watchdog will be stopped by first sending the magic character 'V' followed by a close of the watchdog fd. In case stopped is set to disabled the watchdog fd will be created again. Signed-off-by: Hans Dedecker Acked-by: John Crispin --- system.c | 6 +++++ watchdog.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++--------------- watchdog.h | 10 +++++++++ 3 files changed, 74 insertions(+), 18 deletions(-) diff --git a/system.c b/system.c index 4bbceee..a5d197e 100644 --- a/system.c +++ b/system.c @@ -245,6 +245,7 @@ static int system_reboot(struct ubus_context *ctx, struct ubus_object *obj, enum { WDT_FREQUENCY, WDT_TIMEOUT, + WDT_MAGICCLOSE, WDT_STOP, __WDT_MAX }; @@ -252,6 +253,7 @@ enum { static const struct blobmsg_policy watchdog_policy[__WDT_MAX] = { [WDT_FREQUENCY] = { .name = "frequency", .type = BLOBMSG_TYPE_INT32 }, [WDT_TIMEOUT] = { .name = "timeout", .type = BLOBMSG_TYPE_INT32 }, + [WDT_MAGICCLOSE] = { .name = "magicclose", .type = BLOBMSG_TYPE_BOOL }, [WDT_STOP] = { .name = "stop", .type = BLOBMSG_TYPE_BOOL }, }; @@ -286,6 +288,9 @@ static int watchdog_set(struct ubus_context *ctx, struct ubus_object *obj, watchdog_timeout(timeout); } + if (tb[WDT_MAGICCLOSE]) + watchdog_set_magicclose(blobmsg_get_bool(tb[WDT_MAGICCLOSE])); + if (tb[WDT_STOP]) watchdog_set_stopped(blobmsg_get_bool(tb[WDT_STOP])); @@ -300,6 +305,7 @@ static int watchdog_set(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_add_string(&b, "status", status); blobmsg_add_u32(&b, "timeout", watchdog_timeout(0)); blobmsg_add_u32(&b, "frequency", watchdog_frequency(0)); + blobmsg_add_u8(&b, "magicclose", watchdog_get_magicclose()); ubus_send_reply(ctx, req, b.head); return 0; diff --git a/watchdog.c b/watchdog.c index 780b321..97c8337 100644 --- a/watchdog.c +++ b/watchdog.c @@ -31,6 +31,7 @@ static struct uloop_timeout wdt_timeout; static int wdt_fd = -1; static int wdt_frequency = 5; +static bool wdt_magicclose = false; void watchdog_ping(void) { @@ -45,12 +46,66 @@ static void watchdog_timeout_cb(struct uloop_timeout *t) uloop_timeout_set(t, wdt_frequency * 1000); } +static int watchdog_open(bool cloexec) +{ + char *env = getenv("WDTFD"); + + if (wdt_fd >= 0) + return wdt_fd; + + if (env) { + DEBUG(2, "Watchdog handover: fd=%s\n", env); + wdt_fd = atoi(env); + unsetenv("WDTFD"); + } else { + wdt_fd = open(WDT_PATH, O_WRONLY); + } + + if (wdt_fd < 0) + return wdt_fd; + + if (cloexec) + fcntl(wdt_fd, F_SETFD, fcntl(wdt_fd, F_GETFD) | FD_CLOEXEC); + + return wdt_fd; +} + +static void watchdog_close(void) +{ + if (wdt_fd < 0) + return; + + if (write(wdt_fd, "V", 1) < 0) + ERROR("WDT failed to write release: %s\n", strerror(errno)); + + if (close(wdt_fd) == -1) + ERROR("WDT failed to close watchdog: %s\n", strerror(errno)); + + wdt_fd = -1; +} + +void watchdog_set_magicclose(bool val) +{ + wdt_magicclose = val; +} + +bool watchdog_get_magicclose(void) +{ + return wdt_magicclose; +} + void watchdog_set_stopped(bool val) { - if (val) + if (val) { uloop_timeout_cancel(&wdt_timeout); - else + + if (wdt_magicclose) + watchdog_close(); + } + else { + watchdog_open(true); watchdog_timeout_cb(&wdt_timeout); + } } bool watchdog_get_stopped(void) @@ -98,26 +153,11 @@ char* watchdog_fd(void) void watchdog_init(int preinit) { - char *env = getenv("WDTFD"); - - if (wdt_fd >= 0) - return; - wdt_timeout.cb = watchdog_timeout_cb; - if (env) { - DEBUG(2, "Watchdog handover: fd=%s\n", env); - wdt_fd = atoi(env); - unsetenv("WDTFD"); - } else { - wdt_fd = open("/dev/watchdog", O_WRONLY); - } - if (wdt_fd < 0) + if (watchdog_open(!preinit) < 0) return; - if (!preinit) - fcntl(wdt_fd, F_SETFD, fcntl(wdt_fd, F_GETFD) | FD_CLOEXEC); - LOG("- watchdog -\n"); watchdog_timeout(30); watchdog_timeout_cb(&wdt_timeout); diff --git a/watchdog.h b/watchdog.h index 3c4a487..fd9aed2 100644 --- a/watchdog.h +++ b/watchdog.h @@ -22,6 +22,8 @@ void watchdog_init(int preinit); char* watchdog_fd(void); int watchdog_timeout(int timeout); int watchdog_frequency(int frequency); +void watchdog_set_magicclose(bool val); +bool watchdog_get_magicclose(void); void watchdog_set_stopped(bool val); bool watchdog_get_stopped(void); void watchdog_set_cloexec(bool val); @@ -46,6 +48,14 @@ static inline int watchdog_frequency(int frequency) return 0; } +static inline void watchdog_set_magicclose(bool val) +{ +} + +static inline void watchdog_get_magicclose(bool val) +{ +} + static inline void watchdog_set_stopped(bool val) { }