mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: green@linuxhacker.ru
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	devel@driverdev.osuosl.org,
	Andreas Dilger <andreas.dilger@intel.com>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Lustre Development List <lustre-devel@lists.lustre.org>,
	Vitaly Fertman <vitaly.fertman@seagate.com>,
	Oleg Drokin <green@linuxhacker.ru>
Subject: [PATCH v2 43/46] staging/lustre/ldlm: restore the ELC for enqueue
Date: Wed, 30 Mar 2016 19:49:04 -0400	[thread overview]
Message-ID: <1459381747-2886687-44-git-send-email-green@linuxhacker.ru> (raw)
In-Reply-To: <1459381747-2886687-1-git-send-email-green@linuxhacker.ru>

From: Vitaly Fertman <vitaly.fertman@seagate.com>

after LU-4300 enqueue does not ELC anymore, however if enqueue is
agressive (ls -la of a large dir) we may exceed lru-resize limit
quickly because LRUR shrinker and recalc are called not so often.

ELC is to be restored in enqueue.
ELC also should check for the lock weight, in addition to LRUR.
ELC can also keep "skipped" locks, i.e. once checked for the weight
and left in the lru - let LRUR take care about them later.
LRUR is to be left untouched, no weight logic, otherwise LU-5727
appears and OPEN locks do not get canceled.

Xyratex-bug-id: MRP-2550
Signed-off-by: Vitaly Fertman <vitaly.fertman@seagate.com>
Reviewed-on: http://review.whamcloud.com/14342
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6390
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Oleg Drokin <green@linuxhacker.ru>
---
 drivers/staging/lustre/lustre/ldlm/ldlm_internal.h |  7 +++---
 drivers/staging/lustre/lustre/ldlm/ldlm_request.c  | 25 ++++++++++++++++++----
 drivers/staging/lustre/lustre/osc/osc_request.c    |  4 ++--
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h b/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h
index e21373e..e31d84a 100644
--- a/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h
+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_internal.h
@@ -95,9 +95,10 @@ enum {
 	LDLM_CANCEL_PASSED = 1 << 1, /* Cancel passed number of locks. */
 	LDLM_CANCEL_SHRINK = 1 << 2, /* Cancel locks from shrinker. */
 	LDLM_CANCEL_LRUR   = 1 << 3, /* Cancel locks from lru resize. */
-	LDLM_CANCEL_NO_WAIT = 1 << 4 /* Cancel locks w/o blocking (neither
-				      * sending nor waiting for any rpcs)
-				      */
+	LDLM_CANCEL_NO_WAIT = 1 << 4, /* Cancel locks w/o blocking (neither
+				       * sending nor waiting for any rpcs)
+				       */
+	LDLM_CANCEL_LRUR_NO_WAIT = 1 << 5, /* LRUR + NO_WAIT */
 };
 
 int ldlm_cancel_lru(struct ldlm_namespace *ns, int nr,
diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_request.c b/drivers/staging/lustre/lustre/ldlm/ldlm_request.c
index 48e9828..9aa4c2d 100644
--- a/drivers/staging/lustre/lustre/ldlm/ldlm_request.c
+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_request.c
@@ -601,7 +601,7 @@ int ldlm_prep_elc_req(struct obd_export *exp, struct ptlrpc_request *req,
 		avail = ldlm_capsule_handles_avail(pill, RCL_CLIENT, canceloff);
 
 		flags = ns_connect_lru_resize(ns) ?
-			LDLM_CANCEL_LRUR : LDLM_CANCEL_AGED;
+			LDLM_CANCEL_LRUR_NO_WAIT : LDLM_CANCEL_AGED;
 		to_free = !ns_connect_lru_resize(ns) &&
 			  opc == LDLM_ENQUEUE ? 1 : 0;
 
@@ -1146,7 +1146,7 @@ static ldlm_policy_res_t ldlm_cancel_no_wait_policy(struct ldlm_namespace *ns,
 	switch (lock->l_resource->lr_type) {
 	case LDLM_EXTENT:
 	case LDLM_IBITS:
-			if (ns->ns_cancel && ns->ns_cancel(lock) != 0)
+		if (ns->ns_cancel && ns->ns_cancel(lock) != 0)
 			break;
 	default:
 		result = LDLM_POLICY_SKIP_LOCK;
@@ -1251,6 +1251,21 @@ static ldlm_policy_res_t ldlm_cancel_aged_policy(struct ldlm_namespace *ns,
 	return LDLM_POLICY_CANCEL_LOCK;
 }
 
+static ldlm_policy_res_t
+ldlm_cancel_lrur_no_wait_policy(struct ldlm_namespace *ns,
+				struct ldlm_lock *lock,
+				int unused, int added,
+				int count)
+{
+	ldlm_policy_res_t result;
+
+	result = ldlm_cancel_lrur_policy(ns, lock, unused, added, count);
+	if (result == LDLM_POLICY_KEEP_LOCK)
+		return result;
+
+	return ldlm_cancel_no_wait_policy(ns, lock, unused, added, count);
+}
+
 /**
  * Callback function for default policy. Makes decision whether to keep \a lock
  * in LRU for current LRU size \a unused, added in current scan \a added and
@@ -1290,6 +1305,8 @@ ldlm_cancel_lru_policy(struct ldlm_namespace *ns, int flags)
 			return ldlm_cancel_lrur_policy;
 		else if (flags & LDLM_CANCEL_PASSED)
 			return ldlm_cancel_passed_policy;
+		else if (flags & LDLM_CANCEL_LRUR_NO_WAIT)
+			return ldlm_cancel_lrur_no_wait_policy;
 	} else {
 		if (flags & LDLM_CANCEL_AGED)
 			return ldlm_cancel_aged_policy;
@@ -1338,6 +1355,7 @@ static int ldlm_prepare_lru_list(struct ldlm_namespace *ns,
 	ldlm_cancel_lru_policy_t pf;
 	struct ldlm_lock *lock, *next;
 	int added = 0, unused, remained;
+	int no_wait = flags & (LDLM_CANCEL_NO_WAIT | LDLM_CANCEL_LRUR_NO_WAIT);
 
 	spin_lock(&ns->ns_lock);
 	unused = ns->ns_nr_unused;
@@ -1365,8 +1383,7 @@ static int ldlm_prepare_lru_list(struct ldlm_namespace *ns,
 			/* No locks which got blocking requests. */
 			LASSERT(!(lock->l_flags & LDLM_FL_BL_AST));
 
-			if (flags & LDLM_CANCEL_NO_WAIT &&
-			    lock->l_flags & LDLM_FL_SKIPPED)
+			if (no_wait && lock->l_flags & LDLM_FL_SKIPPED)
 				/* already processed */
 				continue;
 
diff --git a/drivers/staging/lustre/lustre/osc/osc_request.c b/drivers/staging/lustre/lustre/osc/osc_request.c
index a6dc517..5b9f72c 100644
--- a/drivers/staging/lustre/lustre/osc/osc_request.c
+++ b/drivers/staging/lustre/lustre/osc/osc_request.c
@@ -2297,8 +2297,8 @@ no_match:
 		if (!req)
 			return -ENOMEM;
 
-		rc = ptlrpc_request_pack(req, LUSTRE_DLM_VERSION, LDLM_ENQUEUE);
-		if (rc < 0) {
+		rc = ldlm_prep_enqueue_req(exp, req, NULL, 0);
+		if (rc) {
 			ptlrpc_request_free(req);
 			return rc;
 		}
-- 
2.1.0

  parent reply	other threads:[~2016-03-30 23:51 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-30 23:48 [PATCH v2 00/46] Lustre IO stack simplifications and cleanups green
2016-03-30 23:48 ` [PATCH v2 01/46] staging/lustre/obdclass: limit lu_site hash table size green
2016-03-30 23:48 ` [PATCH v2 02/46] staging/lustre: Get rid of CFS_PAGE_MASK green
2016-03-30 23:48 ` [PATCH v2 03/46] staging/lustre: merge lclient/*.c into llite/ green
2016-03-30 23:48 ` [PATCH v2 04/46] staging/lustre: Reintroduce global env list green
2016-03-30 23:48 ` [PATCH v2 05/46] staging/lustre/osc: Adjustment on osc LRU for performance green
2016-03-30 23:48 ` [PATCH v2 06/46] staging/lustre/osc: to drop LRU pages with cl_lru_work green
2016-03-30 23:48 ` [PATCH v2 07/46] staging/lustre/clio: collapse layer of cl_page green
2016-03-30 23:48 ` [PATCH v2 08/46] staging/lustre/obdclass: Add a preallocated percpu cl_env green
2016-03-30 23:48 ` [PATCH v2 09/46] staging/lustre/clio: add pages into writeback cache in batches green
2016-03-30 23:48 ` [PATCH v2 10/46] staging/lustre/osc: add weight function for DLM lock green
2016-03-30 23:48 ` [PATCH v2 11/46] staging/lustre/clio: remove stackable cl_page completely green
2016-03-30 23:48 ` [PATCH v2 12/46] staging/lustre/clio: optimize read ahead code green
2016-03-30 23:48 ` [PATCH v2 13/46] staging/lustre/llite: remove lli_lvb green
2016-03-30 23:48 ` [PATCH v2 14/46] staging/lustre/lmv: remove lmv_init_{lock,unlock}() green
2016-03-30 23:48 ` [PATCH v2 15/46] staging/lustre/obd: remove struct client_obd_lock green
2016-03-30 23:48 ` [PATCH v2 16/46] staging/lustre/llite: remove some cl wrappers green
2016-03-30 23:48 ` [PATCH v2 17/46] staging/lustre: Remove struct ll_iattr green
2016-03-30 23:48 ` [PATCH v2 18/46] staging/lustre/clio: generalize cl_sync_io green
2016-03-30 23:48 ` [PATCH v2 19/46] staging/lustre/clio: cl_lock simplification green
2016-03-30 23:48 ` [PATCH v2 20/46] staging/lustre: update comments after " green
2016-03-30 23:48 ` [PATCH v2 21/46] staging/lustre/llite: clip page correctly for vvp_io_commit_sync green
2016-03-30 23:48 ` [PATCH v2 22/46] staging/lustre/llite: deadlock for page write green
2016-03-30 23:48 ` [PATCH v2 23/46] staging/lustre/llite: make sure we do cl_page_clip on the last page green
2016-03-30 23:48 ` [PATCH v2 24/46] staging/lustre/llite: merge lclient.h into llite/vvp_internal.h green
2016-03-30 23:48 ` [PATCH v2 25/46] staging/lustre/llite: rename ccc_device to vvp_device green
2016-03-30 23:48 ` [PATCH v2 26/46] staging/lustre/llite: rename ccc_object to vvp_object green
2016-03-30 23:48 ` [PATCH v2 27/46] staging/lustre/llite: rename ccc_page to vvp_page green
2016-03-30 23:48 ` [PATCH v2 28/46] staging/lustre/llite: rename ccc_lock to vvp_lock green
2016-03-30 23:48 ` [PATCH v2 29/46] staging/lustre:llite: remove struct ll_ra_read green
2016-03-30 23:48 ` [PATCH v2 30/46] staging/lustre/llite: merge ccc_io and vvp_io green
2016-03-30 23:48 ` [PATCH v2 31/46] staging/lustre/llite: use vui prefix for struct vvp_io members green
2016-03-30 23:48 ` [PATCH v2 32/46] staging/lustre/llite: move vvp_io functions to vvp_io.c green
2016-03-30 23:48 ` [PATCH v2 33/46] staging/lustre/llite: rename ccc_req to vvp_req green
2016-03-30 23:48 ` [PATCH v2 34/46] staging/lustre/llite: Rename struct ccc_grouplock to ll_grouplock green
2016-03-30 23:48 ` [PATCH v2 35/46] staging/lustre/llite: Rename struct vvp_thread_info to ll_thread_info green
2016-03-30 23:48 ` [PATCH v2 36/46] staging/lustre/llite: rename struct ccc_thread_info to vvp_thread_info green
2016-03-30 23:48 ` [PATCH v2 37/46] staging/lustre/llite: Remove ccc_global_{init,fini}() green
2016-03-30 23:48 ` [PATCH v2 38/46] staging/lustre/llite: Move ll_dirent_type_get and make it static green
2016-03-30 23:49 ` [PATCH v2 39/46] staging/lustre/llite: Move several declarations to llite_internal.h green
2016-03-30 23:49 ` [PATCH v2 40/46] staging/lustre/llite: Remove unused vui_local_lock field green
2016-03-30 23:49 ` [PATCH v2 41/46] staging/lustre/ldlm: ELC picks locks in a safer policy green
2016-03-30 23:49 ` [PATCH v2 42/46] staging/lustre/ldlm: revert changes to ldlm_cancel_aged_policy() green
2016-03-30 23:49 ` green [this message]
2016-03-30 23:49 ` [PATCH v2 44/46] staging/lustre: Fix spacing style before open parenthesis green
2016-03-30 23:49 ` [PATCH v2 45/46] staging/lustre/ldlm: Solve a race for LRU lock cancel green
2016-03-30 23:49 ` [PATCH v2 46/46] staging/lustre: lov_io_init() should return error code green

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1459381747-2886687-44-git-send-email-green@linuxhacker.ru \
    --to=green@linuxhacker.ru \
    --cc=andreas.dilger@intel.com \
    --cc=devel@driverdev.osuosl.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lustre-devel@lists.lustre.org \
    --cc=vitaly.fertman@seagate.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome