Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 
  2 #include <linux/wait.h>
  3 #include <linux/backing-dev.h>
  4 #include <linux/fs.h>
  5 #include <linux/sched.h>
  6 #include <linux/module.h>
  7 
  8 int bdi_init(struct backing_dev_info *bdi)
  9 {
 10         int i;
 11         int err;
 12 
 13         for (i = 0; i < NR_BDI_STAT_ITEMS; i++) {
 14                 err = percpu_counter_init_irq(&bdi->bdi_stat[i], 0);
 15                 if (err)
 16                         goto err;
 17         }
 18 
 19         bdi->dirty_exceeded = 0;
 20         err = prop_local_init_percpu(&bdi->completions);
 21 
 22         if (err) {
 23 err:
 24                 while (i--)
 25                         percpu_counter_destroy(&bdi->bdi_stat[i]);
 26         }
 27 
 28         return err;
 29 }
 30 EXPORT_SYMBOL(bdi_init);
 31 
 32 void bdi_destroy(struct backing_dev_info *bdi)
 33 {
 34         int i;
 35 
 36         for (i = 0; i < NR_BDI_STAT_ITEMS; i++)
 37                 percpu_counter_destroy(&bdi->bdi_stat[i]);
 38 
 39         prop_local_destroy_percpu(&bdi->completions);
 40 }
 41 EXPORT_SYMBOL(bdi_destroy);
 42 
 43 static wait_queue_head_t congestion_wqh[2] = {
 44                 __WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),
 45                 __WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])
 46         };
 47 
 48 
 49 void clear_bdi_congested(struct backing_dev_info *bdi, int rw)
 50 {
 51         enum bdi_state bit;
 52         wait_queue_head_t *wqh = &congestion_wqh[rw];
 53 
 54         bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
 55         clear_bit(bit, &bdi->state);
 56         smp_mb__after_clear_bit();
 57         if (waitqueue_active(wqh))
 58                 wake_up(wqh);
 59 }
 60 EXPORT_SYMBOL(clear_bdi_congested);
 61 
 62 void set_bdi_congested(struct backing_dev_info *bdi, int rw)
 63 {
 64         enum bdi_state bit;
 65 
 66         bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
 67         set_bit(bit, &bdi->state);
 68 }
 69 EXPORT_SYMBOL(set_bdi_congested);
 70 
 71 /**
 72  * congestion_wait - wait for a backing_dev to become uncongested
 73  * @rw: READ or WRITE
 74  * @timeout: timeout in jiffies
 75  *
 76  * Waits for up to @timeout jiffies for a backing_dev (any backing_dev) to exit
 77  * write congestion.  If no backing_devs are congested then just wait for the
 78  * next write to be completed.
 79  */
 80 long congestion_wait(int rw, long timeout)
 81 {
 82         long ret;
 83         DEFINE_WAIT(wait);
 84         wait_queue_head_t *wqh = &congestion_wqh[rw];
 85 
 86         prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
 87         ret = io_schedule_timeout(timeout);
 88         finish_wait(wqh, &wait);
 89         return ret;
 90 }
 91 EXPORT_SYMBOL(congestion_wait);
 92 
 93 
  This page was automatically generated by the LXR engine.