Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp464431pxx; Wed, 28 Oct 2020 08:57:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwIfmDAcQxrjNsOoTyIF7RaY3llt2p2zcdnjHzLmVWd71B+OFQgFR4/AxT4Zjymoc0GIL2u X-Received: by 2002:a17:906:cb2:: with SMTP id k18mr3754757ejh.71.1603900636638; Wed, 28 Oct 2020 08:57:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603900636; cv=none; d=google.com; s=arc-20160816; b=j9kbut6zmCBP1o+KwN8yMD4DqAPYeQw1ybX/v4d8QO7ETVe9A8XdfW7MAZ5dXashVh kMtVlKaaZRkibo1Cr31kXOo3FVSitDmztHeAa1o+o2RTSPwEHw56C+Ftule+P1VXOHn0 Ztcyo6l5YDfJTz/tVmxOuoNCJ6REQlyYb7b1vl4RHXfPWDm8C3teGui011U+/Y2l2IHd mAmHhD5fXrOTYSEnMnV/DGFK/MW9CIY6ONM5W538azJ0/3XfdyoWlkW1aeZmaTUR7dAo KkTZehZpXy8z3E23q5tZ2euvi3iyrzaKVxXA0kQxq4dSJpxPe1b4zhr7s/lXfnrjIAr/ mJOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:sender:dkim-signature; bh=9wWRec99gN9dBHws62nUYEcveG+Fv/NYOt3MJb2ccyQ=; b=gLnrRXRROQGUS7Yk8nEHMEun2++63mMhwpUVjFmp8vqzjjd0ujUm5OIxeSO45iGuCw 9ulkiuSPGThQBQ8tjSvmnrsiXxtYnWR7la1o5wh7GqeZEiuhXAuQdqSAVgXNEeWNY80A NmjOwJ+uKAP7d1wb1TrJBoBQV6HaOR6C87XELaGZ6B3bUArv6SEbigiMxPu82OVdz7Xf lI6L/+NPNto22wXOEug6N94LANNY4/1JHQ7ysbxMzt05Zt8xzJrKe+mWzkQ31VEmsnRT fkdHZBoRNwzzpryH19g36qiwpvIcxShMEbF2GjQYkKAnCDuv7+kZBNZs9+cWVFgER3dh cgBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=aUMB149c; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p19si2741759edu.169.2020.10.28.08.56.54; Wed, 28 Oct 2020 08:57:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=aUMB149c; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1813573AbgJ0QvZ (ORCPT + 99 others); Tue, 27 Oct 2020 12:51:25 -0400 Received: from mail-pl1-f202.google.com ([209.85.214.202]:36605 "EHLO mail-pl1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1813395AbgJ0Qt7 (ORCPT ); Tue, 27 Oct 2020 12:49:59 -0400 Received: by mail-pl1-f202.google.com with SMTP id v6so1264994plo.3 for ; Tue, 27 Oct 2020 09:49:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=9wWRec99gN9dBHws62nUYEcveG+Fv/NYOt3MJb2ccyQ=; b=aUMB149cvGGQuG2bVbNSUocZgWt1sioEvdQd1cZrZrEqyOKZ+Quzhm+vTh197m0dc5 0Vh57Q3oISS9HGv+r2I9dZMDV770VJlHwU3svC8s+mIllf3iDoeX6oD2B7dV2aKqHzUp Q4tIdMUo47oLRLSRiXIgnpJsz0dOrget/Unwv/O9XWGXkSFdwArwcINKdj95dtMvsy04 3czpJYElfSsGu4IpB8T5pMod3JxnvmtlnbSMsqvyJHUnT74eIqXKxdzzyCh2YoBeaGPm JMcqioxwFoyynkj9fgCt6MfJLBctSBh6bUW4R3xkleTBkKt0PqXAa/9dUl8iMA82QeYN jUYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=9wWRec99gN9dBHws62nUYEcveG+Fv/NYOt3MJb2ccyQ=; b=WDE2PU9G7AVapdRjSvEKhGFdKD/4NF/tCo5dn3O0EiPTcqUshB2IgpaGks6s/mOjl9 D4TwOLfDdgcAzbA8CbglrlnEXKZlYekoptCdi0rlSZqZMPamPpBeXRJyecbEUi+EhoiK rh6P1EQNrVXfkYGi5c+LkjCqWyOdfy1otfOwhwauKlJu2cowHca+OqCw8P691EwcqRHd ycZg1pNPBg0S4ECzP7wruRRE2lEY2UJVp2DkZmetVBjK+BfMO9BdY0c9CAqHf1sonAQK DPm8HeWSXF5to/remSjA9IpQmAE2vXDGHTcvkkI5FZVCWQdDAcVLhTbmy33BXtcurneC 9NmA== X-Gm-Message-State: AOAM533bNvwScg/RYNVZ+zbETG+rZmqqh48dsg0JbwjS2cOk0PL5yxhk e7Nf5wSwid2r3cOqK24iySnAJuUeEGbDFBCEJ4LSMSp801FjMVWywVFkQSlzFtytr4eVlgZfIZl 4gPOtGnXiDk7GtUHP1YXsaR2fgtHuJVR30ZEJGYVenJiiJwzgZe5feBw4StTg7dhnyeOAwZ8F Sender: "bgardon via sendgmr" X-Received: from bgardon.sea.corp.google.com ([2620:15c:100:202:f693:9fff:fef4:a293]) (user=bgardon job=sendgmr) by 2002:a17:90a:f198:: with SMTP id bv24mr2820492pjb.230.1603817397922; Tue, 27 Oct 2020 09:49:57 -0700 (PDT) Date: Tue, 27 Oct 2020 09:49:50 -0700 In-Reply-To: <20201027164950.1057601-1-bgardon@google.com> Message-Id: <20201027164950.1057601-3-bgardon@google.com> Mime-Version: 1.0 References: <20201027164950.1057601-1-bgardon@google.com> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog Subject: [PATCH 3/3] sched: Add cond_resched_rwlock From: Ben Gardon To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , Sean Christopherson , Peter Shier , Peter Zijlstra , Ingo Molnar , Will Deacon , Waiman Long , Davidlohr Bueso , Ben Gardon Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rescheduling while holding a spin lock is essential for keeping long running kernel operations running smoothly. Add the facility to cond_resched rwlocks. Signed-off-by: Ben Gardon --- include/linux/sched.h | 12 ++++++++++++ kernel/sched/core.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index 77179160ec3ab..2eb0c53fce115 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1841,12 +1841,24 @@ static inline int _cond_resched(void) { return 0; } }) extern int __cond_resched_lock(spinlock_t *lock); +extern int __cond_resched_rwlock_read(rwlock_t *lock); +extern int __cond_resched_rwlock_write(rwlock_t *lock); #define cond_resched_lock(lock) ({ \ ___might_sleep(__FILE__, __LINE__, PREEMPT_LOCK_OFFSET);\ __cond_resched_lock(lock); \ }) +#define cond_resched_rwlock_read(lock) ({ \ + __might_sleep(__FILE__, __LINE__, PREEMPT_LOCK_OFFSET); \ + __cond_resched_rwlock_read(lock); \ +}) + +#define cond_resched_rwlock_write(lock) ({ \ + __might_sleep(__FILE__, __LINE__, PREEMPT_LOCK_OFFSET); \ + __cond_resched_rwlock_write(lock); \ +}) + static inline void cond_resched_rcu(void) { #if defined(CONFIG_DEBUG_ATOMIC_SLEEP) || !defined(CONFIG_PREEMPT_RCU) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d2003a7d5ab55..ac58e7829a063 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6152,6 +6152,46 @@ int __cond_resched_lock(spinlock_t *lock) } EXPORT_SYMBOL(__cond_resched_lock); +int __cond_resched_rwlock_read(rwlock_t *lock) +{ + int resched = should_resched(PREEMPT_LOCK_OFFSET); + int ret = 0; + + lockdep_assert_held(lock); + + if (rwlock_needbreak(lock) || resched) { + read_unlock(lock); + if (resched) + preempt_schedule_common(); + else + cpu_relax(); + ret = 1; + read_lock(lock); + } + return ret; +} +EXPORT_SYMBOL(__cond_resched_rwlock_read); + +int __cond_resched_rwlock_write(rwlock_t *lock) +{ + int resched = should_resched(PREEMPT_LOCK_OFFSET); + int ret = 0; + + lockdep_assert_held(lock); + + if (rwlock_needbreak(lock) || resched) { + write_unlock(lock); + if (resched) + preempt_schedule_common(); + else + cpu_relax(); + ret = 1; + write_lock(lock); + } + return ret; +} +EXPORT_SYMBOL(__cond_resched_rwlock_write); + /** * yield - yield the current processor to other threads. * -- 2.29.0.rc2.309.g374f81d7ae-goog