[XFS] Allocate the struct xfs_ail
[safe/jmp/linux-2.6] / fs / xfs / xfs_trans_ail.c
1 /*
2  * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_types.h"
21 #include "xfs_log.h"
22 #include "xfs_inum.h"
23 #include "xfs_trans.h"
24 #include "xfs_sb.h"
25 #include "xfs_ag.h"
26 #include "xfs_dmapi.h"
27 #include "xfs_mount.h"
28 #include "xfs_trans_priv.h"
29 #include "xfs_error.h"
30
31 STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *);
32 STATIC xfs_log_item_t * xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *);
33 STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *);
34 STATIC xfs_log_item_t * xfs_ail_next(struct xfs_ail *, xfs_log_item_t *);
35
36 #ifdef DEBUG
37 STATIC void xfs_ail_check(struct xfs_ail *, xfs_log_item_t *);
38 #else
39 #define xfs_ail_check(a,l)
40 #endif /* DEBUG */
41
42
43 /*
44  * This is called by the log manager code to determine the LSN
45  * of the tail of the log.  This is exactly the LSN of the first
46  * item in the AIL.  If the AIL is empty, then this function
47  * returns 0.
48  *
49  * We need the AIL lock in order to get a coherent read of the
50  * lsn of the last item in the AIL.
51  */
52 xfs_lsn_t
53 xfs_trans_tail_ail(
54         xfs_mount_t     *mp)
55 {
56         xfs_lsn_t       lsn;
57         xfs_log_item_t  *lip;
58
59         spin_lock(&mp->m_ail_lock);
60         lip = xfs_ail_min(mp->m_ail);
61         if (lip == NULL) {
62                 lsn = (xfs_lsn_t)0;
63         } else {
64                 lsn = lip->li_lsn;
65         }
66         spin_unlock(&mp->m_ail_lock);
67
68         return lsn;
69 }
70
71 /*
72  * xfs_trans_push_ail
73  *
74  * This routine is called to move the tail of the AIL forward.  It does this by
75  * trying to flush items in the AIL whose lsns are below the given
76  * threshold_lsn.
77  *
78  * the push is run asynchronously in a separate thread, so we return the tail
79  * of the log right now instead of the tail after the push. This means we will
80  * either continue right away, or we will sleep waiting on the async thread to
81  * do it's work.
82  *
83  * We do this unlocked - we only need to know whether there is anything in the
84  * AIL at the time we are called. We don't need to access the contents of
85  * any of the objects, so the lock is not needed.
86  */
87 void
88 xfs_trans_push_ail(
89         xfs_mount_t             *mp,
90         xfs_lsn_t               threshold_lsn)
91 {
92         xfs_log_item_t          *lip;
93
94         lip = xfs_ail_min(mp->m_ail);
95         if (lip && !XFS_FORCED_SHUTDOWN(mp)) {
96                 if (XFS_LSN_CMP(threshold_lsn, mp->m_ail->xa_target) > 0)
97                         xfsaild_wakeup(mp->m_ail, threshold_lsn);
98         }
99 }
100
101 /*
102  * Return the item in the AIL with the current lsn.
103  * Return the current tree generation number for use
104  * in calls to xfs_trans_next_ail().
105  */
106 STATIC xfs_log_item_t *
107 xfs_trans_first_push_ail(
108         xfs_mount_t     *mp,
109         int             *gen,
110         xfs_lsn_t       lsn)
111 {
112         xfs_log_item_t  *lip;
113
114         lip = xfs_ail_min(mp->m_ail);
115         *gen = (int)mp->m_ail->xa_gen;
116         if (lsn == 0)
117                 return lip;
118
119         list_for_each_entry(lip, &mp->m_ail->xa_ail, li_ail) {
120                 if (XFS_LSN_CMP(lip->li_lsn, lsn) >= 0)
121                         return lip;
122         }
123
124         return NULL;
125 }
126
127 /*
128  * Function that does the work of pushing on the AIL
129  */
130 long
131 xfsaild_push(
132         struct xfs_ail  *ailp,
133         xfs_lsn_t       *last_lsn)
134 {
135         long            tout = 1000; /* milliseconds */
136         xfs_lsn_t       last_pushed_lsn = *last_lsn;
137         xfs_lsn_t       target =  ailp->xa_target;
138         xfs_lsn_t       lsn;
139         xfs_log_item_t  *lip;
140         int             gen;
141         int             restarts;
142         int             flush_log, count, stuck;
143         xfs_mount_t     *mp = ailp->xa_mount;
144
145 #define XFS_TRANS_PUSH_AIL_RESTARTS     10
146
147         spin_lock(&mp->m_ail_lock);
148         lip = xfs_trans_first_push_ail(mp, &gen, *last_lsn);
149         if (!lip || XFS_FORCED_SHUTDOWN(mp)) {
150                 /*
151                  * AIL is empty or our push has reached the end.
152                  */
153                 spin_unlock(&mp->m_ail_lock);
154                 last_pushed_lsn = 0;
155                 goto out;
156         }
157
158         XFS_STATS_INC(xs_push_ail);
159
160         /*
161          * While the item we are looking at is below the given threshold
162          * try to flush it out. We'd like not to stop until we've at least
163          * tried to push on everything in the AIL with an LSN less than
164          * the given threshold.
165          *
166          * However, we will stop after a certain number of pushes and wait
167          * for a reduced timeout to fire before pushing further. This
168          * prevents use from spinning when we can't do anything or there is
169          * lots of contention on the AIL lists.
170          */
171         tout = 10;
172         lsn = lip->li_lsn;
173         flush_log = stuck = count = restarts = 0;
174         while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) {
175                 int     lock_result;
176                 /*
177                  * If we can lock the item without sleeping, unlock the AIL
178                  * lock and flush the item.  Then re-grab the AIL lock so we
179                  * can look for the next item on the AIL. List changes are
180                  * handled by the AIL lookup functions internally
181                  *
182                  * If we can't lock the item, either its holder will flush it
183                  * or it is already being flushed or it is being relogged.  In
184                  * any of these case it is being taken care of and we can just
185                  * skip to the next item in the list.
186                  */
187                 lock_result = IOP_TRYLOCK(lip);
188                 spin_unlock(&mp->m_ail_lock);
189                 switch (lock_result) {
190                 case XFS_ITEM_SUCCESS:
191                         XFS_STATS_INC(xs_push_ail_success);
192                         IOP_PUSH(lip);
193                         last_pushed_lsn = lsn;
194                         break;
195
196                 case XFS_ITEM_PUSHBUF:
197                         XFS_STATS_INC(xs_push_ail_pushbuf);
198                         IOP_PUSHBUF(lip);
199                         last_pushed_lsn = lsn;
200                         break;
201
202                 case XFS_ITEM_PINNED:
203                         XFS_STATS_INC(xs_push_ail_pinned);
204                         stuck++;
205                         flush_log = 1;
206                         break;
207
208                 case XFS_ITEM_LOCKED:
209                         XFS_STATS_INC(xs_push_ail_locked);
210                         last_pushed_lsn = lsn;
211                         stuck++;
212                         break;
213
214                 case XFS_ITEM_FLUSHING:
215                         XFS_STATS_INC(xs_push_ail_flushing);
216                         last_pushed_lsn = lsn;
217                         stuck++;
218                         break;
219
220                 default:
221                         ASSERT(0);
222                         break;
223                 }
224
225                 spin_lock(&mp->m_ail_lock);
226                 /* should we bother continuing? */
227                 if (XFS_FORCED_SHUTDOWN(mp))
228                         break;
229                 ASSERT(mp->m_log);
230
231                 count++;
232
233                 /*
234                  * Are there too many items we can't do anything with?
235                  * If we we are skipping too many items because we can't flush
236                  * them or they are already being flushed, we back off and
237                  * given them time to complete whatever operation is being
238                  * done. i.e. remove pressure from the AIL while we can't make
239                  * progress so traversals don't slow down further inserts and
240                  * removals to/from the AIL.
241                  *
242                  * The value of 100 is an arbitrary magic number based on
243                  * observation.
244                  */
245                 if (stuck > 100)
246                         break;
247
248                 lip = xfs_trans_next_ail(mp, lip, &gen, &restarts);
249                 if (lip == NULL)
250                         break;
251                 if (restarts > XFS_TRANS_PUSH_AIL_RESTARTS)
252                         break;
253                 lsn = lip->li_lsn;
254         }
255         spin_unlock(&mp->m_ail_lock);
256
257         if (flush_log) {
258                 /*
259                  * If something we need to push out was pinned, then
260                  * push out the log so it will become unpinned and
261                  * move forward in the AIL.
262                  */
263                 XFS_STATS_INC(xs_push_ail_flush);
264                 xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
265         }
266
267         if (!count) {
268                 /* We're past our target or empty, so idle */
269                 tout = 1000;
270         } else if (XFS_LSN_CMP(lsn, target) >= 0) {
271                 /*
272                  * We reached the target so wait a bit longer for I/O to
273                  * complete and remove pushed items from the AIL before we
274                  * start the next scan from the start of the AIL.
275                  */
276                 tout += 20;
277                 last_pushed_lsn = 0;
278         } else if ((restarts > XFS_TRANS_PUSH_AIL_RESTARTS) ||
279                    ((stuck * 100) / count > 90)) {
280                 /*
281                  * Either there is a lot of contention on the AIL or we
282                  * are stuck due to operations in progress. "Stuck" in this
283                  * case is defined as >90% of the items we tried to push
284                  * were stuck.
285                  *
286                  * Backoff a bit more to allow some I/O to complete before
287                  * continuing from where we were.
288                  */
289                 tout += 10;
290         }
291 out:
292         *last_lsn = last_pushed_lsn;
293         return tout;
294 }       /* xfsaild_push */
295
296
297 /*
298  * This is to be called when an item is unlocked that may have
299  * been in the AIL.  It will wake up the first member of the AIL
300  * wait list if this item's unlocking might allow it to progress.
301  * If the item is in the AIL, then we need to get the AIL lock
302  * while doing our checking so we don't race with someone going
303  * to sleep waiting for this event in xfs_trans_push_ail().
304  */
305 void
306 xfs_trans_unlocked_item(
307         xfs_mount_t     *mp,
308         xfs_log_item_t  *lip)
309 {
310         xfs_log_item_t  *min_lip;
311
312         /*
313          * If we're forcibly shutting down, we may have
314          * unlocked log items arbitrarily. The last thing
315          * we want to do is to move the tail of the log
316          * over some potentially valid data.
317          */
318         if (!(lip->li_flags & XFS_LI_IN_AIL) ||
319             XFS_FORCED_SHUTDOWN(mp)) {
320                 return;
321         }
322
323         /*
324          * This is the one case where we can call into xfs_ail_min()
325          * without holding the AIL lock because we only care about the
326          * case where we are at the tail of the AIL.  If the object isn't
327          * at the tail, it doesn't matter what result we get back.  This
328          * is slightly racy because since we were just unlocked, we could
329          * go to sleep between the call to xfs_ail_min and the call to
330          * xfs_log_move_tail, have someone else lock us, commit to us disk,
331          * move us out of the tail of the AIL, and then we wake up.  However,
332          * the call to xfs_log_move_tail() doesn't do anything if there's
333          * not enough free space to wake people up so we're safe calling it.
334          */
335         min_lip = xfs_ail_min(mp->m_ail);
336
337         if (min_lip == lip)
338                 xfs_log_move_tail(mp, 1);
339 }       /* xfs_trans_unlocked_item */
340
341
342 /*
343  * Update the position of the item in the AIL with the new
344  * lsn.  If it is not yet in the AIL, add it.  Otherwise, move
345  * it to its new position by removing it and re-adding it.
346  *
347  * Wakeup anyone with an lsn less than the item's lsn.  If the item
348  * we move in the AIL is the minimum one, update the tail lsn in the
349  * log manager.
350  *
351  * Increment the AIL's generation count to indicate that the tree
352  * has changed.
353  *
354  * This function must be called with the AIL lock held.  The lock
355  * is dropped before returning.
356  */
357 void
358 xfs_trans_update_ail(
359         xfs_mount_t     *mp,
360         xfs_log_item_t  *lip,
361         xfs_lsn_t       lsn) __releases(mp->m_ail_lock)
362 {
363         xfs_log_item_t          *dlip=NULL;
364         xfs_log_item_t          *mlip;  /* ptr to minimum lip */
365
366         mlip = xfs_ail_min(mp->m_ail);
367
368         if (lip->li_flags & XFS_LI_IN_AIL) {
369                 dlip = xfs_ail_delete(mp->m_ail, lip);
370                 ASSERT(dlip == lip);
371         } else {
372                 lip->li_flags |= XFS_LI_IN_AIL;
373         }
374
375         lip->li_lsn = lsn;
376
377         xfs_ail_insert(mp->m_ail, lip);
378         mp->m_ail->xa_gen++;
379
380         if (mlip == dlip) {
381                 mlip = xfs_ail_min(mp->m_ail);
382                 spin_unlock(&mp->m_ail_lock);
383                 xfs_log_move_tail(mp, mlip->li_lsn);
384         } else {
385                 spin_unlock(&mp->m_ail_lock);
386         }
387
388
389 }       /* xfs_trans_update_ail */
390
391 /*
392  * Delete the given item from the AIL.  It must already be in
393  * the AIL.
394  *
395  * Wakeup anyone with an lsn less than item's lsn.    If the item
396  * we delete in the AIL is the minimum one, update the tail lsn in the
397  * log manager.
398  *
399  * Clear the IN_AIL flag from the item, reset its lsn to 0, and
400  * bump the AIL's generation count to indicate that the tree
401  * has changed.
402  *
403  * This function must be called with the AIL lock held.  The lock
404  * is dropped before returning.
405  */
406 void
407 xfs_trans_delete_ail(
408         xfs_mount_t     *mp,
409         xfs_log_item_t  *lip) __releases(mp->m_ail_lock)
410 {
411         xfs_log_item_t          *dlip;
412         xfs_log_item_t          *mlip;
413
414         if (lip->li_flags & XFS_LI_IN_AIL) {
415                 mlip = xfs_ail_min(mp->m_ail);
416                 dlip = xfs_ail_delete(mp->m_ail, lip);
417                 ASSERT(dlip == lip);
418
419
420                 lip->li_flags &= ~XFS_LI_IN_AIL;
421                 lip->li_lsn = 0;
422                 mp->m_ail->xa_gen++;
423
424                 if (mlip == dlip) {
425                         mlip = xfs_ail_min(mp->m_ail);
426                         spin_unlock(&mp->m_ail_lock);
427                         xfs_log_move_tail(mp, (mlip ? mlip->li_lsn : 0));
428                 } else {
429                         spin_unlock(&mp->m_ail_lock);
430                 }
431         }
432         else {
433                 /*
434                  * If the file system is not being shutdown, we are in
435                  * serious trouble if we get to this stage.
436                  */
437                 if (XFS_FORCED_SHUTDOWN(mp))
438                         spin_unlock(&mp->m_ail_lock);
439                 else {
440                         xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp,
441                 "%s: attempting to delete a log item that is not in the AIL",
442                                         __func__);
443                         spin_unlock(&mp->m_ail_lock);
444                         xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
445                 }
446         }
447 }
448
449
450
451 /*
452  * Return the item in the AIL with the smallest lsn.
453  * Return the current tree generation number for use
454  * in calls to xfs_trans_next_ail().
455  */
456 xfs_log_item_t *
457 xfs_trans_first_ail(
458         xfs_mount_t     *mp,
459         int             *gen)
460 {
461         xfs_log_item_t  *lip;
462
463         lip = xfs_ail_min(mp->m_ail);
464         *gen = (int)mp->m_ail->xa_gen;
465
466         return lip;
467 }
468
469 /*
470  * If the generation count of the tree has not changed since the
471  * caller last took something from the AIL, then return the elmt
472  * in the tree which follows the one given.  If the count has changed,
473  * then return the minimum elmt of the AIL and bump the restarts counter
474  * if one is given.
475  */
476 xfs_log_item_t *
477 xfs_trans_next_ail(
478         xfs_mount_t     *mp,
479         xfs_log_item_t  *lip,
480         int             *gen,
481         int             *restarts)
482 {
483         xfs_log_item_t  *nlip;
484
485         ASSERT(mp && lip && gen);
486         if (mp->m_ail->xa_gen == *gen) {
487                 nlip = xfs_ail_next(mp->m_ail, lip);
488         } else {
489                 nlip = xfs_ail_min(mp->m_ail);
490                 *gen = (int)mp->m_ail->xa_gen;
491                 if (restarts != NULL) {
492                         XFS_STATS_INC(xs_push_ail_restarts);
493                         (*restarts)++;
494                 }
495         }
496
497         return (nlip);
498 }
499
500
501 /*
502  * The active item list (AIL) is a doubly linked list of log
503  * items sorted by ascending lsn.  The base of the list is
504  * a forw/back pointer pair embedded in the xfs mount structure.
505  * The base is initialized with both pointers pointing to the
506  * base.  This case always needs to be distinguished, because
507  * the base has no lsn to look at.  We almost always insert
508  * at the end of the list, so on inserts we search from the
509  * end of the list to find where the new item belongs.
510  */
511
512 /*
513  * Initialize the doubly linked list to point only to itself.
514  */
515 int
516 xfs_trans_ail_init(
517         xfs_mount_t     *mp)
518 {
519         struct xfs_ail  *ailp;
520
521         ailp = kmem_zalloc(sizeof(struct xfs_ail), KM_MAYFAIL);
522         if (!ailp)
523                 return ENOMEM;
524
525         ailp->xa_mount = mp;
526         INIT_LIST_HEAD(&ailp->xa_ail);
527         return xfsaild_start(ailp);
528 }
529
530 void
531 xfs_trans_ail_destroy(
532         xfs_mount_t     *mp)
533 {
534         struct xfs_ail  *ailp = mp->m_ail;
535
536         xfsaild_stop(ailp);
537         kmem_free(ailp);
538 }
539
540 /*
541  * Insert the given log item into the AIL.
542  * We almost always insert at the end of the list, so on inserts
543  * we search from the end of the list to find where the
544  * new item belongs.
545  */
546 STATIC void
547 xfs_ail_insert(
548         struct xfs_ail  *ailp,
549         xfs_log_item_t  *lip)
550 /* ARGSUSED */
551 {
552         xfs_log_item_t  *next_lip;
553
554         /*
555          * If the list is empty, just insert the item.
556          */
557         if (list_empty(&ailp->xa_ail)) {
558                 list_add(&lip->li_ail, &ailp->xa_ail);
559                 return;
560         }
561
562         list_for_each_entry_reverse(next_lip, &ailp->xa_ail, li_ail) {
563                 if (XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0)
564                         break;
565         }
566
567         ASSERT((&next_lip->li_ail == &ailp->xa_ail) ||
568                (XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0));
569
570         list_add(&lip->li_ail, &next_lip->li_ail);
571
572         xfs_ail_check(ailp, lip);
573         return;
574 }
575
576 /*
577  * Delete the given item from the AIL.  Return a pointer to the item.
578  */
579 /*ARGSUSED*/
580 STATIC xfs_log_item_t *
581 xfs_ail_delete(
582         struct xfs_ail  *ailp,
583         xfs_log_item_t  *lip)
584 /* ARGSUSED */
585 {
586         xfs_ail_check(ailp, lip);
587
588         list_del(&lip->li_ail);
589
590         return lip;
591 }
592
593 /*
594  * Return a pointer to the first item in the AIL.
595  * If the AIL is empty, then return NULL.
596  */
597 STATIC xfs_log_item_t *
598 xfs_ail_min(
599         struct xfs_ail  *ailp)
600 /* ARGSUSED */
601 {
602         if (list_empty(&ailp->xa_ail))
603                 return NULL;
604
605         return list_first_entry(&ailp->xa_ail, xfs_log_item_t, li_ail);
606 }
607
608 /*
609  * Return a pointer to the item which follows
610  * the given item in the AIL.  If the given item
611  * is the last item in the list, then return NULL.
612  */
613 STATIC xfs_log_item_t *
614 xfs_ail_next(
615         struct xfs_ail  *ailp,
616         xfs_log_item_t  *lip)
617 /* ARGSUSED */
618 {
619         if (lip->li_ail.next == &ailp->xa_ail)
620                 return NULL;
621
622         return list_first_entry(&lip->li_ail, xfs_log_item_t, li_ail);
623 }
624
625 #ifdef DEBUG
626 /*
627  * Check that the list is sorted as it should be.
628  */
629 STATIC void
630 xfs_ail_check(
631         struct xfs_ail  *ailp,
632         xfs_log_item_t  *lip)
633 {
634         xfs_log_item_t  *prev_lip;
635
636         if (list_empty(&ailp->xa_ail))
637                 return;
638
639         /*
640          * Check the next and previous entries are valid.
641          */
642         ASSERT((lip->li_flags & XFS_LI_IN_AIL) != 0);
643         prev_lip = list_entry(lip->li_ail.prev, xfs_log_item_t, li_ail);
644         if (&prev_lip->li_ail != &ailp->xa_ail)
645                 ASSERT(XFS_LSN_CMP(prev_lip->li_lsn, lip->li_lsn) <= 0);
646
647         prev_lip = list_entry(lip->li_ail.next, xfs_log_item_t, li_ail);
648         if (&prev_lip->li_ail != &ailp->xa_ail)
649                 ASSERT(XFS_LSN_CMP(prev_lip->li_lsn, lip->li_lsn) >= 0);
650
651
652 #ifdef XFS_TRANS_DEBUG
653         /*
654          * Walk the list checking lsn ordering, and that every entry has the
655          * XFS_LI_IN_AIL flag set. This is really expensive, so only do it
656          * when specifically debugging the transaction subsystem.
657          */
658         prev_lip = list_entry(&ailp->xa_ail, xfs_log_item_t, li_ail);
659         list_for_each_entry(lip, &ailp->xa_ail, li_ail) {
660                 if (&prev_lip->li_ail != &ailp->xa_ail)
661                         ASSERT(XFS_LSN_CMP(prev_lip->li_lsn, lip->li_lsn) <= 0);
662                 ASSERT((lip->li_flags & XFS_LI_IN_AIL) != 0);
663                 prev_lip = lip;
664         }
665 #endif /* XFS_TRANS_DEBUG */
666 }
667 #endif /* DEBUG */