Whamcloud - gitweb
3af63a2e8c1114cabe9a7c84b3355c88b6d64417
[fs/lustre-release.git] / lustre / ldlm / ldlm_pool.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2010, 2012, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lustre/ldlm/ldlm_pool.c
37  *
38  * Author: Yury Umanets <umka@clusterfs.com>
39  */
40
41 /*
42  * Idea of this code is rather simple. Each second, for each server namespace
43  * we have SLV - server lock volume which is calculated on current number of
44  * granted locks, grant speed for past period, etc - that is, locking load.
45  * This SLV number may be thought as a flow definition for simplicity. It is
46  * sent to clients with each occasion to let them know what is current load
47  * situation on the server. By default, at the beginning, SLV on server is
48  * set max value which is calculated as the following: allow to one client
49  * have all locks of limit ->pl_limit for 10h.
50  *
51  * Next, on clients, number of cached locks is not limited artificially in any
52  * way as it was before. Instead, client calculates CLV, that is, client lock
53  * volume for each lock and compares it with last SLV from the server. CLV is
54  * calculated as the number of locks in LRU * lock live time in seconds. If
55  * CLV > SLV - lock is canceled.
56  *
57  * Client has LVF, that is, lock volume factor which regulates how much sensitive
58  * client should be about last SLV from server. The higher LVF is the more locks
59  * will be canceled on client. Default value for it is 1. Setting LVF to 2 means
60  * that client will cancel locks 2 times faster.
61  *
62  * Locks on a client will be canceled more intensively in these cases:
63  * (1) if SLV is smaller, that is, load is higher on the server;
64  * (2) client has a lot of locks (the more locks are held by client, the bigger
65  *     chances that some of them should be canceled);
66  * (3) client has old locks (taken some time ago);
67  *
68  * Thus, according to flow paradigm that we use for better understanding SLV,
69  * CLV is the volume of particle in flow described by SLV. According to this,
70  * if flow is getting thinner, more and more particles become outside of it and
71  * as particles are locks, they should be canceled.
72  *
73  * General idea of this belongs to Vitaly Fertman (vitaly@clusterfs.com). Andreas
74  * Dilger (adilger@clusterfs.com) proposed few nice ideas like using LVF and many
75  * cleanups. Flow definition to allow more easy understanding of the logic belongs
76  * to Nikita Danilov (nikita@clusterfs.com) as well as many cleanups and fixes.
77  * And design and implementation are done by Yury Umanets (umka@clusterfs.com).
78  *
79  * Glossary for terms used:
80  *
81  * pl_limit - Number of allowed locks in pool. Applies to server and client
82  * side (tunable);
83  *
84  * pl_granted - Number of granted locks (calculated);
85  * pl_grant_rate - Number of granted locks for last T (calculated);
86  * pl_cancel_rate - Number of canceled locks for last T (calculated);
87  * pl_grant_speed - Grant speed (GR - CR) for last T (calculated);
88  * pl_grant_plan - Planned number of granted locks for next T (calculated);
89  * pl_server_lock_volume - Current server lock volume (calculated);
90  *
91  * As it may be seen from list above, we have few possible tunables which may
92  * affect behavior much. They all may be modified via proc. However, they also
93  * give a possibility for constructing few pre-defined behavior policies. If
94  * none of predefines is suitable for a working pattern being used, new one may
95  * be "constructed" via proc tunables.
96  */
97
98 #define DEBUG_SUBSYSTEM S_LDLM
99
100 #include <lustre_dlm.h>
101 #include <cl_object.h>
102 #include <obd_class.h>
103 #include <obd_support.h>
104 #include "ldlm_internal.h"
105
106 #ifdef HAVE_LRU_RESIZE_SUPPORT
107
108 /*
109  * 50 ldlm locks for 1MB of RAM.
110  */
111 #define LDLM_POOL_HOST_L ((NUM_CACHEPAGES >> (20 - PAGE_CACHE_SHIFT)) * 50)
112
113 /*
114  * Maximal possible grant step plan in %.
115  */
116 #define LDLM_POOL_MAX_GSP (30)
117
118 /*
119  * Minimal possible grant step plan in %.
120  */
121 #define LDLM_POOL_MIN_GSP (1)
122
123 /*
124  * This controls the speed of reaching LDLM_POOL_MAX_GSP
125  * with increasing thread period.
126  */
127 #define LDLM_POOL_GSP_STEP_SHIFT (2)
128
129 /*
130  * LDLM_POOL_GSP% of all locks is default GP.
131  */
132 #define LDLM_POOL_GP(L)   (((L) * LDLM_POOL_MAX_GSP) / 100)
133
134 /*
135  * Max age for locks on clients.
136  */
137 #define LDLM_POOL_MAX_AGE (36000)
138
139 /*
140  * The granularity of SLV calculation.
141  */
142 #define LDLM_POOL_SLV_SHIFT (10)
143
144 extern struct proc_dir_entry *ldlm_ns_proc_dir;
145
146 static inline __u64 dru(__u64 val, __u32 shift, int round_up)
147 {
148         return (val + (round_up ? (1 << shift) - 1 : 0)) >> shift;
149 }
150
151 static inline __u64 ldlm_pool_slv_max(__u32 L)
152 {
153         /*
154          * Allow to have all locks for 1 client for 10 hrs.
155          * Formula is the following: limit * 10h / 1 client.
156          */
157         __u64 lim = (__u64)L *  LDLM_POOL_MAX_AGE / 1;
158         return lim;
159 }
160
161 static inline __u64 ldlm_pool_slv_min(__u32 L)
162 {
163         return 1;
164 }
165
166 enum {
167         LDLM_POOL_FIRST_STAT = 0,
168         LDLM_POOL_GRANTED_STAT = LDLM_POOL_FIRST_STAT,
169         LDLM_POOL_GRANT_STAT,
170         LDLM_POOL_CANCEL_STAT,
171         LDLM_POOL_GRANT_RATE_STAT,
172         LDLM_POOL_CANCEL_RATE_STAT,
173         LDLM_POOL_GRANT_PLAN_STAT,
174         LDLM_POOL_SLV_STAT,
175         LDLM_POOL_SHRINK_REQTD_STAT,
176         LDLM_POOL_SHRINK_FREED_STAT,
177         LDLM_POOL_RECALC_STAT,
178         LDLM_POOL_TIMING_STAT,
179         LDLM_POOL_LAST_STAT
180 };
181
182 static inline struct ldlm_namespace *ldlm_pl2ns(struct ldlm_pool *pl)
183 {
184         return container_of(pl, struct ldlm_namespace, ns_pool);
185 }
186
187 /**
188  * Calculates suggested grant_step in % of available locks for passed
189  * \a period. This is later used in grant_plan calculations.
190  */
191 static inline int ldlm_pool_t2gsp(unsigned int t)
192 {
193         /*
194          * This yields 1% grant step for anything below LDLM_POOL_GSP_STEP
195          * and up to 30% for anything higher than LDLM_POOL_GSP_STEP.
196          *
197          * How this will affect execution is the following:
198          *
199          * - for thread period 1s we will have grant_step 1% which good from
200          * pov of taking some load off from server and push it out to clients.
201          * This is like that because 1% for grant_step means that server will
202          * not allow clients to get lots of locks in short period of time and
203          * keep all old locks in their caches. Clients will always have to
204          * get some locks back if they want to take some new;
205          *
206          * - for thread period 10s (which is default) we will have 23% which
207          * means that clients will have enough of room to take some new locks
208          * without getting some back. All locks from this 23% which were not
209          * taken by clients in current period will contribute in SLV growing.
210          * SLV growing means more locks cached on clients until limit or grant
211          * plan is reached.
212          */
213         return LDLM_POOL_MAX_GSP -
214                 ((LDLM_POOL_MAX_GSP - LDLM_POOL_MIN_GSP) >>
215                  (t >> LDLM_POOL_GSP_STEP_SHIFT));
216 }
217
218 /**
219  * Recalculates next grant limit on passed \a pl.
220  *
221  * \pre ->pl_lock is locked.
222  */
223 static void ldlm_pool_recalc_grant_plan(struct ldlm_pool *pl)
224 {
225         int granted, grant_step, limit;
226
227         limit = ldlm_pool_get_limit(pl);
228         granted = atomic_read(&pl->pl_granted);
229
230         grant_step = ldlm_pool_t2gsp(pl->pl_recalc_period);
231         grant_step = ((limit - granted) * grant_step) / 100;
232         pl->pl_grant_plan = granted + grant_step;
233         limit = (limit * 5) >> 2;
234         if (pl->pl_grant_plan > limit)
235                 pl->pl_grant_plan = limit;
236 }
237
238 /**
239  * Recalculates next SLV on passed \a pl.
240  *
241  * \pre ->pl_lock is locked.
242  */
243 static void ldlm_pool_recalc_slv(struct ldlm_pool *pl)
244 {
245         int granted;
246         int grant_plan;
247         int round_up;
248         __u64 slv;
249         __u64 slv_factor;
250         __u64 grant_usage;
251         __u32 limit;
252
253         slv = pl->pl_server_lock_volume;
254         grant_plan = pl->pl_grant_plan;
255         limit = ldlm_pool_get_limit(pl);
256         granted = atomic_read(&pl->pl_granted);
257         round_up = granted < limit;
258
259         grant_usage = max_t(int, limit - (granted - grant_plan), 1);
260
261         /*
262          * Find out SLV change factor which is the ratio of grant usage
263          * from limit. SLV changes as fast as the ratio of grant plan
264          * consumption. The more locks from grant plan are not consumed
265          * by clients in last interval (idle time), the faster grows
266          * SLV. And the opposite, the more grant plan is over-consumed
267          * (load time) the faster drops SLV.
268          */
269         slv_factor = (grant_usage << LDLM_POOL_SLV_SHIFT);
270         do_div(slv_factor, limit);
271         slv = slv * slv_factor;
272         slv = dru(slv, LDLM_POOL_SLV_SHIFT, round_up);
273
274         if (slv > ldlm_pool_slv_max(limit)) {
275                 slv = ldlm_pool_slv_max(limit);
276         } else if (slv < ldlm_pool_slv_min(limit)) {
277                 slv = ldlm_pool_slv_min(limit);
278         }
279
280         pl->pl_server_lock_volume = slv;
281 }
282
283 /**
284  * Recalculates next stats on passed \a pl.
285  *
286  * \pre ->pl_lock is locked.
287  */
288 static void ldlm_pool_recalc_stats(struct ldlm_pool *pl)
289 {
290         int grant_plan = pl->pl_grant_plan;
291         __u64 slv = pl->pl_server_lock_volume;
292         int granted = atomic_read(&pl->pl_granted);
293         int grant_rate = atomic_read(&pl->pl_grant_rate);
294         int cancel_rate = atomic_read(&pl->pl_cancel_rate);
295
296         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_SLV_STAT,
297                             slv);
298         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_GRANTED_STAT,
299                             granted);
300         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_GRANT_RATE_STAT,
301                             grant_rate);
302         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_GRANT_PLAN_STAT,
303                             grant_plan);
304         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_CANCEL_RATE_STAT,
305                             cancel_rate);
306 }
307
308 /**
309  * Sets current SLV into obd accessible via ldlm_pl2ns(pl)->ns_obd.
310  */
311 static void ldlm_srv_pool_push_slv(struct ldlm_pool *pl)
312 {
313         struct obd_device *obd;
314
315         /*
316          * Set new SLV in obd field for using it later without accessing the
317          * pool. This is required to avoid race between sending reply to client
318          * with new SLV and cleanup server stack in which we can't guarantee
319          * that namespace is still alive. We know only that obd is alive as
320          * long as valid export is alive.
321          */
322         obd = ldlm_pl2ns(pl)->ns_obd;
323         LASSERT(obd != NULL);
324         write_lock(&obd->obd_pool_lock);
325         obd->obd_pool_slv = pl->pl_server_lock_volume;
326         write_unlock(&obd->obd_pool_lock);
327 }
328
329 /**
330  * Recalculates all pool fields on passed \a pl.
331  *
332  * \pre ->pl_lock is not locked.
333  */
334 static int ldlm_srv_pool_recalc(struct ldlm_pool *pl)
335 {
336         time_t recalc_interval_sec;
337         ENTRY;
338
339         recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time;
340         if (recalc_interval_sec < pl->pl_recalc_period)
341                 RETURN(0);
342
343         spin_lock(&pl->pl_lock);
344         recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time;
345         if (recalc_interval_sec < pl->pl_recalc_period) {
346                 spin_unlock(&pl->pl_lock);
347                 RETURN(0);
348         }
349         /*
350          * Recalc SLV after last period. This should be done
351          * _before_ recalculating new grant plan.
352          */
353         ldlm_pool_recalc_slv(pl);
354
355         /*
356          * Make sure that pool informed obd of last SLV changes.
357          */
358         ldlm_srv_pool_push_slv(pl);
359
360         /*
361          * Update grant_plan for new period.
362          */
363         ldlm_pool_recalc_grant_plan(pl);
364
365         pl->pl_recalc_time = cfs_time_current_sec();
366         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_TIMING_STAT,
367                             recalc_interval_sec);
368         spin_unlock(&pl->pl_lock);
369         RETURN(0);
370 }
371
372 /**
373  * This function is used on server side as main entry point for memory
374  * pressure handling. It decreases SLV on \a pl according to passed
375  * \a nr and \a gfp_mask.
376  *
377  * Our goal here is to decrease SLV such a way that clients hold \a nr
378  * locks smaller in next 10h.
379  */
380 static int ldlm_srv_pool_shrink(struct ldlm_pool *pl,
381                                 int nr,  gfp_t gfp_mask)
382 {
383         __u32 limit;
384
385         /*
386          * VM is asking how many entries may be potentially freed.
387          */
388         if (nr == 0)
389                 return atomic_read(&pl->pl_granted);
390
391         /*
392          * Client already canceled locks but server is already in shrinker
393          * and can't cancel anything. Let's catch this race.
394          */
395         if (atomic_read(&pl->pl_granted) == 0)
396                 RETURN(0);
397
398         spin_lock(&pl->pl_lock);
399
400         /*
401          * We want shrinker to possibly cause cancellation of @nr locks from
402          * clients or grant approximately @nr locks smaller next intervals.
403          *
404          * This is why we decreased SLV by @nr. This effect will only be as
405          * long as one re-calc interval (1s these days) and this should be
406          * enough to pass this decreased SLV to all clients. On next recalc
407          * interval pool will either increase SLV if locks load is not high
408          * or will keep on same level or even decrease again, thus, shrinker
409          * decreased SLV will affect next recalc intervals and this way will
410          * make locking load lower.
411          */
412         if (nr < pl->pl_server_lock_volume) {
413                 pl->pl_server_lock_volume = pl->pl_server_lock_volume - nr;
414         } else {
415                 limit = ldlm_pool_get_limit(pl);
416                 pl->pl_server_lock_volume = ldlm_pool_slv_min(limit);
417         }
418
419         /*
420          * Make sure that pool informed obd of last SLV changes.
421          */
422         ldlm_srv_pool_push_slv(pl);
423         spin_unlock(&pl->pl_lock);
424
425         /*
426          * We did not really free any memory here so far, it only will be
427          * freed later may be, so that we return 0 to not confuse VM.
428          */
429         return 0;
430 }
431
432 /**
433  * Setup server side pool \a pl with passed \a limit.
434  */
435 static int ldlm_srv_pool_setup(struct ldlm_pool *pl, int limit)
436 {
437         struct obd_device *obd;
438
439         obd = ldlm_pl2ns(pl)->ns_obd;
440         LASSERT(obd != NULL && obd != LP_POISON);
441         LASSERT(obd->obd_type != LP_POISON);
442         write_lock(&obd->obd_pool_lock);
443         obd->obd_pool_limit = limit;
444         write_unlock(&obd->obd_pool_lock);
445
446         ldlm_pool_set_limit(pl, limit);
447         return 0;
448 }
449
450 /**
451  * Sets SLV and Limit from ldlm_pl2ns(pl)->ns_obd tp passed \a pl.
452  */
453 static void ldlm_cli_pool_pop_slv(struct ldlm_pool *pl)
454 {
455         struct obd_device *obd;
456
457         /*
458          * Get new SLV and Limit from obd which is updated with coming
459          * RPCs.
460          */
461         obd = ldlm_pl2ns(pl)->ns_obd;
462         LASSERT(obd != NULL);
463         read_lock(&obd->obd_pool_lock);
464         pl->pl_server_lock_volume = obd->obd_pool_slv;
465         ldlm_pool_set_limit(pl, obd->obd_pool_limit);
466         read_unlock(&obd->obd_pool_lock);
467 }
468
469 /**
470  * Recalculates client size pool \a pl according to current SLV and Limit.
471  */
472 static int ldlm_cli_pool_recalc(struct ldlm_pool *pl)
473 {
474         time_t recalc_interval_sec;
475         int ret;
476         ENTRY;
477
478         recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time;
479         if (recalc_interval_sec < pl->pl_recalc_period)
480                 RETURN(0);
481
482         spin_lock(&pl->pl_lock);
483         /*
484          * Check if we need to recalc lists now.
485          */
486         recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time;
487         if (recalc_interval_sec < pl->pl_recalc_period) {
488                 spin_unlock(&pl->pl_lock);
489                 RETURN(0);
490         }
491
492         /*
493          * Make sure that pool knows last SLV and Limit from obd.
494          */
495         ldlm_cli_pool_pop_slv(pl);
496         spin_unlock(&pl->pl_lock);
497
498         /*
499          * Do not cancel locks in case lru resize is disabled for this ns.
500          */
501         if (!ns_connect_lru_resize(ldlm_pl2ns(pl)))
502                 GOTO(out, ret = 0);
503
504         /*
505          * In the time of canceling locks on client we do not need to maintain
506          * sharp timing, we only want to cancel locks asap according to new SLV.
507          * It may be called when SLV has changed much, this is why we do not
508          * take into account pl->pl_recalc_time here.
509          */
510         ret = ldlm_cancel_lru(ldlm_pl2ns(pl), 0, LCF_ASYNC,
511                                LDLM_CANCEL_LRUR);
512
513 out:
514         spin_lock(&pl->pl_lock);
515         /*
516          * Time of LRU resizing might be longer than period,
517          * so update after LRU resizing rather than before it.
518          */
519         pl->pl_recalc_time = cfs_time_current_sec();
520         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_TIMING_STAT,
521                             recalc_interval_sec);
522         spin_unlock(&pl->pl_lock);
523         RETURN(ret);
524 }
525
526 /**
527  * This function is main entry point for memory pressure handling on client
528  * side.  Main goal of this function is to cancel some number of locks on
529  * passed \a pl according to \a nr and \a gfp_mask.
530  */
531 static int ldlm_cli_pool_shrink(struct ldlm_pool *pl,
532                                 int nr, gfp_t gfp_mask)
533 {
534         struct ldlm_namespace *ns;
535         int unused;
536
537         ns = ldlm_pl2ns(pl);
538
539         /*
540          * Do not cancel locks in case lru resize is disabled for this ns.
541          */
542         if (!ns_connect_lru_resize(ns))
543                 RETURN(0);
544
545         /*
546          * Make sure that pool knows last SLV and Limit from obd.
547          */
548         ldlm_cli_pool_pop_slv(pl);
549
550         spin_lock(&ns->ns_lock);
551         unused = ns->ns_nr_unused;
552         spin_unlock(&ns->ns_lock);
553
554         if (nr == 0)
555                 return (unused / 100) * sysctl_vfs_cache_pressure;
556         else
557                 return ldlm_cancel_lru(ns, nr, LCF_ASYNC, LDLM_CANCEL_SHRINK);
558 }
559
560 struct ldlm_pool_ops ldlm_srv_pool_ops = {
561         .po_recalc = ldlm_srv_pool_recalc,
562         .po_shrink = ldlm_srv_pool_shrink,
563         .po_setup  = ldlm_srv_pool_setup
564 };
565
566 struct ldlm_pool_ops ldlm_cli_pool_ops = {
567         .po_recalc = ldlm_cli_pool_recalc,
568         .po_shrink = ldlm_cli_pool_shrink
569 };
570
571 /**
572  * Pool recalc wrapper. Will call either client or server pool recalc callback
573  * depending what pool \a pl is used.
574  */
575 int ldlm_pool_recalc(struct ldlm_pool *pl)
576 {
577         time_t recalc_interval_sec;
578         int count;
579
580         recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time;
581         if (recalc_interval_sec <= 0)
582                 goto recalc;
583
584         spin_lock(&pl->pl_lock);
585         if (recalc_interval_sec > 0) {
586                 /*
587                  * Update pool statistics every 1s.
588                  */
589                 ldlm_pool_recalc_stats(pl);
590
591                 /*
592                  * Zero out all rates and speed for the last period.
593                  */
594                 atomic_set(&pl->pl_grant_rate, 0);
595                 atomic_set(&pl->pl_cancel_rate, 0);
596         }
597         spin_unlock(&pl->pl_lock);
598
599  recalc:
600         if (pl->pl_ops->po_recalc != NULL) {
601                 count = pl->pl_ops->po_recalc(pl);
602                 lprocfs_counter_add(pl->pl_stats, LDLM_POOL_RECALC_STAT,
603                                     count);
604         }
605         recalc_interval_sec = pl->pl_recalc_time - cfs_time_current_sec() +
606                               pl->pl_recalc_period;
607         if (recalc_interval_sec <= 0) {
608                 /* Prevent too frequent recalculation. */
609                 CDEBUG(D_DLMTRACE, "Negative interval(%ld), "
610                        "too short period(%ld)",
611                        recalc_interval_sec,
612                        pl->pl_recalc_period);
613                 recalc_interval_sec = 1;
614         }
615
616         return recalc_interval_sec;
617 }
618
619 /**
620  * Pool shrink wrapper. Will call either client or server pool recalc callback
621  * depending what pool \a pl is used.
622  */
623 int ldlm_pool_shrink(struct ldlm_pool *pl, int nr, gfp_t gfp_mask)
624 {
625         int cancel = 0;
626
627         if (pl->pl_ops->po_shrink != NULL) {
628                 cancel = pl->pl_ops->po_shrink(pl, nr, gfp_mask);
629                 if (nr > 0) {
630                         lprocfs_counter_add(pl->pl_stats,
631                                             LDLM_POOL_SHRINK_REQTD_STAT,
632                                             nr);
633                         lprocfs_counter_add(pl->pl_stats,
634                                             LDLM_POOL_SHRINK_FREED_STAT,
635                                             cancel);
636                         CDEBUG(D_DLMTRACE, "%s: request to shrink %d locks, "
637                                "shrunk %d\n", pl->pl_name, nr, cancel);
638                 }
639         }
640         return cancel;
641 }
642 EXPORT_SYMBOL(ldlm_pool_shrink);
643
644 /**
645  * Pool setup wrapper. Will call either client or server pool recalc callback
646  * depending what pool \a pl is used.
647  *
648  * Sets passed \a limit into pool \a pl.
649  */
650 int ldlm_pool_setup(struct ldlm_pool *pl, int limit)
651 {
652         if (pl->pl_ops->po_setup != NULL)
653                 return(pl->pl_ops->po_setup(pl, limit));
654         return 0;
655 }
656 EXPORT_SYMBOL(ldlm_pool_setup);
657
658 static int lprocfs_pool_state_seq_show(struct seq_file *m, void *unused)
659 {
660         int granted, grant_rate, cancel_rate, grant_step;
661         int grant_speed, grant_plan, lvf;
662         struct ldlm_pool *pl = m->private;
663         __u64 slv, clv;
664         __u32 limit;
665
666         spin_lock(&pl->pl_lock);
667         slv = pl->pl_server_lock_volume;
668         clv = pl->pl_client_lock_volume;
669         limit = ldlm_pool_get_limit(pl);
670         grant_plan = pl->pl_grant_plan;
671         granted = atomic_read(&pl->pl_granted);
672         grant_rate = atomic_read(&pl->pl_grant_rate);
673         cancel_rate = atomic_read(&pl->pl_cancel_rate);
674         grant_speed = grant_rate - cancel_rate;
675         lvf = atomic_read(&pl->pl_lock_volume_factor);
676         grant_step = ldlm_pool_t2gsp(pl->pl_recalc_period);
677         spin_unlock(&pl->pl_lock);
678
679         seq_printf(m, "LDLM pool state (%s):\n"
680                       "  SLV: "LPU64"\n"
681                       "  CLV: "LPU64"\n"
682                       "  LVF: %d\n",
683                       pl->pl_name, slv, clv, lvf);
684
685         if (ns_is_server(ldlm_pl2ns(pl))) {
686                 seq_printf(m, "  GSP: %d%%\n"
687                               "  GP:  %d\n",
688                               grant_step, grant_plan);
689         }
690         seq_printf(m, "  GR:  %d\n" "  CR:  %d\n" "  GS:  %d\n"
691                       "  G:   %d\n" "  L:   %d\n",
692                       grant_rate, cancel_rate, grant_speed,
693                       granted, limit);
694         return 0;
695 }
696 LPROC_SEQ_FOPS_RO(lprocfs_pool_state);
697
698 static int lprocfs_grant_speed_seq_show(struct seq_file *m, void *unused)
699 {
700         struct ldlm_pool *pl = m->private;
701         int               grant_speed;
702
703         spin_lock(&pl->pl_lock);
704         /* serialize with ldlm_pool_recalc */
705         grant_speed = atomic_read(&pl->pl_grant_rate) -
706                         atomic_read(&pl->pl_cancel_rate);
707         spin_unlock(&pl->pl_lock);
708         return lprocfs_uint_seq_show(m, &grant_speed);
709 }
710
711 LDLM_POOL_PROC_READER_SEQ_SHOW(grant_plan, int);
712 LPROC_SEQ_FOPS_RO(lprocfs_grant_plan);
713
714 LDLM_POOL_PROC_READER_SEQ_SHOW(recalc_period, int);
715 LDLM_POOL_PROC_WRITER(recalc_period, int);
716 static ssize_t lprocfs_recalc_period_seq_write(struct file *file,
717                                                const char __user *buf,
718                                                size_t len, loff_t *off)
719 {
720         struct seq_file *seq = file->private_data;
721
722         return lprocfs_wr_recalc_period(file, buf, len, seq->private);
723 }
724 LPROC_SEQ_FOPS(lprocfs_recalc_period);
725
726 LPROC_SEQ_FOPS_RO_TYPE(ldlm_pool, u64);
727 LPROC_SEQ_FOPS_RO_TYPE(ldlm_pool, atomic);
728 LPROC_SEQ_FOPS_RW_TYPE(ldlm_pool_rw, atomic);
729
730 LPROC_SEQ_FOPS_RO(lprocfs_grant_speed);
731
732 static int ldlm_pool_proc_init(struct ldlm_pool *pl)
733 {
734         struct ldlm_namespace *ns = ldlm_pl2ns(pl);
735         struct proc_dir_entry *parent_ns_proc;
736         struct lprocfs_seq_vars pool_vars[2];
737         char *var_name = NULL;
738         int rc = 0;
739         ENTRY;
740
741         OBD_ALLOC(var_name, MAX_STRING_SIZE + 1);
742         if (!var_name)
743                 RETURN(-ENOMEM);
744
745         parent_ns_proc = ns->ns_proc_dir_entry;
746         if (parent_ns_proc == NULL) {
747                 CERROR("%s: proc entry is not initialized\n",
748                        ldlm_ns_name(ns));
749                 GOTO(out_free_name, rc = -EINVAL);
750         }
751         pl->pl_proc_dir = lprocfs_seq_register("pool", parent_ns_proc,
752                                                 NULL, NULL);
753         if (IS_ERR(pl->pl_proc_dir)) {
754                 rc = PTR_ERR(pl->pl_proc_dir);
755                 pl->pl_proc_dir = NULL;
756                 CERROR("%s: cannot create 'pool' proc entry: rc = %d\n",
757                        ldlm_ns_name(ns), rc);
758                 GOTO(out_free_name, rc);
759         }
760
761         var_name[MAX_STRING_SIZE] = '\0';
762         memset(pool_vars, 0, sizeof(pool_vars));
763         pool_vars[0].name = var_name;
764
765         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "server_lock_volume",
766                      &pl->pl_server_lock_volume, &ldlm_pool_u64_fops);
767         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "limit", &pl->pl_limit,
768                      &ldlm_pool_rw_atomic_fops);
769         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "granted",
770                      &pl->pl_granted, &ldlm_pool_atomic_fops);
771         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "grant_speed", pl,
772                      &lprocfs_grant_speed_fops);
773         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "cancel_rate",
774                      &pl->pl_cancel_rate, &ldlm_pool_atomic_fops);
775         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "grant_rate",
776                      &pl->pl_grant_rate, &ldlm_pool_atomic_fops);
777         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "grant_plan", pl,
778                      &lprocfs_grant_plan_fops);
779         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "recalc_period",
780                      pl, &lprocfs_recalc_period_fops);
781         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "lock_volume_factor",
782                      &pl->pl_lock_volume_factor, &ldlm_pool_rw_atomic_fops);
783         ldlm_add_var(&pool_vars[0], pl->pl_proc_dir, "state", pl,
784                      &lprocfs_pool_state_fops);
785
786         pl->pl_stats = lprocfs_alloc_stats(LDLM_POOL_LAST_STAT -
787                                            LDLM_POOL_FIRST_STAT, 0);
788         if (!pl->pl_stats)
789                 GOTO(out_free_name, rc = -ENOMEM);
790
791         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANTED_STAT,
792                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
793                              "granted", "locks");
794         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANT_STAT,
795                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
796                              "grant", "locks");
797         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_CANCEL_STAT,
798                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
799                              "cancel", "locks");
800         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANT_RATE_STAT,
801                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
802                              "grant_rate", "locks/s");
803         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_CANCEL_RATE_STAT,
804                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
805                              "cancel_rate", "locks/s");
806         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANT_PLAN_STAT,
807                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
808                              "grant_plan", "locks/s");
809         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_SLV_STAT,
810                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
811                              "slv", "slv");
812         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_SHRINK_REQTD_STAT,
813                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
814                              "shrink_request", "locks");
815         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_SHRINK_FREED_STAT,
816                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
817                              "shrink_freed", "locks");
818         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_RECALC_STAT,
819                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
820                              "recalc_freed", "locks");
821         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_TIMING_STAT,
822                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
823                              "recalc_timing", "sec");
824         rc = lprocfs_register_stats(pl->pl_proc_dir, "stats", pl->pl_stats);
825
826         EXIT;
827 out_free_name:
828         OBD_FREE(var_name, MAX_STRING_SIZE + 1);
829         return rc;
830 }
831
832 static void ldlm_pool_proc_fini(struct ldlm_pool *pl)
833 {
834         if (pl->pl_stats != NULL) {
835                 lprocfs_free_stats(&pl->pl_stats);
836                 pl->pl_stats = NULL;
837         }
838         if (pl->pl_proc_dir != NULL) {
839                 lprocfs_remove(&pl->pl_proc_dir);
840                 pl->pl_proc_dir = NULL;
841         }
842 }
843
844 int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns,
845                    int idx, ldlm_side_t client)
846 {
847         int rc;
848         ENTRY;
849
850         spin_lock_init(&pl->pl_lock);
851         atomic_set(&pl->pl_granted, 0);
852         pl->pl_recalc_time = cfs_time_current_sec();
853         atomic_set(&pl->pl_lock_volume_factor, 1);
854
855         atomic_set(&pl->pl_grant_rate, 0);
856         atomic_set(&pl->pl_cancel_rate, 0);
857         pl->pl_grant_plan = LDLM_POOL_GP(LDLM_POOL_HOST_L);
858
859         snprintf(pl->pl_name, sizeof(pl->pl_name), "ldlm-pool-%s-%d",
860                  ldlm_ns_name(ns), idx);
861
862         if (client == LDLM_NAMESPACE_SERVER) {
863                 pl->pl_ops = &ldlm_srv_pool_ops;
864                 ldlm_pool_set_limit(pl, LDLM_POOL_HOST_L);
865                 pl->pl_recalc_period = LDLM_POOL_SRV_DEF_RECALC_PERIOD;
866                 pl->pl_server_lock_volume = ldlm_pool_slv_max(LDLM_POOL_HOST_L);
867         } else {
868                 ldlm_pool_set_limit(pl, 1);
869                 pl->pl_server_lock_volume = 0;
870                 pl->pl_ops = &ldlm_cli_pool_ops;
871                 pl->pl_recalc_period = LDLM_POOL_CLI_DEF_RECALC_PERIOD;
872         }
873         pl->pl_client_lock_volume = 0;
874         rc = ldlm_pool_proc_init(pl);
875         if (rc)
876                 RETURN(rc);
877
878         CDEBUG(D_DLMTRACE, "Lock pool %s is initialized\n", pl->pl_name);
879
880         RETURN(rc);
881 }
882 EXPORT_SYMBOL(ldlm_pool_init);
883
884 void ldlm_pool_fini(struct ldlm_pool *pl)
885 {
886         ENTRY;
887         ldlm_pool_proc_fini(pl);
888
889         /*
890          * Pool should not be used after this point. We can't free it here as
891          * it lives in struct ldlm_namespace, but still interested in catching
892          * any abnormal using cases.
893          */
894         POISON(pl, 0x5a, sizeof(*pl));
895         EXIT;
896 }
897 EXPORT_SYMBOL(ldlm_pool_fini);
898
899 /**
900  * Add new taken ldlm lock \a lock into pool \a pl accounting.
901  */
902 void ldlm_pool_add(struct ldlm_pool *pl, struct ldlm_lock *lock)
903 {
904         /*
905          * FLOCK locks are special in a sense that they are almost never
906          * cancelled, instead special kind of lock is used to drop them.
907          * also there is no LRU for flock locks, so no point in tracking
908          * them anyway.
909          */
910         if (lock->l_resource->lr_type == LDLM_FLOCK)
911                 return;
912
913         atomic_inc(&pl->pl_granted);
914         atomic_inc(&pl->pl_grant_rate);
915         lprocfs_counter_incr(pl->pl_stats, LDLM_POOL_GRANT_STAT);
916         /*
917          * Do not do pool recalc for client side as all locks which
918          * potentially may be canceled has already been packed into
919          * enqueue/cancel rpc. Also we do not want to run out of stack
920          * with too long call paths.
921          */
922         if (ns_is_server(ldlm_pl2ns(pl)))
923                 ldlm_pool_recalc(pl);
924 }
925 EXPORT_SYMBOL(ldlm_pool_add);
926
927 /**
928  * Remove ldlm lock \a lock from pool \a pl accounting.
929  */
930 void ldlm_pool_del(struct ldlm_pool *pl, struct ldlm_lock *lock)
931 {
932         /*
933          * Filter out FLOCK locks. Read above comment in ldlm_pool_add().
934          */
935         if (lock->l_resource->lr_type == LDLM_FLOCK)
936                 return;
937
938         LASSERT(atomic_read(&pl->pl_granted) > 0);
939         atomic_dec(&pl->pl_granted);
940         atomic_inc(&pl->pl_cancel_rate);
941
942         lprocfs_counter_incr(pl->pl_stats, LDLM_POOL_CANCEL_STAT);
943
944         if (ns_is_server(ldlm_pl2ns(pl)))
945                 ldlm_pool_recalc(pl);
946 }
947 EXPORT_SYMBOL(ldlm_pool_del);
948
949 /**
950  * Returns current \a pl SLV.
951  *
952  * \pre ->pl_lock is not locked.
953  */
954 __u64 ldlm_pool_get_slv(struct ldlm_pool *pl)
955 {
956         __u64 slv;
957         spin_lock(&pl->pl_lock);
958         slv = pl->pl_server_lock_volume;
959         spin_unlock(&pl->pl_lock);
960         return slv;
961 }
962 EXPORT_SYMBOL(ldlm_pool_get_slv);
963
964 /**
965  * Sets passed \a slv to \a pl.
966  *
967  * \pre ->pl_lock is not locked.
968  */
969 void ldlm_pool_set_slv(struct ldlm_pool *pl, __u64 slv)
970 {
971         spin_lock(&pl->pl_lock);
972         pl->pl_server_lock_volume = slv;
973         spin_unlock(&pl->pl_lock);
974 }
975 EXPORT_SYMBOL(ldlm_pool_set_slv);
976
977 /**
978  * Returns current \a pl CLV.
979  *
980  * \pre ->pl_lock is not locked.
981  */
982 __u64 ldlm_pool_get_clv(struct ldlm_pool *pl)
983 {
984         __u64 slv;
985         spin_lock(&pl->pl_lock);
986         slv = pl->pl_client_lock_volume;
987         spin_unlock(&pl->pl_lock);
988         return slv;
989 }
990 EXPORT_SYMBOL(ldlm_pool_get_clv);
991
992 /**
993  * Sets passed \a clv to \a pl.
994  *
995  * \pre ->pl_lock is not locked.
996  */
997 void ldlm_pool_set_clv(struct ldlm_pool *pl, __u64 clv)
998 {
999         spin_lock(&pl->pl_lock);
1000         pl->pl_client_lock_volume = clv;
1001         spin_unlock(&pl->pl_lock);
1002 }
1003 EXPORT_SYMBOL(ldlm_pool_set_clv);
1004
1005 /**
1006  * Returns current \a pl limit.
1007  */
1008 __u32 ldlm_pool_get_limit(struct ldlm_pool *pl)
1009 {
1010         return atomic_read(&pl->pl_limit);
1011 }
1012 EXPORT_SYMBOL(ldlm_pool_get_limit);
1013
1014 /**
1015  * Sets passed \a limit to \a pl.
1016  */
1017 void ldlm_pool_set_limit(struct ldlm_pool *pl, __u32 limit)
1018 {
1019         atomic_set(&pl->pl_limit, limit);
1020 }
1021 EXPORT_SYMBOL(ldlm_pool_set_limit);
1022
1023 /**
1024  * Returns current LVF from \a pl.
1025  */
1026 __u32 ldlm_pool_get_lvf(struct ldlm_pool *pl)
1027 {
1028         return atomic_read(&pl->pl_lock_volume_factor);
1029 }
1030 EXPORT_SYMBOL(ldlm_pool_get_lvf);
1031
1032 static unsigned int ldlm_pool_granted(struct ldlm_pool *pl)
1033 {
1034         return atomic_read(&pl->pl_granted);
1035 }
1036
1037 static struct ptlrpc_thread *ldlm_pools_thread;
1038 static struct shrinker *ldlm_pools_srv_shrinker;
1039 static struct shrinker *ldlm_pools_cli_shrinker;
1040 static struct completion ldlm_pools_comp;
1041
1042 /*
1043 * count locks from all namespaces (if possible). Returns number of
1044 * cached locks.
1045 */
1046 static unsigned long ldlm_pools_count(ldlm_side_t client, gfp_t gfp_mask)
1047 {
1048         int total = 0, nr_ns;
1049         struct ldlm_namespace *ns;
1050         struct ldlm_namespace *ns_old = NULL; /* loop detection */
1051         void *cookie;
1052
1053         if (client == LDLM_NAMESPACE_CLIENT && !(gfp_mask & __GFP_FS))
1054                 return 0;
1055
1056         CDEBUG(D_DLMTRACE, "Request to count %s locks from all pools\n",
1057                client == LDLM_NAMESPACE_CLIENT ? "client" : "server");
1058
1059         cookie = cl_env_reenter();
1060
1061         /*
1062          * Find out how many resources we may release.
1063          */
1064         for (nr_ns = ldlm_namespace_nr_read(client);
1065              nr_ns > 0; nr_ns--) {
1066                 mutex_lock(ldlm_namespace_lock(client));
1067                 if (list_empty(ldlm_namespace_list(client))) {
1068                         mutex_unlock(ldlm_namespace_lock(client));
1069                         cl_env_reexit(cookie);
1070                         return 0;
1071                 }
1072                 ns = ldlm_namespace_first_locked(client);
1073
1074                 if (ns == ns_old) {
1075                         mutex_unlock(ldlm_namespace_lock(client));
1076                         break;
1077                 }
1078
1079                 if (ldlm_ns_empty(ns)) {
1080                         ldlm_namespace_move_to_inactive_locked(ns, client);
1081                         mutex_unlock(ldlm_namespace_lock(client));
1082                         continue;
1083                 }
1084
1085                 if (ns_old == NULL)
1086                         ns_old = ns;
1087
1088                 ldlm_namespace_get(ns);
1089                 ldlm_namespace_move_to_active_locked(ns, client);
1090                 mutex_unlock(ldlm_namespace_lock(client));
1091                 total += ldlm_pool_shrink(&ns->ns_pool, 0, gfp_mask);
1092                 ldlm_namespace_put(ns);
1093         }
1094
1095         cl_env_reexit(cookie);
1096         return total;
1097 }
1098
1099 static unsigned long ldlm_pools_scan(ldlm_side_t client, int nr,
1100                                      gfp_t gfp_mask)
1101 {
1102         unsigned long freed = 0;
1103         int tmp, nr_ns;
1104         struct ldlm_namespace *ns;
1105         void *cookie;
1106
1107         if (client == LDLM_NAMESPACE_CLIENT && !(gfp_mask & __GFP_FS))
1108                 return -1;
1109
1110         cookie = cl_env_reenter();
1111
1112         /*
1113          * Shrink at least ldlm_namespace_nr_read(client) namespaces.
1114          */
1115         for (tmp = nr_ns = ldlm_namespace_nr_read(client);
1116              tmp > 0; tmp--) {
1117                 int cancel, nr_locks;
1118
1119                 /*
1120                  * Do not call shrink under ldlm_namespace_lock(client)
1121                 */
1122                 mutex_lock(ldlm_namespace_lock(client));
1123                 if (list_empty(ldlm_namespace_list(client))) {
1124                         mutex_unlock(ldlm_namespace_lock(client));
1125                         break;
1126                 }
1127                 ns = ldlm_namespace_first_locked(client);
1128                 ldlm_namespace_get(ns);
1129                 ldlm_namespace_move_to_active_locked(ns, client);
1130                 mutex_unlock(ldlm_namespace_lock(client));
1131
1132                 nr_locks = ldlm_pool_granted(&ns->ns_pool);
1133                 /*
1134                  * We use to shrink propotionally but with new shrinker API,
1135                  * we lost the total number of freeable locks.
1136                  */
1137                 cancel = 1 + min_t(int, nr_locks, nr / nr_ns);
1138                 freed += ldlm_pool_shrink(&ns->ns_pool, cancel, gfp_mask);
1139                 ldlm_namespace_put(ns);
1140         }
1141         cl_env_reexit(cookie);
1142         /*
1143          * we only decrease the SLV in server pools shrinker, return
1144          * SHRINK_STOP to kernel to avoid needless loop. LU-1128
1145          */
1146         return (client == LDLM_NAMESPACE_SERVER) ? SHRINK_STOP : freed;
1147 }
1148
1149 #ifdef HAVE_SHRINKER_COUNT
1150 static unsigned long ldlm_pools_srv_count(struct shrinker *s,
1151                                           struct shrink_control *sc)
1152 {
1153         return ldlm_pools_count(LDLM_NAMESPACE_SERVER, sc->gfp_mask);
1154 }
1155
1156 static unsigned long ldlm_pools_srv_scan(struct shrinker *s,
1157                                          struct shrink_control *sc)
1158 {
1159         return ldlm_pools_scan(LDLM_NAMESPACE_SERVER, sc->nr_to_scan,
1160                                sc->gfp_mask);
1161 }
1162
1163 static unsigned long ldlm_pools_cli_count(struct shrinker *s, struct shrink_control *sc)
1164 {
1165         return ldlm_pools_count(LDLM_NAMESPACE_CLIENT, sc->gfp_mask);
1166 }
1167
1168 static unsigned long ldlm_pools_cli_scan(struct shrinker *s,
1169                                          struct shrink_control *sc)
1170 {
1171         return ldlm_pools_scan(LDLM_NAMESPACE_CLIENT, sc->nr_to_scan,
1172                                sc->gfp_mask);
1173 }
1174
1175 #else
1176 /*
1177  * Cancel \a nr locks from all namespaces (if possible). Returns number of
1178  * cached locks after shrink is finished. All namespaces are asked to
1179  * cancel approximately equal amount of locks to keep balancing.
1180  */
1181 static int ldlm_pools_shrink(ldlm_side_t client, int nr,
1182                              gfp_t gfp_mask)
1183 {
1184         unsigned int total = 0;
1185
1186         if (client == LDLM_NAMESPACE_CLIENT && nr != 0 &&
1187             !(gfp_mask & __GFP_FS))
1188                 return -1;
1189
1190         CDEBUG(D_DLMTRACE, "Request to shrink %d %s locks from all pools\n",
1191                nr, client == LDLM_NAMESPACE_CLIENT ? "client" : "server");
1192
1193         total = ldlm_pools_count(client, gfp_mask);
1194
1195         if (nr == 0 || total == 0)
1196                 return total;
1197
1198         return ldlm_pools_scan(client, nr, gfp_mask);
1199 }
1200
1201 static int ldlm_pools_srv_shrink(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask))
1202 {
1203         return ldlm_pools_shrink(LDLM_NAMESPACE_SERVER,
1204                                  shrink_param(sc, nr_to_scan),
1205                                  shrink_param(sc, gfp_mask));
1206 }
1207
1208 static int ldlm_pools_cli_shrink(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask))
1209 {
1210         return ldlm_pools_shrink(LDLM_NAMESPACE_CLIENT,
1211                                  shrink_param(sc, nr_to_scan),
1212                                  shrink_param(sc, gfp_mask));
1213 }
1214
1215 #endif /* HAVE_SHRINKER_COUNT */
1216
1217 int ldlm_pools_recalc(ldlm_side_t client)
1218 {
1219         __u32 nr_l = 0, nr_p = 0, l;
1220         struct ldlm_namespace *ns;
1221         struct ldlm_namespace *ns_old = NULL;
1222         int nr, equal = 0;
1223         int time = 50; /* seconds of sleep if no active namespaces */
1224
1225         /*
1226          * No need to setup pool limit for client pools.
1227          */
1228         if (client == LDLM_NAMESPACE_SERVER) {
1229                 /*
1230                  * Check all modest namespaces first.
1231                  */
1232                 mutex_lock(ldlm_namespace_lock(client));
1233                 list_for_each_entry(ns, ldlm_namespace_list(client),
1234                                     ns_list_chain)
1235                 {
1236                         if (ns->ns_appetite != LDLM_NAMESPACE_MODEST)
1237                                 continue;
1238
1239                         l = ldlm_pool_granted(&ns->ns_pool);
1240                         if (l == 0)
1241                                 l = 1;
1242
1243                         /*
1244                          * Set the modest pools limit equal to their avg granted
1245                          * locks + ~6%.
1246                          */
1247                         l += dru(l, LDLM_POOLS_MODEST_MARGIN_SHIFT, 0);
1248                         ldlm_pool_setup(&ns->ns_pool, l);
1249                         nr_l += l;
1250                         nr_p++;
1251                 }
1252
1253                 /*
1254                  * Make sure that modest namespaces did not eat more that 2/3
1255                  * of limit.
1256                  */
1257                 if (nr_l >= 2 * (LDLM_POOL_HOST_L / 3)) {
1258                         CWARN("\"Modest\" pools eat out 2/3 of server locks "
1259                               "limit (%d of %lu). This means that you have too "
1260                               "many clients for this amount of server RAM. "
1261                               "Upgrade server!\n", nr_l, LDLM_POOL_HOST_L);
1262                         equal = 1;
1263                 }
1264
1265                 /*
1266                  * The rest is given to greedy namespaces.
1267                  */
1268                 list_for_each_entry(ns, ldlm_namespace_list(client),
1269                                     ns_list_chain)
1270                 {
1271                         if (!equal && ns->ns_appetite != LDLM_NAMESPACE_GREEDY)
1272                                 continue;
1273
1274                         if (equal) {
1275                                 /*
1276                                  * In the case 2/3 locks are eaten out by
1277                                  * modest pools, we re-setup equal limit
1278                                  * for _all_ pools.
1279                                  */
1280                                 l = LDLM_POOL_HOST_L /
1281                                         ldlm_namespace_nr_read(client);
1282                         } else {
1283                                 /*
1284                                  * All the rest of greedy pools will have
1285                                  * all locks in equal parts.
1286                                  */
1287                                 l = (LDLM_POOL_HOST_L - nr_l) /
1288                                         (ldlm_namespace_nr_read(client) -
1289                                          nr_p);
1290                         }
1291                         ldlm_pool_setup(&ns->ns_pool, l);
1292                 }
1293                 mutex_unlock(ldlm_namespace_lock(client));
1294         }
1295
1296         /*
1297          * Recalc at least ldlm_namespace_nr(client) namespaces.
1298          */
1299         for (nr = ldlm_namespace_nr_read(client); nr > 0; nr--) {
1300                 int     skip;
1301                 /*
1302                  * Lock the list, get first @ns in the list, getref, move it
1303                  * to the tail, unlock and call pool recalc. This way we avoid
1304                  * calling recalc under @ns lock what is really good as we get
1305                  * rid of potential deadlock on client nodes when canceling
1306                  * locks synchronously.
1307                  */
1308                 mutex_lock(ldlm_namespace_lock(client));
1309                 if (list_empty(ldlm_namespace_list(client))) {
1310                         mutex_unlock(ldlm_namespace_lock(client));
1311                         break;
1312                 }
1313                 ns = ldlm_namespace_first_locked(client);
1314
1315                 if (ns_old == ns) { /* Full pass complete */
1316                         mutex_unlock(ldlm_namespace_lock(client));
1317                         break;
1318                 }
1319
1320                 /* We got an empty namespace, need to move it back to inactive
1321                  * list.
1322                  * The race with parallel resource creation is fine:
1323                  * - If they do namespace_get before our check, we fail the
1324                  *   check and they move this item to the end of the list anyway
1325                  * - If we do the check and then they do namespace_get, then
1326                  *   we move the namespace to inactive and they will move
1327                  *   it back to active (synchronised by the lock, so no clash
1328                  *   there).
1329                  */
1330                 if (ldlm_ns_empty(ns)) {
1331                         ldlm_namespace_move_to_inactive_locked(ns, client);
1332                         mutex_unlock(ldlm_namespace_lock(client));
1333                         continue;
1334                 }
1335
1336                 if (ns_old == NULL)
1337                         ns_old = ns;
1338
1339                 spin_lock(&ns->ns_lock);
1340                 /*
1341                  * skip ns which is being freed, and we don't want to increase
1342                  * its refcount again, not even temporarily. bz21519 & LU-499.
1343                  */
1344                 if (ns->ns_stopping) {
1345                         skip = 1;
1346                 } else {
1347                         skip = 0;
1348                         ldlm_namespace_get(ns);
1349                 }
1350                 spin_unlock(&ns->ns_lock);
1351
1352                 ldlm_namespace_move_to_active_locked(ns, client);
1353                 mutex_unlock(ldlm_namespace_lock(client));
1354
1355                 /*
1356                  * After setup is done - recalc the pool.
1357                  */
1358                 if (!skip) {
1359                         int ttime = ldlm_pool_recalc(&ns->ns_pool);
1360
1361                         if (ttime < time)
1362                                 time = ttime;
1363
1364                         ldlm_namespace_put(ns);
1365                 }
1366         }
1367         return time;
1368 }
1369 EXPORT_SYMBOL(ldlm_pools_recalc);
1370
1371 static int ldlm_pools_thread_main(void *arg)
1372 {
1373         struct ptlrpc_thread *thread = (struct ptlrpc_thread *)arg;
1374         int s_time, c_time;
1375         ENTRY;
1376
1377         thread_set_flags(thread, SVC_RUNNING);
1378         wake_up(&thread->t_ctl_waitq);
1379
1380         CDEBUG(D_DLMTRACE, "%s: pool thread starting, process %d\n",
1381                "ldlm_poold", current_pid());
1382
1383         while (1) {
1384                 struct l_wait_info lwi;
1385
1386                 /*
1387                  * Recal all pools on this tick.
1388                  */
1389                 s_time = ldlm_pools_recalc(LDLM_NAMESPACE_SERVER);
1390                 c_time = ldlm_pools_recalc(LDLM_NAMESPACE_CLIENT);
1391
1392                 /*
1393                  * Wait until the next check time, or until we're
1394                  * stopped.
1395                  */
1396                 lwi = LWI_TIMEOUT(cfs_time_seconds(min(s_time, c_time)),
1397                                   NULL, NULL);
1398                 l_wait_event(thread->t_ctl_waitq,
1399                              thread_is_stopping(thread) ||
1400                              thread_is_event(thread),
1401                              &lwi);
1402
1403                 if (thread_test_and_clear_flags(thread, SVC_STOPPING))
1404                         break;
1405                 else
1406                         thread_test_and_clear_flags(thread, SVC_EVENT);
1407         }
1408
1409         thread_set_flags(thread, SVC_STOPPED);
1410         wake_up(&thread->t_ctl_waitq);
1411
1412         CDEBUG(D_DLMTRACE, "%s: pool thread exiting, process %d\n",
1413                 "ldlm_poold", current_pid());
1414
1415         complete_and_exit(&ldlm_pools_comp, 0);
1416 }
1417
1418 static int ldlm_pools_thread_start(void)
1419 {
1420         struct l_wait_info lwi = { 0 };
1421         struct task_struct *task;
1422         ENTRY;
1423
1424         if (ldlm_pools_thread != NULL)
1425                 RETURN(-EALREADY);
1426
1427         OBD_ALLOC_PTR(ldlm_pools_thread);
1428         if (ldlm_pools_thread == NULL)
1429                 RETURN(-ENOMEM);
1430
1431         init_completion(&ldlm_pools_comp);
1432         init_waitqueue_head(&ldlm_pools_thread->t_ctl_waitq);
1433
1434         task = kthread_run(ldlm_pools_thread_main, ldlm_pools_thread,
1435                            "ldlm_poold");
1436         if (IS_ERR(task)) {
1437                 CERROR("Can't start pool thread, error %ld\n", PTR_ERR(task));
1438                 OBD_FREE(ldlm_pools_thread, sizeof(*ldlm_pools_thread));
1439                 ldlm_pools_thread = NULL;
1440                 RETURN(PTR_ERR(task));
1441         }
1442         l_wait_event(ldlm_pools_thread->t_ctl_waitq,
1443                      thread_is_running(ldlm_pools_thread), &lwi);
1444         RETURN(0);
1445 }
1446
1447 static void ldlm_pools_thread_stop(void)
1448 {
1449         ENTRY;
1450
1451         if (ldlm_pools_thread == NULL) {
1452                 EXIT;
1453                 return;
1454         }
1455
1456         thread_set_flags(ldlm_pools_thread, SVC_STOPPING);
1457         wake_up(&ldlm_pools_thread->t_ctl_waitq);
1458
1459         /*
1460          * Make sure that pools thread is finished before freeing @thread.
1461          * This fixes possible race and oops due to accessing freed memory
1462          * in pools thread.
1463          */
1464         wait_for_completion(&ldlm_pools_comp);
1465         OBD_FREE_PTR(ldlm_pools_thread);
1466         ldlm_pools_thread = NULL;
1467         EXIT;
1468 }
1469
1470 int ldlm_pools_init(void)
1471 {
1472         int rc;
1473         DEF_SHRINKER_VAR(shsvar, ldlm_pools_srv_shrink,
1474                          ldlm_pools_srv_count, ldlm_pools_srv_scan);
1475         DEF_SHRINKER_VAR(shcvar, ldlm_pools_cli_shrink,
1476                          ldlm_pools_cli_count, ldlm_pools_cli_scan);
1477         ENTRY;
1478
1479         rc = ldlm_pools_thread_start();
1480         if (rc == 0) {
1481                 ldlm_pools_srv_shrinker =
1482                         set_shrinker(DEFAULT_SEEKS, &shsvar);
1483                 ldlm_pools_cli_shrinker =
1484                         set_shrinker(DEFAULT_SEEKS, &shcvar);
1485         }
1486         RETURN(rc);
1487 }
1488 EXPORT_SYMBOL(ldlm_pools_init);
1489
1490 void ldlm_pools_fini(void)
1491 {
1492         if (ldlm_pools_srv_shrinker != NULL) {
1493                 remove_shrinker(ldlm_pools_srv_shrinker);
1494                 ldlm_pools_srv_shrinker = NULL;
1495         }
1496         if (ldlm_pools_cli_shrinker != NULL) {
1497                 remove_shrinker(ldlm_pools_cli_shrinker);
1498                 ldlm_pools_cli_shrinker = NULL;
1499         }
1500         ldlm_pools_thread_stop();
1501 }
1502 EXPORT_SYMBOL(ldlm_pools_fini);
1503
1504 #else /* !HAVE_LRU_RESIZE_SUPPORT */
1505 int ldlm_pool_setup(struct ldlm_pool *pl, int limit)
1506 {
1507         return 0;
1508 }
1509 EXPORT_SYMBOL(ldlm_pool_setup);
1510
1511 int ldlm_pool_recalc(struct ldlm_pool *pl)
1512 {
1513         return 0;
1514 }
1515 EXPORT_SYMBOL(ldlm_pool_recalc);
1516
1517 int ldlm_pool_shrink(struct ldlm_pool *pl,
1518                      int nr, gfp_t gfp_mask)
1519 {
1520         return 0;
1521 }
1522 EXPORT_SYMBOL(ldlm_pool_shrink);
1523
1524 int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns,
1525                    int idx, ldlm_side_t client)
1526 {
1527         return 0;
1528 }
1529 EXPORT_SYMBOL(ldlm_pool_init);
1530
1531 void ldlm_pool_fini(struct ldlm_pool *pl)
1532 {
1533         return;
1534 }
1535 EXPORT_SYMBOL(ldlm_pool_fini);
1536
1537 void ldlm_pool_add(struct ldlm_pool *pl, struct ldlm_lock *lock)
1538 {
1539         return;
1540 }
1541 EXPORT_SYMBOL(ldlm_pool_add);
1542
1543 void ldlm_pool_del(struct ldlm_pool *pl, struct ldlm_lock *lock)
1544 {
1545         return;
1546 }
1547 EXPORT_SYMBOL(ldlm_pool_del);
1548
1549 __u64 ldlm_pool_get_slv(struct ldlm_pool *pl)
1550 {
1551         return 1;
1552 }
1553 EXPORT_SYMBOL(ldlm_pool_get_slv);
1554
1555 void ldlm_pool_set_slv(struct ldlm_pool *pl, __u64 slv)
1556 {
1557         return;
1558 }
1559 EXPORT_SYMBOL(ldlm_pool_set_slv);
1560
1561 __u64 ldlm_pool_get_clv(struct ldlm_pool *pl)
1562 {
1563         return 1;
1564 }
1565 EXPORT_SYMBOL(ldlm_pool_get_clv);
1566
1567 void ldlm_pool_set_clv(struct ldlm_pool *pl, __u64 clv)
1568 {
1569         return;
1570 }
1571 EXPORT_SYMBOL(ldlm_pool_set_clv);
1572
1573 __u32 ldlm_pool_get_limit(struct ldlm_pool *pl)
1574 {
1575         return 0;
1576 }
1577 EXPORT_SYMBOL(ldlm_pool_get_limit);
1578
1579 void ldlm_pool_set_limit(struct ldlm_pool *pl, __u32 limit)
1580 {
1581         return;
1582 }
1583 EXPORT_SYMBOL(ldlm_pool_set_limit);
1584
1585 __u32 ldlm_pool_get_lvf(struct ldlm_pool *pl)
1586 {
1587         return 0;
1588 }
1589 EXPORT_SYMBOL(ldlm_pool_get_lvf);
1590
1591 int ldlm_pools_init(void)
1592 {
1593         return 0;
1594 }
1595 EXPORT_SYMBOL(ldlm_pools_init);
1596
1597 void ldlm_pools_fini(void)
1598 {
1599         return;
1600 }
1601 EXPORT_SYMBOL(ldlm_pools_fini);
1602
1603 int ldlm_pools_recalc(ldlm_side_t client)
1604 {
1605         return 0;
1606 }
1607 EXPORT_SYMBOL(ldlm_pools_recalc);
1608 #endif /* HAVE_LRU_RESIZE_SUPPORT */