Whamcloud - gitweb
b=21815 Test case for clear stale nid-stats hash.
[fs/lustre-release.git] / lustre / ldlm / ldlm_pool.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
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 #ifdef __KERNEL__
101 # include <lustre_dlm.h>
102 #else
103 # include <liblustre.h>
104 # include <libcfs/kp30.h>
105 #endif
106
107 #include <obd_class.h>
108 #include <obd_support.h>
109 #include "ldlm_internal.h"
110
111 #ifdef HAVE_LRU_RESIZE_SUPPORT
112
113 /*
114  * 50 ldlm locks for 1MB of RAM.
115  */
116 #define LDLM_POOL_HOST_L ((CFS_NUM_CACHEPAGES >> (20 - CFS_PAGE_SHIFT)) * 50)
117
118 /*
119  * Maximal possible grant step plan in %.
120  */
121 #define LDLM_POOL_MAX_GSP (30)
122
123 /*
124  * Minimal possible grant step plan in %.
125  */
126 #define LDLM_POOL_MIN_GSP (1)
127
128 /*
129  * This controls the speed of reaching LDLM_POOL_MAX_GSP
130  * with increasing thread period. This is 4s which means
131  * that for 10s thread period we will have 2 steps by 4s
132  * each.
133  */
134 #define LDLM_POOL_GSP_STEP_SHIFT (2)
135
136 /*
137  * LDLM_POOL_GSP% of all locks is default GP.
138  */
139 #define LDLM_POOL_GP(L)   (((L) * LDLM_POOL_MAX_GSP) / 100)
140
141 /*
142  * Max age for locks on clients.
143  */
144 #define LDLM_POOL_MAX_AGE (36000)
145
146 /*
147  * The granularity of SLV calculation.
148  */
149 #define LDLM_POOL_SLV_SHIFT (10)
150
151 #ifdef __KERNEL__
152 extern cfs_proc_dir_entry_t *ldlm_ns_proc_dir;
153 #endif
154
155 static inline __u64 dru(__u64 val, __u32 shift, int round_up)
156 {
157         return (val + (round_up ? (1 << shift) - 1 : 0)) >> shift;
158 }
159
160 static inline __u64 ldlm_pool_slv_max(__u32 L)
161 {
162         /*
163          * Allow to have all locks for 1 client for 10 hrs.
164          * Formula is the following: limit * 10h / 1 client.
165          */
166         __u64 lim = (__u64)L *  LDLM_POOL_MAX_AGE / 1;
167         return lim;
168 }
169
170 static inline __u64 ldlm_pool_slv_min(__u32 L)
171 {
172         return 1;
173 }
174
175 enum {
176         LDLM_POOL_FIRST_STAT = 0,
177         LDLM_POOL_GRANTED_STAT = LDLM_POOL_FIRST_STAT,
178         LDLM_POOL_GRANT_STAT,
179         LDLM_POOL_CANCEL_STAT,
180         LDLM_POOL_GRANT_RATE_STAT,
181         LDLM_POOL_CANCEL_RATE_STAT,
182         LDLM_POOL_GRANT_PLAN_STAT,
183         LDLM_POOL_SLV_STAT,
184         LDLM_POOL_SHRINK_REQTD_STAT,
185         LDLM_POOL_SHRINK_FREED_STAT,
186         LDLM_POOL_RECALC_STAT,
187         LDLM_POOL_TIMING_STAT,
188         LDLM_POOL_LAST_STAT
189 };
190
191 static inline struct ldlm_namespace *ldlm_pl2ns(struct ldlm_pool *pl)
192 {
193         return container_of(pl, struct ldlm_namespace, ns_pool);
194 }
195
196 /**
197  * Calculates suggested grant_step in % of available locks for passed
198  * \a period. This is later used in grant_plan calculations.
199  */
200 static inline int ldlm_pool_t2gsp(unsigned int t)
201 {
202         /*
203          * This yields 1% grant step for anything below LDLM_POOL_GSP_STEP
204          * and up to 30% for anything higher than LDLM_POOL_GSP_STEP.
205          *
206          * How this will affect execution is the following:
207          *
208          * - for thread period 1s we will have grant_step 1% which good from
209          * pov of taking some load off from server and push it out to clients.
210          * This is like that because 1% for grant_step means that server will
211          * not allow clients to get lots of locks in short period of time and
212          * keep all old locks in their caches. Clients will always have to
213          * get some locks back if they want to take some new;
214          *
215          * - for thread period 10s (which is default) we will have 23% which
216          * means that clients will have enough of room to take some new locks
217          * without getting some back. All locks from this 23% which were not
218          * taken by clients in current period will contribute in SLV growing.
219          * SLV growing means more locks cached on clients until limit or grant
220          * plan is reached.
221          */
222         return LDLM_POOL_MAX_GSP -
223                 ((LDLM_POOL_MAX_GSP - LDLM_POOL_MIN_GSP) >>
224                  (t >> LDLM_POOL_GSP_STEP_SHIFT));
225 }
226
227 /**
228  * Recalculates next grant limit on passed \a pl.
229  *
230  * \pre ->pl_lock is locked.
231  */
232 static inline void ldlm_pool_recalc_grant_plan(struct ldlm_pool *pl)
233 {
234         int granted, grant_step, limit;
235
236         limit = ldlm_pool_get_limit(pl);
237         granted = atomic_read(&pl->pl_granted);
238
239         grant_step = ldlm_pool_t2gsp(pl->pl_recalc_period);
240         grant_step = ((limit - granted) * grant_step) / 100;
241         pl->pl_grant_plan = granted + grant_step;
242 }
243
244 /**
245  * Recalculates next SLV on passed \a pl.
246  *
247  * \pre ->pl_lock is locked.
248  */
249 static inline void ldlm_pool_recalc_slv(struct ldlm_pool *pl)
250 {
251         int granted;
252         int grant_plan;
253         int round_up;
254         __u64 slv;
255         __u64 slv_factor;
256         __u64 grant_usage;
257         __u32 limit;
258
259         slv = pl->pl_server_lock_volume;
260         grant_plan = pl->pl_grant_plan;
261         limit = ldlm_pool_get_limit(pl);
262         granted = atomic_read(&pl->pl_granted);
263         round_up = granted < limit;
264
265         grant_usage = max_t(int, limit - (granted - grant_plan), 1);
266
267         /*
268          * Find out SLV change factor which is the ratio of grant usage
269          * from limit. SLV changes as fast as the ratio of grant plan
270          * consumption. The more locks from grant plan are not consumed
271          * by clients in last interval (idle time), the faster grows
272          * SLV. And the opposite, the more grant plan is over-consumed
273          * (load time) the faster drops SLV.
274          */
275         slv_factor = (grant_usage << LDLM_POOL_SLV_SHIFT);
276         do_div(slv_factor, limit);
277         if (2 * abs(granted - limit) > limit) {
278                 slv_factor *= slv_factor;
279                 slv_factor = dru(slv_factor, LDLM_POOL_SLV_SHIFT, round_up);
280         }
281         slv = slv * slv_factor;
282         slv = dru(slv, LDLM_POOL_SLV_SHIFT, round_up);
283
284         if (slv > ldlm_pool_slv_max(limit)) {
285                 slv = ldlm_pool_slv_max(limit);
286         } else if (slv < ldlm_pool_slv_min(limit)) {
287                 slv = ldlm_pool_slv_min(limit);
288         }
289
290         pl->pl_server_lock_volume = slv;
291 }
292
293 /**
294  * Recalculates next stats on passed \a pl.
295  *
296  * \pre ->pl_lock is locked.
297  */
298 static inline void ldlm_pool_recalc_stats(struct ldlm_pool *pl)
299 {
300         int grant_plan = pl->pl_grant_plan;
301         __u64 slv = pl->pl_server_lock_volume;
302         int granted = atomic_read(&pl->pl_granted);
303         int grant_rate = atomic_read(&pl->pl_grant_rate);
304         int cancel_rate = atomic_read(&pl->pl_cancel_rate);
305
306         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_SLV_STAT,
307                             slv);
308         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_GRANTED_STAT,
309                             granted);
310         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_GRANT_RATE_STAT,
311                             grant_rate);
312         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_GRANT_PLAN_STAT,
313                             grant_plan);
314         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_CANCEL_RATE_STAT,
315                             cancel_rate);
316 }
317
318 /**
319  * Sets current SLV into obd accessible via ldlm_pl2ns(pl)->ns_obd.
320  */
321 static void ldlm_srv_pool_push_slv(struct ldlm_pool *pl)
322 {
323         struct obd_device *obd;
324
325         /*
326          * Set new SLV in obd field for using it later without accessing the
327          * pool. This is required to avoid race between sending reply to client
328          * with new SLV and cleanup server stack in which we can't guarantee
329          * that namespace is still alive. We know only that obd is alive as
330          * long as valid export is alive.
331          */
332         obd = ldlm_pl2ns(pl)->ns_obd;
333         LASSERT(obd != NULL);
334         write_lock(&obd->obd_pool_lock);
335         obd->obd_pool_slv = pl->pl_server_lock_volume;
336         write_unlock(&obd->obd_pool_lock);
337 }
338
339 /**
340  * Recalculates all pool fields on passed \a pl.
341  *
342  * \pre ->pl_lock is not locked.
343  */
344 static int ldlm_srv_pool_recalc(struct ldlm_pool *pl)
345 {
346         time_t recalc_interval_sec;
347         ENTRY;
348
349         spin_lock(&pl->pl_lock);
350         recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time;
351         if (recalc_interval_sec >= pl->pl_recalc_period) {
352                 /*
353                  * Recalc SLV after last period. This should be done
354                  * _before_ recalculating new grant plan.
355                  */
356                 ldlm_pool_recalc_slv(pl);
357
358                 /*
359                  * Make sure that pool informed obd of last SLV changes.
360                  */
361                 ldlm_srv_pool_push_slv(pl);
362
363                 /*
364                  * Update grant_plan for new period.
365                  */
366                 ldlm_pool_recalc_grant_plan(pl);
367
368                 pl->pl_recalc_time = cfs_time_current_sec();
369                 lprocfs_counter_add(pl->pl_stats, LDLM_POOL_TIMING_STAT,
370                                     recalc_interval_sec);
371         }
372         spin_unlock(&pl->pl_lock);
373         RETURN(0);
374 }
375
376 /**
377  * This function is used on server side as main entry point for memory
378  * pressure handling. It decreases SLV on \a pl according to passed
379  * \a nr and \a gfp_mask.
380  *
381  * Our goal here is to decrease SLV such a way that clients hold \a nr
382  * locks smaller in next 10h.
383  */
384 static int ldlm_srv_pool_shrink(struct ldlm_pool *pl,
385                                 int nr, unsigned int gfp_mask)
386 {
387         __u32 limit;
388
389         /*
390          * VM is asking how many entries may be potentially freed.
391          */
392         if (nr == 0)
393                 return atomic_read(&pl->pl_granted);
394
395         /*
396          * Client already canceled locks but server is already in shrinker
397          * and can't cancel anything. Let's catch this race.
398          */
399         if (atomic_read(&pl->pl_granted) == 0)
400                 RETURN(0);
401
402         spin_lock(&pl->pl_lock);
403
404         /*
405          * We want shrinker to possibly cause cancellation of @nr locks from
406          * clients or grant approximately @nr locks smaller next intervals.
407          *
408          * This is why we decreased SLV by @nr. This effect will only be as
409          * long as one re-calc interval (1s these days) and this should be
410          * enough to pass this decreased SLV to all clients. On next recalc
411          * interval pool will either increase SLV if locks load is not high
412          * or will keep on same level or even decrease again, thus, shrinker
413          * decreased SLV will affect next recalc intervals and this way will
414          * make locking load lower.
415          */
416         if (nr < pl->pl_server_lock_volume) {
417                 pl->pl_server_lock_volume = pl->pl_server_lock_volume - nr;
418         } else {
419                 limit = ldlm_pool_get_limit(pl);
420                 pl->pl_server_lock_volume = ldlm_pool_slv_min(limit);
421         }
422
423         /*
424          * Make sure that pool informed obd of last SLV changes.
425          */
426         ldlm_srv_pool_push_slv(pl);
427         spin_unlock(&pl->pl_lock);
428
429         /*
430          * We did not really free any memory here so far, it only will be
431          * freed later may be, so that we return 0 to not confuse VM.
432          */
433         return 0;
434 }
435
436 /**
437  * Setup server side pool \a pl with passed \a limit.
438  */
439 static int ldlm_srv_pool_setup(struct ldlm_pool *pl, int limit)
440 {
441         struct obd_device *obd;
442         ENTRY;
443
444         obd = ldlm_pl2ns(pl)->ns_obd;
445         LASSERT(obd != NULL && obd != LP_POISON);
446         LASSERT(obd->obd_type != LP_POISON);
447         write_lock(&obd->obd_pool_lock);
448         obd->obd_pool_limit = limit;
449         write_unlock(&obd->obd_pool_lock);
450
451         ldlm_pool_set_limit(pl, limit);
452         RETURN(0);
453 }
454
455 /**
456  * Sets SLV and Limit from ldlm_pl2ns(pl)->ns_obd tp passed \a pl.
457  */
458 static void ldlm_cli_pool_pop_slv(struct ldlm_pool *pl)
459 {
460         struct obd_device *obd;
461
462         /*
463          * Get new SLV and Limit from obd which is updated with coming
464          * RPCs.
465          */
466         obd = ldlm_pl2ns(pl)->ns_obd;
467         LASSERT(obd != NULL);
468         read_lock(&obd->obd_pool_lock);
469         pl->pl_server_lock_volume = obd->obd_pool_slv;
470         ldlm_pool_set_limit(pl, obd->obd_pool_limit);
471         read_unlock(&obd->obd_pool_lock);
472 }
473
474 /**
475  * Recalculates client size pool \a pl according to current SLV and Limit.
476  */
477 static int ldlm_cli_pool_recalc(struct ldlm_pool *pl)
478 {
479         time_t recalc_interval_sec;
480         ENTRY;
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
497         pl->pl_recalc_time = cfs_time_current_sec();
498         lprocfs_counter_add(pl->pl_stats, LDLM_POOL_TIMING_STAT,
499                             recalc_interval_sec);
500         spin_unlock(&pl->pl_lock);
501
502         /*
503          * Do not cancel locks in case lru resize is disabled for this ns.
504          */
505         if (!ns_connect_lru_resize(ldlm_pl2ns(pl)))
506                 RETURN(0);
507
508         /*
509          * In the time of canceling locks on client we do not need to maintain
510          * sharp timing, we only want to cancel locks asap according to new SLV.
511          * It may be called when SLV has changed much, this is why we do not
512          * take into account pl->pl_recalc_time here.
513          */
514         RETURN(ldlm_cancel_lru(ldlm_pl2ns(pl), 0, LDLM_SYNC,
515                                LDLM_CANCEL_LRUR));
516 }
517
518 /**
519  * This function is main entry point for memory pressure handling on client
520  * side.  Main goal of this function is to cancel some number of locks on
521  * passed \a pl according to \a nr and \a gfp_mask.
522  */
523 static int ldlm_cli_pool_shrink(struct ldlm_pool *pl,
524                                 int nr, unsigned int gfp_mask)
525 {
526         struct ldlm_namespace *ns;
527         int canceled = 0, unused;
528
529         ns = ldlm_pl2ns(pl);
530
531         /*
532          * Do not cancel locks in case lru resize is disabled for this ns.
533          */
534         if (!ns_connect_lru_resize(ns))
535                 return 0;
536
537         /*
538          * Make sure that pool knows last SLV and Limit from obd.
539          */
540         ldlm_cli_pool_pop_slv(pl);
541
542         spin_lock(&ns->ns_unused_lock);
543         unused = ns->ns_nr_unused;
544         spin_unlock(&ns->ns_unused_lock);
545
546         if (nr) {
547                 canceled = ldlm_cancel_lru(ns, nr, LDLM_SYNC,
548                                            LDLM_CANCEL_SHRINK);
549         }
550 #ifdef __KERNEL__
551         /*
552          * Return the number of potentially reclaimable locks.
553          */
554         return ((unused - canceled) / 100) * sysctl_vfs_cache_pressure;
555 #else
556         return unused - canceled;
557 #endif
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         spin_lock(&pl->pl_lock);
581         recalc_interval_sec = cfs_time_current_sec() - pl->pl_recalc_time;
582         if (recalc_interval_sec > 0) {
583                 /*
584                  * Update pool statistics every 1s.
585                  */
586                 ldlm_pool_recalc_stats(pl);
587
588                 /*
589                  * Zero out all rates and speed for the last period.
590                  */
591                 atomic_set(&pl->pl_grant_rate, 0);
592                 atomic_set(&pl->pl_cancel_rate, 0);
593                 atomic_set(&pl->pl_grant_speed, 0);
594         }
595         spin_unlock(&pl->pl_lock);
596
597         if (pl->pl_ops->po_recalc != NULL) {
598                 count = pl->pl_ops->po_recalc(pl);
599                 lprocfs_counter_add(pl->pl_stats, LDLM_POOL_RECALC_STAT,
600                                     count);
601                 return count;
602         }
603
604         return 0;
605 }
606 EXPORT_SYMBOL(ldlm_pool_recalc);
607
608 /**
609  * Pool shrink wrapper. Will call either client or server pool recalc callback
610  * depending what pool \a pl is used.
611  */
612 int ldlm_pool_shrink(struct ldlm_pool *pl, int nr,
613                      unsigned int gfp_mask)
614 {
615         int cancel = 0;
616
617         if (pl->pl_ops->po_shrink != NULL) {
618                 cancel = pl->pl_ops->po_shrink(pl, nr, gfp_mask);
619                 if (nr > 0) {
620                         lprocfs_counter_add(pl->pl_stats,
621                                             LDLM_POOL_SHRINK_REQTD_STAT,
622                                             nr);
623                         lprocfs_counter_add(pl->pl_stats,
624                                             LDLM_POOL_SHRINK_FREED_STAT,
625                                             cancel);
626                         CDEBUG(D_DLMTRACE, "%s: request to shrink %d locks, "
627                                "shrunk %d\n", pl->pl_name, nr, cancel);
628                 }
629         }
630         return cancel;
631 }
632 EXPORT_SYMBOL(ldlm_pool_shrink);
633
634 /**
635  * Pool setup wrapper. Will call either client or server pool recalc callback
636  * depending what pool \a pl is used.
637  *
638  * Sets passed \a limit into pool \a pl.
639  */
640 int ldlm_pool_setup(struct ldlm_pool *pl, int limit)
641 {
642         ENTRY;
643         if (pl->pl_ops->po_setup != NULL)
644                 RETURN(pl->pl_ops->po_setup(pl, limit));
645         RETURN(0);
646 }
647 EXPORT_SYMBOL(ldlm_pool_setup);
648
649 #ifdef __KERNEL__
650 static int lprocfs_rd_pool_state(char *page, char **start, off_t off,
651                                  int count, int *eof, void *data)
652 {
653         int granted, grant_rate, cancel_rate, grant_step;
654         int nr = 0, grant_speed, grant_plan, lvf;
655         struct ldlm_pool *pl = data;
656         __u64 slv, clv;
657         __u32 limit;
658
659         spin_lock(&pl->pl_lock);
660         slv = pl->pl_server_lock_volume;
661         clv = pl->pl_client_lock_volume;
662         limit = ldlm_pool_get_limit(pl);
663         grant_plan = pl->pl_grant_plan;
664         granted = atomic_read(&pl->pl_granted);
665         grant_rate = atomic_read(&pl->pl_grant_rate);
666         lvf = atomic_read(&pl->pl_lock_volume_factor);
667         grant_speed = atomic_read(&pl->pl_grant_speed);
668         cancel_rate = atomic_read(&pl->pl_cancel_rate);
669         grant_step = ldlm_pool_t2gsp(pl->pl_recalc_period);
670         spin_unlock(&pl->pl_lock);
671
672         nr += snprintf(page + nr, count - nr, "LDLM pool state (%s):\n",
673                        pl->pl_name);
674         nr += snprintf(page + nr, count - nr, "  SLV: "LPU64"\n", slv);
675         nr += snprintf(page + nr, count - nr, "  CLV: "LPU64"\n", clv);
676         nr += snprintf(page + nr, count - nr, "  LVF: %d\n", lvf);
677
678         if (ns_is_server(ldlm_pl2ns(pl))) {
679                 nr += snprintf(page + nr, count - nr, "  GSP: %d%%\n",
680                                grant_step);
681                 nr += snprintf(page + nr, count - nr, "  GP:  %d\n",
682                                grant_plan);
683         }
684         nr += snprintf(page + nr, count - nr, "  GR:  %d\n",
685                        grant_rate);
686         nr += snprintf(page + nr, count - nr, "  CR:  %d\n",
687                        cancel_rate);
688         nr += snprintf(page + nr, count - nr, "  GS:  %d\n",
689                        grant_speed);
690         nr += snprintf(page + nr, count - nr, "  G:   %d\n",
691                        granted);
692         nr += snprintf(page + nr, count - nr, "  L:   %d\n",
693                        limit);
694         return nr;
695 }
696
697 LDLM_POOL_PROC_READER(grant_plan, int);
698 LDLM_POOL_PROC_READER(recalc_period, int);
699 LDLM_POOL_PROC_WRITER(recalc_period, int);
700
701 static int ldlm_pool_proc_init(struct ldlm_pool *pl)
702 {
703         struct ldlm_namespace *ns = ldlm_pl2ns(pl);
704         struct proc_dir_entry *parent_ns_proc;
705         struct lprocfs_vars pool_vars[2];
706         char *var_name = NULL;
707         int rc = 0;
708         ENTRY;
709
710         OBD_ALLOC(var_name, MAX_STRING_SIZE + 1);
711         if (!var_name)
712                 RETURN(-ENOMEM);
713
714         parent_ns_proc = lprocfs_srch(ldlm_ns_proc_dir, ns->ns_name);
715         if (parent_ns_proc == NULL) {
716                 CERROR("%s: proc entry is not initialized\n",
717                        ns->ns_name);
718                 GOTO(out_free_name, rc = -EINVAL);
719         }
720         pl->pl_proc_dir = lprocfs_register("pool", parent_ns_proc,
721                                            NULL, NULL);
722         if (IS_ERR(pl->pl_proc_dir)) {
723                 CERROR("LProcFS failed in ldlm-pool-init\n");
724                 rc = PTR_ERR(pl->pl_proc_dir);
725                 GOTO(out_free_name, rc);
726         }
727
728         var_name[MAX_STRING_SIZE] = '\0';
729         memset(pool_vars, 0, sizeof(pool_vars));
730         pool_vars[0].name = var_name;
731
732         snprintf(var_name, MAX_STRING_SIZE, "server_lock_volume");
733         pool_vars[0].data = &pl->pl_server_lock_volume;
734         pool_vars[0].read_fptr = lprocfs_rd_u64;
735         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
736
737         snprintf(var_name, MAX_STRING_SIZE, "limit");
738         pool_vars[0].data = &pl->pl_limit;
739         pool_vars[0].read_fptr = lprocfs_rd_atomic;
740         pool_vars[0].write_fptr = lprocfs_wr_atomic;
741         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
742
743         snprintf(var_name, MAX_STRING_SIZE, "granted");
744         pool_vars[0].data = &pl->pl_granted;
745         pool_vars[0].read_fptr = lprocfs_rd_atomic;
746         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
747
748         snprintf(var_name, MAX_STRING_SIZE, "grant_speed");
749         pool_vars[0].data = &pl->pl_grant_speed;
750         pool_vars[0].read_fptr = lprocfs_rd_atomic;
751         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
752
753         snprintf(var_name, MAX_STRING_SIZE, "cancel_rate");
754         pool_vars[0].data = &pl->pl_cancel_rate;
755         pool_vars[0].read_fptr = lprocfs_rd_atomic;
756         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
757
758         snprintf(var_name, MAX_STRING_SIZE, "grant_rate");
759         pool_vars[0].data = &pl->pl_grant_rate;
760         pool_vars[0].read_fptr = lprocfs_rd_atomic;
761         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
762
763         snprintf(var_name, MAX_STRING_SIZE, "grant_plan");
764         pool_vars[0].data = pl;
765         pool_vars[0].read_fptr = lprocfs_rd_grant_plan;
766         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
767
768         snprintf(var_name, MAX_STRING_SIZE, "recalc_period");
769         pool_vars[0].data = pl;
770         pool_vars[0].read_fptr = lprocfs_rd_recalc_period;
771         pool_vars[0].write_fptr = lprocfs_wr_recalc_period;
772         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
773
774         snprintf(var_name, MAX_STRING_SIZE, "lock_volume_factor");
775         pool_vars[0].data = &pl->pl_lock_volume_factor;
776         pool_vars[0].read_fptr = lprocfs_rd_atomic;
777         pool_vars[0].write_fptr = lprocfs_wr_atomic;
778         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
779
780         snprintf(var_name, MAX_STRING_SIZE, "state");
781         pool_vars[0].data = pl;
782         pool_vars[0].read_fptr = lprocfs_rd_pool_state;
783         lprocfs_add_vars(pl->pl_proc_dir, pool_vars, 0);
784
785         pl->pl_stats = lprocfs_alloc_stats(LDLM_POOL_LAST_STAT -
786                                            LDLM_POOL_FIRST_STAT, 0);
787         if (!pl->pl_stats)
788                 GOTO(out_free_name, rc = -ENOMEM);
789
790         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANTED_STAT,
791                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
792                              "granted", "locks");
793         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANT_STAT,
794                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
795                              "grant", "locks");
796         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_CANCEL_STAT,
797                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
798                              "cancel", "locks");
799         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANT_RATE_STAT,
800                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
801                              "grant_rate", "locks/s");
802         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_CANCEL_RATE_STAT,
803                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
804                              "cancel_rate", "locks/s");
805         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_GRANT_PLAN_STAT,
806                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
807                              "grant_plan", "locks/s");
808         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_SLV_STAT,
809                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
810                              "slv", "slv");
811         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_SHRINK_REQTD_STAT,
812                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
813                              "shrink_request", "locks");
814         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_SHRINK_FREED_STAT,
815                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
816                              "shrink_freed", "locks");
817         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_RECALC_STAT,
818                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
819                              "recalc_freed", "locks");
820         lprocfs_counter_init(pl->pl_stats, LDLM_POOL_TIMING_STAT,
821                              LPROCFS_CNTR_AVGMINMAX | LPROCFS_CNTR_STDDEV,
822                              "recalc_timing", "sec");
823         lprocfs_register_stats(pl->pl_proc_dir, "stats", pl->pl_stats);
824
825         EXIT;
826 out_free_name:
827         OBD_FREE(var_name, MAX_STRING_SIZE + 1);
828         return rc;
829 }
830
831 static void ldlm_pool_proc_fini(struct ldlm_pool *pl)
832 {
833         if (pl->pl_stats != NULL) {
834                 lprocfs_free_stats(&pl->pl_stats);
835                 pl->pl_stats = NULL;
836         }
837         if (pl->pl_proc_dir != NULL) {
838                 lprocfs_remove(&pl->pl_proc_dir);
839                 pl->pl_proc_dir = NULL;
840         }
841 }
842 #else /* !__KERNEL__*/
843 #define ldlm_pool_proc_init(pl) (0)
844 #define ldlm_pool_proc_fini(pl) while (0) {}
845 #endif
846
847 int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns,
848                    int idx, ldlm_side_t client)
849 {
850         int rc;
851         ENTRY;
852
853         spin_lock_init(&pl->pl_lock);
854         atomic_set(&pl->pl_granted, 0);
855         pl->pl_recalc_time = cfs_time_current_sec();
856         atomic_set(&pl->pl_lock_volume_factor, 1);
857
858         atomic_set(&pl->pl_grant_rate, 0);
859         atomic_set(&pl->pl_cancel_rate, 0);
860         atomic_set(&pl->pl_grant_speed, 0);
861         pl->pl_grant_plan = LDLM_POOL_GP(LDLM_POOL_HOST_L);
862
863         snprintf(pl->pl_name, sizeof(pl->pl_name), "ldlm-pool-%s-%d",
864                  ns->ns_name, idx);
865
866         if (client == LDLM_NAMESPACE_SERVER) {
867                 pl->pl_ops = &ldlm_srv_pool_ops;
868                 ldlm_pool_set_limit(pl, LDLM_POOL_HOST_L);
869                 pl->pl_recalc_period = LDLM_POOL_SRV_DEF_RECALC_PERIOD;
870                 pl->pl_server_lock_volume = ldlm_pool_slv_max(LDLM_POOL_HOST_L);
871         } else {
872                 ldlm_pool_set_limit(pl, 1);
873                 pl->pl_server_lock_volume = 0;
874                 pl->pl_ops = &ldlm_cli_pool_ops;
875                 pl->pl_recalc_period = LDLM_POOL_CLI_DEF_RECALC_PERIOD;
876         }
877         pl->pl_client_lock_volume = 0;
878         rc = ldlm_pool_proc_init(pl);
879         if (rc)
880                 RETURN(rc);
881
882         CDEBUG(D_DLMTRACE, "Lock pool %s is initialized\n", pl->pl_name);
883
884         RETURN(rc);
885 }
886 EXPORT_SYMBOL(ldlm_pool_init);
887
888 void ldlm_pool_fini(struct ldlm_pool *pl)
889 {
890         ENTRY;
891         ldlm_pool_proc_fini(pl);
892
893         /*
894          * Pool should not be used after this point. We can't free it here as
895          * it lives in struct ldlm_namespace, but still interested in catching
896          * any abnormal using cases.
897          */
898         POISON(pl, 0x5a, sizeof(*pl));
899         EXIT;
900 }
901 EXPORT_SYMBOL(ldlm_pool_fini);
902
903 /**
904  * Add new taken ldlm lock \a lock into pool \a pl accounting.
905  */
906 void ldlm_pool_add(struct ldlm_pool *pl, struct ldlm_lock *lock)
907 {
908         /*
909          * FLOCK locks are special in a sense that they are almost never
910          * cancelled, instead special kind of lock is used to drop them.
911          * also there is no LRU for flock locks, so no point in tracking
912          * them anyway.
913          */
914         if (lock->l_resource->lr_type == LDLM_FLOCK)
915                 return;
916         ENTRY;
917
918         atomic_inc(&pl->pl_granted);
919         atomic_inc(&pl->pl_grant_rate);
920         atomic_inc(&pl->pl_grant_speed);
921
922         lprocfs_counter_incr(pl->pl_stats, LDLM_POOL_GRANT_STAT);
923
924         /*
925          * Do not do pool recalc for client side as all locks which
926          * potentially may be canceled has already been packed into
927          * enqueue/cancel rpc. Also we do not want to run out of stack
928          * with too long call paths.
929          */
930         if (ns_is_server(ldlm_pl2ns(pl)))
931                 ldlm_pool_recalc(pl);
932         EXIT;
933 }
934 EXPORT_SYMBOL(ldlm_pool_add);
935
936 /**
937  * Remove ldlm lock \a lock from pool \a pl accounting.
938  */
939 void ldlm_pool_del(struct ldlm_pool *pl, struct ldlm_lock *lock)
940 {
941         /*
942          * Filter out FLOCK locks. Read above comment in ldlm_pool_add().
943          */
944         if (lock->l_resource->lr_type == LDLM_FLOCK)
945                 return;
946         ENTRY;
947
948         LASSERT(atomic_read(&pl->pl_granted) > 0);
949         atomic_dec(&pl->pl_granted);
950         atomic_inc(&pl->pl_cancel_rate);
951         atomic_dec(&pl->pl_grant_speed);
952
953         lprocfs_counter_incr(pl->pl_stats, LDLM_POOL_CANCEL_STAT);
954
955         if (ns_is_server(ldlm_pl2ns(pl)))
956                 ldlm_pool_recalc(pl);
957         EXIT;
958 }
959 EXPORT_SYMBOL(ldlm_pool_del);
960
961 /**
962  * Returns current \a pl SLV.
963  *
964  * \pre ->pl_lock is not locked.
965  */
966 __u64 ldlm_pool_get_slv(struct ldlm_pool *pl)
967 {
968         __u64 slv;
969         spin_lock(&pl->pl_lock);
970         slv = pl->pl_server_lock_volume;
971         spin_unlock(&pl->pl_lock);
972         return slv;
973 }
974 EXPORT_SYMBOL(ldlm_pool_get_slv);
975
976 /**
977  * Sets passed \a slv to \a pl.
978  *
979  * \pre ->pl_lock is not locked.
980  */
981 void ldlm_pool_set_slv(struct ldlm_pool *pl, __u64 slv)
982 {
983         spin_lock(&pl->pl_lock);
984         pl->pl_server_lock_volume = slv;
985         spin_unlock(&pl->pl_lock);
986 }
987 EXPORT_SYMBOL(ldlm_pool_set_slv);
988
989 /**
990  * Returns current \a pl CLV.
991  *
992  * \pre ->pl_lock is not locked.
993  */
994 __u64 ldlm_pool_get_clv(struct ldlm_pool *pl)
995 {
996         __u64 slv;
997         spin_lock(&pl->pl_lock);
998         slv = pl->pl_client_lock_volume;
999         spin_unlock(&pl->pl_lock);
1000         return slv;
1001 }
1002 EXPORT_SYMBOL(ldlm_pool_get_clv);
1003
1004 /**
1005  * Sets passed \a clv to \a pl.
1006  *
1007  * \pre ->pl_lock is not locked.
1008  */
1009 void ldlm_pool_set_clv(struct ldlm_pool *pl, __u64 clv)
1010 {
1011         spin_lock(&pl->pl_lock);
1012         pl->pl_client_lock_volume = clv;
1013         spin_unlock(&pl->pl_lock);
1014 }
1015 EXPORT_SYMBOL(ldlm_pool_set_clv);
1016
1017 /**
1018  * Returns current \a pl limit.
1019  */
1020 __u32 ldlm_pool_get_limit(struct ldlm_pool *pl)
1021 {
1022         return atomic_read(&pl->pl_limit);
1023 }
1024 EXPORT_SYMBOL(ldlm_pool_get_limit);
1025
1026 /**
1027  * Sets passed \a limit to \a pl.
1028  */
1029 void ldlm_pool_set_limit(struct ldlm_pool *pl, __u32 limit)
1030 {
1031         atomic_set(&pl->pl_limit, limit);
1032 }
1033 EXPORT_SYMBOL(ldlm_pool_set_limit);
1034
1035 /**
1036  * Returns current LVF from \a pl.
1037  */
1038 __u32 ldlm_pool_get_lvf(struct ldlm_pool *pl)
1039 {
1040         return atomic_read(&pl->pl_lock_volume_factor);
1041 }
1042 EXPORT_SYMBOL(ldlm_pool_get_lvf);
1043
1044 #ifdef __KERNEL__
1045 static int ldlm_pool_granted(struct ldlm_pool *pl)
1046 {
1047         return atomic_read(&pl->pl_granted);
1048 }
1049
1050 static struct ptlrpc_thread *ldlm_pools_thread;
1051 static struct shrinker *ldlm_pools_srv_shrinker;
1052 static struct shrinker *ldlm_pools_cli_shrinker;
1053 static struct completion ldlm_pools_comp;
1054
1055 /*
1056  * Cancel \a nr locks from all namespaces (if possible). Returns number of
1057  * cached locks after shrink is finished. All namespaces are asked to
1058  * cancel approximately equal amount of locks to keep balancing.
1059  */
1060 static int ldlm_pools_shrink(ldlm_side_t client, int nr,
1061                              unsigned int gfp_mask)
1062 {
1063         int total = 0, cached = 0, nr_ns;
1064         struct ldlm_namespace *ns;
1065
1066         if (nr != 0 && !(gfp_mask & __GFP_FS))
1067                 return -1;
1068
1069         if (nr != 0)
1070                 CDEBUG(D_DLMTRACE, "Request to shrink %d %s locks\n",
1071                        nr, client == LDLM_NAMESPACE_CLIENT ? "client":"server");
1072
1073         /*
1074          * Find out how many resources we may release.
1075          */
1076         for (nr_ns = atomic_read(ldlm_namespace_nr(client));
1077              nr_ns > 0; nr_ns--)
1078         {
1079                 mutex_down(ldlm_namespace_lock(client));
1080                 if (list_empty(ldlm_namespace_list(client))) {
1081                         mutex_up(ldlm_namespace_lock(client));
1082                         return 0;
1083                 }
1084                 ns = ldlm_namespace_first_locked(client);
1085                 ldlm_namespace_get(ns);
1086                 ldlm_namespace_move_locked(ns, client);
1087                 mutex_up(ldlm_namespace_lock(client));
1088                 total += ldlm_pool_shrink(&ns->ns_pool, 0, gfp_mask);
1089                 ldlm_namespace_put(ns, 1);
1090         }
1091
1092         if (nr == 0 || total == 0)
1093                 return total;
1094
1095         /*
1096          * Shrink at least ldlm_namespace_nr(client) namespaces.
1097          */
1098         for (nr_ns = atomic_read(ldlm_namespace_nr(client));
1099              nr_ns > 0; nr_ns--)
1100         {
1101                 int cancel, nr_locks;
1102
1103                 /*
1104                  * Do not call shrink under ldlm_namespace_lock(client)
1105                  */
1106                 mutex_down(ldlm_namespace_lock(client));
1107                 if (list_empty(ldlm_namespace_list(client))) {
1108                         mutex_up(ldlm_namespace_lock(client));
1109                         /*
1110                          * If list is empty, we can't return any @cached > 0,
1111                          * that probably would cause needless shrinker
1112                          * call.
1113                          */
1114                         cached = 0;
1115                         break;
1116                 }
1117                 ns = ldlm_namespace_first_locked(client);
1118                 ldlm_namespace_get(ns);
1119                 ldlm_namespace_move_locked(ns, client);
1120                 mutex_up(ldlm_namespace_lock(client));
1121
1122                 nr_locks = ldlm_pool_granted(&ns->ns_pool);
1123                 cancel = 1 + nr_locks * nr / total;
1124                 ldlm_pool_shrink(&ns->ns_pool, cancel, gfp_mask);
1125                 cached += ldlm_pool_granted(&ns->ns_pool);
1126                 ldlm_namespace_put(ns, 1);
1127         }
1128         return cached;
1129 }
1130
1131 static int ldlm_pools_srv_shrink(int nr, unsigned int gfp_mask)
1132 {
1133         return ldlm_pools_shrink(LDLM_NAMESPACE_SERVER, nr, gfp_mask);
1134 }
1135
1136 static int ldlm_pools_cli_shrink(int nr, unsigned int gfp_mask)
1137 {
1138         return ldlm_pools_shrink(LDLM_NAMESPACE_CLIENT, nr, gfp_mask);
1139 }
1140
1141 void ldlm_pools_recalc(ldlm_side_t client)
1142 {
1143         __u32 nr_l = 0, nr_p = 0, l;
1144         struct ldlm_namespace *ns;
1145         int nr, equal = 0;
1146
1147         /*
1148          * No need to setup pool limit for client pools.
1149          */
1150         if (client == LDLM_NAMESPACE_SERVER) {
1151                 /*
1152                  * Check all modest namespaces first.
1153                  */
1154                 mutex_down(ldlm_namespace_lock(client));
1155                 list_for_each_entry(ns, ldlm_namespace_list(client),
1156                                     ns_list_chain)
1157                 {
1158                         if (ns->ns_appetite != LDLM_NAMESPACE_MODEST)
1159                                 continue;
1160
1161                         l = ldlm_pool_granted(&ns->ns_pool);
1162                         if (l == 0)
1163                                 l = 1;
1164
1165                         /*
1166                          * Set the modest pools limit equal to their avg granted
1167                          * locks + ~6%.
1168                          */
1169                         l += dru(l, LDLM_POOLS_MODEST_MARGIN_SHIFT, 0);
1170                         ldlm_pool_setup(&ns->ns_pool, l);
1171                         nr_l += l;
1172                         nr_p++;
1173                 }
1174
1175                 /*
1176                  * Make sure that modest namespaces did not eat more that 2/3
1177                  * of limit.
1178                  */
1179                 if (nr_l >= 2 * (LDLM_POOL_HOST_L / 3)) {
1180                         CWARN("\"Modest\" pools eat out 2/3 of server locks "
1181                               "limit (%d of %lu). This means that you have too "
1182                               "many clients for this amount of server RAM. "
1183                               "Upgrade server!\n", nr_l, LDLM_POOL_HOST_L);
1184                         equal = 1;
1185                 }
1186
1187                 /*
1188                  * The rest is given to greedy namespaces.
1189                  */
1190                 list_for_each_entry(ns, ldlm_namespace_list(client),
1191                                     ns_list_chain)
1192                 {
1193                         if (!equal && ns->ns_appetite != LDLM_NAMESPACE_GREEDY)
1194                                 continue;
1195
1196                         if (equal) {
1197                                 /*
1198                                  * In the case 2/3 locks are eaten out by
1199                                  * modest pools, we re-setup equal limit
1200                                  * for _all_ pools.
1201                                  */
1202                                 l = LDLM_POOL_HOST_L /
1203                                         atomic_read(ldlm_namespace_nr(client));
1204                         } else {
1205                                 /*
1206                                  * All the rest of greedy pools will have
1207                                  * all locks in equal parts.
1208                                  */
1209                                 l = (LDLM_POOL_HOST_L - nr_l) /
1210                                         (atomic_read(ldlm_namespace_nr(client)) -
1211                                          nr_p);
1212                         }
1213                         ldlm_pool_setup(&ns->ns_pool, l);
1214                 }
1215                 mutex_up(ldlm_namespace_lock(client));
1216         }
1217
1218         /*
1219          * Recalc at least ldlm_namespace_nr(client) namespaces.
1220          */
1221         for (nr = atomic_read(ldlm_namespace_nr(client)); nr > 0; nr--) {
1222                 /*
1223                  * Lock the list, get first @ns in the list, getref, move it
1224                  * to the tail, unlock and call pool recalc. This way we avoid
1225                  * calling recalc under @ns lock what is really good as we get
1226                  * rid of potential deadlock on client nodes when canceling
1227                  * locks synchronously.
1228                  */
1229                 mutex_down(ldlm_namespace_lock(client));
1230                 if (list_empty(ldlm_namespace_list(client))) {
1231                         mutex_up(ldlm_namespace_lock(client));
1232                         break;
1233                 }
1234                 ns = ldlm_namespace_first_locked(client);
1235                 ldlm_namespace_get(ns);
1236                 ldlm_namespace_move_locked(ns, client);
1237                 mutex_up(ldlm_namespace_lock(client));
1238
1239                 /*
1240                  * After setup is done - recalc the pool.
1241                  */
1242                 ldlm_pool_recalc(&ns->ns_pool);
1243                 ldlm_namespace_put(ns, 1);
1244         }
1245 }
1246 EXPORT_SYMBOL(ldlm_pools_recalc);
1247
1248 static int ldlm_pools_thread_main(void *arg)
1249 {
1250         struct ptlrpc_thread *thread = (struct ptlrpc_thread *)arg;
1251         char *t_name = "ldlm_poold";
1252         ENTRY;
1253
1254         cfs_daemonize(t_name);
1255         thread->t_flags = SVC_RUNNING;
1256         cfs_waitq_signal(&thread->t_ctl_waitq);
1257
1258         CDEBUG(D_DLMTRACE, "%s: pool thread starting, process %d\n",
1259                t_name, cfs_curproc_pid());
1260
1261         while (1) {
1262                 struct l_wait_info lwi;
1263
1264                 /*
1265                  * Recal all pools on this tick.
1266                  */
1267                 ldlm_pools_recalc(LDLM_NAMESPACE_SERVER);
1268                 ldlm_pools_recalc(LDLM_NAMESPACE_CLIENT);
1269
1270                 /*
1271                  * Wait until the next check time, or until we're
1272                  * stopped.
1273                  */
1274                 lwi = LWI_TIMEOUT(cfs_time_seconds(LDLM_POOLS_THREAD_PERIOD),
1275                                   NULL, NULL);
1276                 l_wait_event(thread->t_ctl_waitq, (thread->t_flags &
1277                                                    (SVC_STOPPING|SVC_EVENT)),
1278                              &lwi);
1279
1280                 if (thread->t_flags & SVC_STOPPING) {
1281                         thread->t_flags &= ~SVC_STOPPING;
1282                         break;
1283                 } else if (thread->t_flags & SVC_EVENT) {
1284                         thread->t_flags &= ~SVC_EVENT;
1285                 }
1286         }
1287
1288         thread->t_flags = SVC_STOPPED;
1289         cfs_waitq_signal(&thread->t_ctl_waitq);
1290
1291         CDEBUG(D_DLMTRACE, "%s: pool thread exiting, process %d\n",
1292                t_name, cfs_curproc_pid());
1293
1294         complete_and_exit(&ldlm_pools_comp, 0);
1295 }
1296
1297 static int ldlm_pools_thread_start(void)
1298 {
1299         struct l_wait_info lwi = { 0 };
1300         int rc;
1301         ENTRY;
1302
1303         if (ldlm_pools_thread != NULL)
1304                 RETURN(-EALREADY);
1305
1306         OBD_ALLOC_PTR(ldlm_pools_thread);
1307         if (ldlm_pools_thread == NULL)
1308                 RETURN(-ENOMEM);
1309
1310         init_completion(&ldlm_pools_comp);
1311         cfs_waitq_init(&ldlm_pools_thread->t_ctl_waitq);
1312
1313         /*
1314          * CLONE_VM and CLONE_FILES just avoid a needless copy, because we
1315          * just drop the VM and FILES in cfs_daemonize() right away.
1316          */
1317         rc = cfs_kernel_thread(ldlm_pools_thread_main, ldlm_pools_thread,
1318                                CLONE_VM | CLONE_FILES);
1319         if (rc < 0) {
1320                 CERROR("Can't start pool thread, error %d\n",
1321                        rc);
1322                 OBD_FREE(ldlm_pools_thread, sizeof(*ldlm_pools_thread));
1323                 ldlm_pools_thread = NULL;
1324                 RETURN(rc);
1325         }
1326         l_wait_event(ldlm_pools_thread->t_ctl_waitq,
1327                      (ldlm_pools_thread->t_flags & SVC_RUNNING), &lwi);
1328         RETURN(0);
1329 }
1330
1331 static void ldlm_pools_thread_stop(void)
1332 {
1333         ENTRY;
1334
1335         if (ldlm_pools_thread == NULL) {
1336                 EXIT;
1337                 return;
1338         }
1339
1340         ldlm_pools_thread->t_flags = SVC_STOPPING;
1341         cfs_waitq_signal(&ldlm_pools_thread->t_ctl_waitq);
1342
1343         /*
1344          * Make sure that pools thread is finished before freeing @thread.
1345          * This fixes possible race and oops due to accessing freed memory
1346          * in pools thread.
1347          */
1348         wait_for_completion(&ldlm_pools_comp);
1349         OBD_FREE_PTR(ldlm_pools_thread);
1350         ldlm_pools_thread = NULL;
1351         EXIT;
1352 }
1353
1354 int ldlm_pools_init(void)
1355 {
1356         int rc;
1357         ENTRY;
1358
1359         rc = ldlm_pools_thread_start();
1360         if (rc == 0) {
1361                 ldlm_pools_srv_shrinker = set_shrinker(DEFAULT_SEEKS,
1362                                                        ldlm_pools_srv_shrink);
1363                 ldlm_pools_cli_shrinker = set_shrinker(DEFAULT_SEEKS,
1364                                                        ldlm_pools_cli_shrink);
1365         }
1366         RETURN(rc);
1367 }
1368 EXPORT_SYMBOL(ldlm_pools_init);
1369
1370 void ldlm_pools_fini(void)
1371 {
1372         if (ldlm_pools_srv_shrinker != NULL) {
1373                 remove_shrinker(ldlm_pools_srv_shrinker);
1374                 ldlm_pools_srv_shrinker = NULL;
1375         }
1376         if (ldlm_pools_cli_shrinker != NULL) {
1377                 remove_shrinker(ldlm_pools_cli_shrinker);
1378                 ldlm_pools_cli_shrinker = NULL;
1379         }
1380         ldlm_pools_thread_stop();
1381 }
1382 EXPORT_SYMBOL(ldlm_pools_fini);
1383 #endif /* __KERNEL__ */
1384
1385 #else /* !HAVE_LRU_RESIZE_SUPPORT */
1386 int ldlm_pool_setup(struct ldlm_pool *pl, int limit)
1387 {
1388         return 0;
1389 }
1390 EXPORT_SYMBOL(ldlm_pool_setup);
1391
1392 int ldlm_pool_recalc(struct ldlm_pool *pl)
1393 {
1394         return 0;
1395 }
1396 EXPORT_SYMBOL(ldlm_pool_recalc);
1397
1398 int ldlm_pool_shrink(struct ldlm_pool *pl,
1399                      int nr, unsigned int gfp_mask)
1400 {
1401         return 0;
1402 }
1403 EXPORT_SYMBOL(ldlm_pool_shrink);
1404
1405 int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns,
1406                    int idx, ldlm_side_t client)
1407 {
1408         return 0;
1409 }
1410 EXPORT_SYMBOL(ldlm_pool_init);
1411
1412 void ldlm_pool_fini(struct ldlm_pool *pl)
1413 {
1414         return;
1415 }
1416 EXPORT_SYMBOL(ldlm_pool_fini);
1417
1418 void ldlm_pool_add(struct ldlm_pool *pl, struct ldlm_lock *lock)
1419 {
1420         return;
1421 }
1422 EXPORT_SYMBOL(ldlm_pool_add);
1423
1424 void ldlm_pool_del(struct ldlm_pool *pl, struct ldlm_lock *lock)
1425 {
1426         return;
1427 }
1428 EXPORT_SYMBOL(ldlm_pool_del);
1429
1430 __u64 ldlm_pool_get_slv(struct ldlm_pool *pl)
1431 {
1432         return 1;
1433 }
1434 EXPORT_SYMBOL(ldlm_pool_get_slv);
1435
1436 void ldlm_pool_set_slv(struct ldlm_pool *pl, __u64 slv)
1437 {
1438         return;
1439 }
1440 EXPORT_SYMBOL(ldlm_pool_set_slv);
1441
1442 __u64 ldlm_pool_get_clv(struct ldlm_pool *pl)
1443 {
1444         return 1;
1445 }
1446 EXPORT_SYMBOL(ldlm_pool_get_clv);
1447
1448 void ldlm_pool_set_clv(struct ldlm_pool *pl, __u64 clv)
1449 {
1450         return;
1451 }
1452 EXPORT_SYMBOL(ldlm_pool_set_clv);
1453
1454 __u32 ldlm_pool_get_limit(struct ldlm_pool *pl)
1455 {
1456         return 0;
1457 }
1458 EXPORT_SYMBOL(ldlm_pool_get_limit);
1459
1460 void ldlm_pool_set_limit(struct ldlm_pool *pl, __u32 limit)
1461 {
1462         return;
1463 }
1464 EXPORT_SYMBOL(ldlm_pool_set_limit);
1465
1466 __u32 ldlm_pool_get_lvf(struct ldlm_pool *pl)
1467 {
1468         return 0;
1469 }
1470 EXPORT_SYMBOL(ldlm_pool_get_lvf);
1471
1472 int ldlm_pools_init(void)
1473 {
1474         return 0;
1475 }
1476 EXPORT_SYMBOL(ldlm_pools_init);
1477
1478 void ldlm_pools_fini(void)
1479 {
1480         return;
1481 }
1482 EXPORT_SYMBOL(ldlm_pools_fini);
1483
1484 void ldlm_pools_recalc(ldlm_side_t client)
1485 {
1486         return;
1487 }
1488 EXPORT_SYMBOL(ldlm_pools_recalc);
1489 #endif /* HAVE_LRU_RESIZE_SUPPORT */