From patchwork Sun Dec 16 19:48:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 153952 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp1734637ljp; Sun, 16 Dec 2018 11:49:32 -0800 (PST) X-Google-Smtp-Source: AFSGD/WBMj6ix9LiyClZ5J1i2pOy1wYNNRViF6eqa476lZMLGznCwDGcGT5nPMq6Z2iHWdyBdelM X-Received: by 2002:a63:f515:: with SMTP id w21mr9744737pgh.220.1544989772119; Sun, 16 Dec 2018 11:49:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544989772; cv=none; d=google.com; s=arc-20160816; b=xqwwhB/PKqPJhiE3LukPOrHXDuSdoX8GtGOdSTe5LUXOcLazKJvIrncuUlp74YCnpt 3NlPf+5KBxT0A+FlrS+Ir20QYzWpbdBU1Fqjaw8g5Z4zle7Jt8Rb+wXQCaBlwfGSZoVv H3E6fdbgXsP/6aN7+3ewWYnHcaR31kOxbH2UBWCXI3LTlOHdsbNh4ja6mBLvR/ntfmiS h5RCVT0QQO1NWqYPgfNBUdHHuPEMjY77F+zxpfhEzjv6I3NwowcDbfT3gr08icKyXP7L INn2sDGjkcn4JH3Ec3Vjo1OneE880zy7lmDINyulPYYZ+siC2gNCVRQQhpgxX2mMzbtT TyRg== 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 :message-id:date:subject:cc:to:from; bh=YD1XJtxtUUAFy/xYFXyepAhPOj4t33aOqYe+jKx69es=; b=dtMA6OMwVkzoGTyYPF4VD0zN85X/+7+gy/bCHq8FLIs11muXqKO17BoryyOR4s2fxl zPy6WAu6W6dpZEXKXzDPu12Tlc42Nua7pV62MYB/tpv0Usp8HuPbTcIksV6R328JRj7Q rEb5oPYZBAQld35HEBdKeSGyP8CmXeXT/Z71erR6SYfX8e+Wo7CpxAp2HR93kWaEoJk1 xIZu+gFi3JRaVhF2/fJJU5EjYaWQOeT68p13Wj3JbsghzH+jhyIIx53UTXvrTzJZjNIU iwtPeTJ+0JiV0O0s1agJIm5cs6DwxTUVbalL7ieYS70tY82N8Cfs6JUDpWK3WhFrz63v eXeQ== 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 j29si9702680pga.550.2018.12.16.11.49.31; Sun, 16 Dec 2018 11:49:32 -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 S1730905AbeLPTta (ORCPT + 31 others); Sun, 16 Dec 2018 14:49:30 -0500 Received: from mout.kundenserver.de ([212.227.126.133]:47941 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730673AbeLPTta (ORCPT ); Sun, 16 Dec 2018 14:49:30 -0500 Received: from wuerfel.lan ([109.192.41.194]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.129]) with ESMTPA (Nemesis) id 1M7am5-1gVbC00qYH-0084Ul; Sun, 16 Dec 2018 20:48:41 +0100 From: Arnd Bergmann To: netdev@vger.kernel.org Cc: "Acked-by : Phil Sutter" , Arnd Bergmann , Thomas Graf , Herbert Xu , "David S. Miller" , NeilBrown , linux-kernel@vger.kernel.org Subject: [PATCH] [v2] test_rhashtable: remove semaphore usage Date: Sun, 16 Dec 2018 20:48:21 +0100 Message-Id: <20181216194836.1310998-1-arnd@arndb.de> X-Mailer: git-send-email 2.20.0 MIME-Version: 1.0 X-Provags-ID: V03:K1:FUnMhcPAbSkKA2vor1FOapiMSRYuHsIns8zB/3OOnCCLgmuprWp gWdqNuCiZK2edPluRXVSIevEhPkNyPFoeuzahKcRfVKusgl/Hhr1CVfeE3SZVEZkYbWmVXk s9InSjaS/6WxCdU0PP1SrXERmVVw/8cQF72RELxzuNw8J3PLPzcerhP4ba4hRgERNGF4+VB SevBQyRAKxseUMfBHE8jw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:4mM1BL8o3FA=:AJXkdMDkC9mR+fnkB/tL1n +FJD/WwBDVES30FNpdMuX/jMJoVHjQ/F5O4Ir4/SlZLLOxt5eYRBUTc97dfjZ4QnfldMeR+qL srcFkISE2NIiiTGM6hq0EYehfeNz73Kx0heLcNulCtaf5R1FqXON647RSR0c7eKcxIFAE1UMb kv+XomzY9iQ81CT5giQF+L/Zwj+HbP5BWPH6x2Zqkyo1kbFXqkbkmxbizKSjn9jvnISF2zRPZ waNXWCsw7pz9XgyCxoH7YZCAMNm5DBgEBZkdXcQLZgUGZZQ8O8pvBjZrEd3hbG3v5naLXD3SP BCo3ce2I1PQUpcmCdTWF+rfX834IOuaRkY09AEbW1p8UZJrRfJefhqRT0Ao0OtUyTqCA4Z63c OJ35d3ax4GCChjEdbGmEurdBBpPmjDxoMewl9upkicEma5T6dMutMxfLeBWcfWO+L07tIwz/L wT5iWjnSho1WT+y174gdRe+iGLFrZ9zt35JETHNH6eRwgtfZx9qK8/QmwXGQQJbqQTa/jI9v/ 6rG38Zn4JF/vywC7eEISebLbrJzaG6tjfGkgEAhubdZ3h47W/VeqkxzhJkBxt4+xSambs2XeW zhdkvNuvsrZRNz6QorThUO+rxitmxttNVf5L+Ulivj4LHiGNixR4u3DHsqAf5LpDYEubmeab4 /BY/Xj3YxqLM8jE5Ly8z3Rh9poroifmNiU5k0dpdz5PaOgrRtUSU+SMuHBs73XNbMgvi2VpnA 0YNnOMhhxs7kJYbRPUiTWQRpD0LM2yh121QAiQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is one of only two files that initialize a semaphore to a negative value. We don't really need the two semaphores here at all, but can do the same thing in more conventional and more effient way, by using a single waitqueue and an atomic thread counter. This gets us a little bit closer to eliminating classic semaphores from the kernel. It also fixes a corner case where we fail to continue after one of the threads fails to start up. An alternative would be to use a split kthread_create()+wake_up_process() and completely eliminate the separate synchronization. Acked-by: Phil Sutter Signed-off-by: Arnd Bergmann --- Changes from v1: - rebase to mainline, - fix pr_err() output - bail out if interrupted --- lib/test_rhashtable.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) -- 2.20.0 Acked-by: Herbert Xu diff --git a/lib/test_rhashtable.c b/lib/test_rhashtable.c index 82ac39ce5310..6a8ac7626797 100644 --- a/lib/test_rhashtable.c +++ b/lib/test_rhashtable.c @@ -20,11 +20,11 @@ #include #include #include -#include #include #include #include #include +#include #define MAX_ENTRIES 1000000 #define TEST_INSERT_FAIL INT_MAX @@ -112,8 +112,8 @@ static struct rhashtable_params test_rht_params_dup = { .automatic_shrinking = false, }; -static struct semaphore prestart_sem; -static struct semaphore startup_sem = __SEMAPHORE_INITIALIZER(startup_sem, 0); +static atomic_t startup_count; +static DECLARE_WAIT_QUEUE_HEAD(startup_wait); static int insert_retry(struct rhashtable *ht, struct test_obj *obj, const struct rhashtable_params params) @@ -634,9 +634,12 @@ static int threadfunc(void *data) int i, step, err = 0, insert_retries = 0; struct thread_data *tdata = data; - up(&prestart_sem); - if (down_interruptible(&startup_sem)) - pr_err(" thread[%d]: down_interruptible failed\n", tdata->id); + if (atomic_dec_and_test(&startup_count)) + wake_up(&startup_wait); + if (wait_event_interruptible(startup_wait, atomic_read(&startup_count) == -1)) { + pr_err(" thread[%d]: interrupted\n", tdata->id); + goto out; + } for (i = 0; i < tdata->entries; i++) { tdata->objs[i].value.id = i; @@ -755,7 +758,7 @@ static int __init test_rht_init(void) pr_info("Testing concurrent rhashtable access from %d threads\n", tcount); - sema_init(&prestart_sem, 1 - tcount); + atomic_set(&startup_count, tcount); tdata = vzalloc(array_size(tcount, sizeof(struct thread_data))); if (!tdata) return -ENOMEM; @@ -781,15 +784,18 @@ static int __init test_rht_init(void) tdata[i].objs = objs + i * entries; tdata[i].task = kthread_run(threadfunc, &tdata[i], "rhashtable_thrad[%d]", i); - if (IS_ERR(tdata[i].task)) + if (IS_ERR(tdata[i].task)) { pr_err(" kthread_run failed for thread %d\n", i); - else + atomic_dec(&startup_count); + } else { started_threads++; + } } - if (down_interruptible(&prestart_sem)) - pr_err(" down interruptible failed\n"); - for (i = 0; i < tcount; i++) - up(&startup_sem); + if (wait_event_interruptible(startup_wait, atomic_read(&startup_count) == 0)) + pr_err(" wait_event interruptible failed\n"); + /* count is 0 now, set it to -1 and wake up all threads together */ + atomic_dec(&startup_count); + wake_up_all(&startup_wait); for (i = 0; i < tcount; i++) { if (IS_ERR(tdata[i].task)) continue;