Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932343AbdCGMCm convert rfc822-to-8bit (ORCPT ); Tue, 7 Mar 2017 07:02:42 -0500 Received: from mga03.intel.com ([134.134.136.65]:27656 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755151AbdCGMCS (ORCPT ); Tue, 7 Mar 2017 07:02:18 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,258,1484035200"; d="scan'208";a="1138951435" From: "Dilger, Andreas" To: James Simmons CC: simran singhal , "Drokin, Oleg" , Greg KH , lustre-devel , "devel@driverdev.osuosl.org" , LKML , "outreachy-kernel@googlegroups.com" Subject: Re: [PATCH 5/5] staging: lustre: osc_page.c: Use list_for_each_entry_safe Thread-Topic: [PATCH 5/5] staging: lustre: osc_page.c: Use list_for_each_entry_safe Thread-Index: AQHSldKnEzkL4xw9cU+yt2hZygaE0KGIdO+AgAE+ioA= Date: Tue, 7 Mar 2017 10:20:56 +0000 Message-ID: <64A47B25-17B2-4ED8-9066-6796E97768A0@intel.com> References: <1488733610-22289-1-git-send-email-singhalsimran0@gmail.com> <1488733610-22289-6-git-send-email-singhalsimran0@gmail.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.252.202.15] Content-Type: text/plain; charset="us-ascii" Content-ID: <3CA356C15D353245B12D4DEE5B23982A@intel.com> Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3556 Lines: 120 On Mar 6, 2017, at 08:20, James Simmons wrote: > >> >> Doubly linked lists which are iterated using list_empty >> and list_entry macros have been replaced with list_for_each_entry_safe >> macro. >> This makes the iteration simpler and more readable. >> >> This patch replaces the while loop containing list_empty and list_entry >> with list_for_each_entry_safe. >> >> This was done with Coccinelle. >> >> @@ >> expression E1; >> identifier I1, I2; >> type T; >> iterator name list_for_each_entry_safe; >> @@ >> >> T *I1; >> + T *tmp; >> ... >> - while (list_empty(&E1) == 0) >> + list_for_each_entry_safe (I1, tmp, &E1, I2) >> { >> ...when != T *I1; >> - I1 = list_entry(E1.next, T, I2); >> ... >> } >> >> Signed-off-by: simran singhal > > NAK!!!!!! > > This change was reverted in commit > > cd15dd6ef4ea11df87f717b8b1b83aaa738ec8af > > Doing these while (list_empty(..)) to list_for_entry... > are not simple changes and have broken things in lustre > before. Unless you really understand the state machine of > the lustre code I don't recommend these kinds of change > for lustre. It may be useful to add a comment to these cases where the while() loop cannot be replaced by list_for_each_entry_safe() (with details of why that is the case) to avoid such optimization attempts again in the future. Cheers, Andreas > >> --- >> drivers/staging/lustre/lustre/osc/osc_page.c | 11 ++++------- >> 1 file changed, 4 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/staging/lustre/lustre/osc/osc_page.c b/drivers/staging/lustre/lustre/osc/osc_page.c >> index ed8a0dc..e8b974f 100644 >> --- a/drivers/staging/lustre/lustre/osc/osc_page.c >> +++ b/drivers/staging/lustre/lustre/osc/osc_page.c >> @@ -542,6 +542,7 @@ long osc_lru_shrink(const struct lu_env *env, struct client_obd *cli, >> struct cl_object *clobj = NULL; >> struct cl_page **pvec; >> struct osc_page *opg; >> + struct osc_page *tmp; >> int maxscan = 0; >> long count = 0; >> int index = 0; >> @@ -572,7 +573,7 @@ long osc_lru_shrink(const struct lu_env *env, struct client_obd *cli, >> if (force) >> cli->cl_lru_reclaim++; >> maxscan = min(target << 1, atomic_long_read(&cli->cl_lru_in_list)); >> - while (!list_empty(&cli->cl_lru_list)) { >> + list_for_each_entry_safe(opg, tmp, &cli->cl_lru_list, ops_lru) { >> struct cl_page *page; >> bool will_free = false; >> >> @@ -582,8 +583,6 @@ long osc_lru_shrink(const struct lu_env *env, struct client_obd *cli, >> if (--maxscan < 0) >> break; >> >> - opg = list_entry(cli->cl_lru_list.next, struct osc_page, >> - ops_lru); >> page = opg->ops_cl.cpl_page; >> if (lru_page_busy(cli, page)) { >> list_move_tail(&opg->ops_lru, &cli->cl_lru_list); >> @@ -1043,6 +1042,7 @@ unsigned long osc_cache_shrink_scan(struct shrinker *sk, >> { >> struct client_obd *stop_anchor = NULL; >> struct client_obd *cli; >> + struct client_obd *tmp; >> struct lu_env *env; >> long shrank = 0; >> u16 refcheck; >> @@ -1059,10 +1059,7 @@ unsigned long osc_cache_shrink_scan(struct shrinker *sk, >> return SHRINK_STOP; >> >> spin_lock(&osc_shrink_lock); >> - while (!list_empty(&osc_shrink_list)) { >> - cli = list_entry(osc_shrink_list.next, struct client_obd, >> - cl_shrink_list); >> - >> + list_for_each_entry_safe(cli, tmp, &osc_shrink_list, cl_shrink_list) { >> if (!stop_anchor) >> stop_anchor = cli; >> else if (cli == stop_anchor) >> -- >> 2.7.4 Cheers, Andreas -- Andreas Dilger Lustre Principal Architect Intel Corporation