Received: by 10.223.185.116 with SMTP id b49csp8082293wrg; Thu, 1 Mar 2018 17:02:12 -0800 (PST) X-Google-Smtp-Source: AG47ELuTf2JrqP3thJN0UIGQC5QgrY8CmYcP9G7Aprtgcqz2u8MwJ5ihKob9X22W8qodxl+bADB+ X-Received: by 2002:a17:902:bd94:: with SMTP id q20-v6mr3600690pls.247.1519952531993; Thu, 01 Mar 2018 17:02:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519952531; cv=none; d=google.com; s=arc-20160816; b=wY22lZeA28XAX/wMVv+eeLpwX2uNziUh4+/gIvMeRO4LbClYLNgQKJWYCFj7SljY/B dQIQE1JzlDIjsmQ4+pMwDUzbaB8zilU74ftN5OcugJjCLjdHUZJWfj5nqNget/X6gjHy pg7l0iOS5gYppIzz/gUcSB0b6B2Hqk18nFHbNj/Ouxnw3oPx2d9m69rHCEhDMPGsw9k7 QGXUfl+oXPo+as8cMak9PbG4wlchMMlDp2XLs4BUOu2urqk5w/FBqw00eYnNj1owEOOJ WzKcXMvgiWjyqDLoIEn43c1vZyvu+2zTRFU05EGiAxfhqvhzzpC2dRDJeR8ElBJFF2lL fzkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:cc:subject:date:to :from:arc-authentication-results; bh=oMZiuk0VCC7XmlTTBqDVmFIuUIuFs7cmskFqRD8Dpzo=; b=YJAV9yhuhcZlLchwsx+98rZUjQD0MtIdNDrVGgyqT+v8AsaI4kXpRbN0PW14DFKT4Q 2X+65dVRmuQQ2uadstM/11HzTgGbymCs2nTEsdmJtci+7z5rcjKY53qhkwDGVIlEPhhX 5aKaejq9BqLhgJ/Pd8i2+GfPHz28N8bfGo9KMHfzvOBWUP5BjC0tF/PT+oZGRi1QD7z4 3Fv9DvGFxKcF9AsdBVy4uHFlK4Vqtj+jLjr+3io/X2vgax5kxIqX5ObiIXjj4bgqus2G 9l0DsYdbvprXAFaHg7nWL2WcsfnJsAMWsgsKOQCS+r5vSFDa6ycufzv1OC9H35cgZQIT lTKg== 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 o128si3879168pfo.68.2018.03.01.17.01.57; Thu, 01 Mar 2018 17:02:11 -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 S1163375AbeCAXdi (ORCPT + 99 others); Thu, 1 Mar 2018 18:33:38 -0500 Received: from mx2.suse.de ([195.135.220.15]:54250 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1163009AbeCAXdd (ORCPT ); Thu, 1 Mar 2018 18:33:33 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1DCB1B46D; Thu, 1 Mar 2018 23:33:32 +0000 (UTC) From: NeilBrown To: Oleg Drokin , Greg Kroah-Hartman , James Simmons , Andreas Dilger Date: Fri, 02 Mar 2018 10:31:25 +1100 Subject: [PATCH 11/17] staging: lustre: ptlrpc: use workqueue for pinger Cc: Linux Kernel Mailing List , Lustre Development List Message-ID: <151994708541.7628.5813099904100247526.stgit@noble> In-Reply-To: <151994679573.7628.1024109499321778846.stgit@noble> References: <151994679573.7628.1024109499321778846.stgit@noble> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org lustre has a "Pinger" kthread which periodically pings peers to ensure all hosts are functioning. This can more easily be done using a work queue. As maintaining contact with other peers is import for keeping the filesystem running, and as the filesystem might be involved in freeing memory, it is safest to have a separate WQ_MEM_RECLAIM workqueue. The SVC_EVENT functionality to wake up the thread can be replaced with mod_delayed_work(). Also use round_jiffies_up_relative() rather than setting a minimum of 1 second delay. The PING_INTERVAL is measured in seconds so this meets the need is allow the workqueue to keep wakeups synchronized. Signed-off-by: NeilBrown --- drivers/staging/lustre/lustre/ptlrpc/pinger.c | 81 +++++++------------------ 1 file changed, 24 insertions(+), 57 deletions(-) diff --git a/drivers/staging/lustre/lustre/ptlrpc/pinger.c b/drivers/staging/lustre/lustre/ptlrpc/pinger.c index b5f3cfee8e75..0775b7a048bb 100644 --- a/drivers/staging/lustre/lustre/ptlrpc/pinger.c +++ b/drivers/staging/lustre/lustre/ptlrpc/pinger.c @@ -217,21 +217,18 @@ static void ptlrpc_pinger_process_import(struct obd_import *imp, } } -static int ptlrpc_pinger_main(void *arg) -{ - struct ptlrpc_thread *thread = arg; - - /* Record that the thread is running */ - thread_set_flags(thread, SVC_RUNNING); - wake_up(&thread->t_ctl_waitq); +static struct workqueue_struct *pinger_wq; +static void ptlrpc_pinger_main(struct work_struct *ws); +static DECLARE_DELAYED_WORK(ping_work, ptlrpc_pinger_main); - /* And now, loop forever, pinging as needed. */ - while (1) { - unsigned long this_ping = cfs_time_current(); - long time_to_next_wake; - struct timeout_item *item; - struct obd_import *imp; +static void ptlrpc_pinger_main(struct work_struct *ws) +{ + unsigned long this_ping = cfs_time_current(); + long time_to_next_wake; + struct timeout_item *item; + struct obd_import *imp; + do { mutex_lock(&pinger_mutex); list_for_each_entry(item, &timeout_list, ti_chain) { item->ti_cb(item, item->ti_cb_data); @@ -260,50 +257,24 @@ static int ptlrpc_pinger_main(void *arg) time_to_next_wake, cfs_time_add(this_ping, PING_INTERVAL * HZ)); - if (time_to_next_wake > 0) { - wait_event_idle_timeout(thread->t_ctl_waitq, - thread_is_stopping(thread) || - thread_is_event(thread), - max_t(long, time_to_next_wake, HZ)); - if (thread_test_and_clear_flags(thread, SVC_STOPPING)) - break; - /* woken after adding import to reset timer */ - thread_test_and_clear_flags(thread, SVC_EVENT); - } - } + } while (time_to_next_wake <= 0); - thread_set_flags(thread, SVC_STOPPED); - wake_up(&thread->t_ctl_waitq); - - CDEBUG(D_NET, "pinger thread exiting, process %d\n", current_pid()); - return 0; + queue_delayed_work(pinger_wq, &ping_work, + round_jiffies_up_relative(time_to_next_wake)); } -static struct ptlrpc_thread pinger_thread; - int ptlrpc_start_pinger(void) { - struct task_struct *task; - int rc; - - if (!thread_is_init(&pinger_thread) && - !thread_is_stopped(&pinger_thread)) + if (pinger_wq) return -EALREADY; - init_waitqueue_head(&pinger_thread.t_ctl_waitq); - - strcpy(pinger_thread.t_name, "ll_ping"); - - task = kthread_run(ptlrpc_pinger_main, &pinger_thread, - pinger_thread.t_name); - if (IS_ERR(task)) { - rc = PTR_ERR(task); - CERROR("cannot start pinger thread: rc = %d\n", rc); - return rc; + pinger_wq = alloc_workqueue("ptlrpc_pinger", WQ_MEM_RECLAIM, 1); + if (!pinger_wq) { + CERROR("cannot start pinger workqueue\n"); + return -ENOMEM; } - wait_event_idle(pinger_thread.t_ctl_waitq, - thread_is_running(&pinger_thread)); + queue_delayed_work(pinger_wq, &ping_work, 0); return 0; } @@ -313,16 +284,13 @@ int ptlrpc_stop_pinger(void) { int rc = 0; - if (thread_is_init(&pinger_thread) || - thread_is_stopped(&pinger_thread)) + if (!pinger_wq) return -EALREADY; ptlrpc_pinger_remove_timeouts(); - thread_set_flags(&pinger_thread, SVC_STOPPING); - wake_up(&pinger_thread.t_ctl_waitq); - - wait_event_idle(pinger_thread.t_ctl_waitq, - thread_is_stopped(&pinger_thread)); + cancel_delayed_work_sync(&ping_work); + destroy_workqueue(pinger_wq); + pinger_wq = NULL; return rc; } @@ -505,6 +473,5 @@ static int ptlrpc_pinger_remove_timeouts(void) void ptlrpc_pinger_wake_up(void) { - thread_add_flags(&pinger_thread, SVC_EVENT); - wake_up(&pinger_thread.t_ctl_waitq); + mod_delayed_work(pinger_wq, &ping_work, 0); }