backing-dev.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <linux/wait.h>
  2. #include <linux/backing-dev.h>
  3. #include <linux/fs.h>
  4. #include <linux/sched.h>
  5. #include <linux/module.h>
  6. int bdi_init(struct backing_dev_info *bdi)
  7. {
  8. int i, j;
  9. int err;
  10. for (i = 0; i < NR_BDI_STAT_ITEMS; i++) {
  11. err = percpu_counter_init_irq(&bdi->bdi_stat[i], 0);
  12. if (err) {
  13. for (j = 0; j < i; j++)
  14. percpu_counter_destroy(&bdi->bdi_stat[i]);
  15. break;
  16. }
  17. }
  18. return err;
  19. }
  20. EXPORT_SYMBOL(bdi_init);
  21. void bdi_destroy(struct backing_dev_info *bdi)
  22. {
  23. int i;
  24. for (i = 0; i < NR_BDI_STAT_ITEMS; i++)
  25. percpu_counter_destroy(&bdi->bdi_stat[i]);
  26. }
  27. EXPORT_SYMBOL(bdi_destroy);
  28. static wait_queue_head_t congestion_wqh[2] = {
  29. __WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),
  30. __WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])
  31. };
  32. void clear_bdi_congested(struct backing_dev_info *bdi, int rw)
  33. {
  34. enum bdi_state bit;
  35. wait_queue_head_t *wqh = &congestion_wqh[rw];
  36. bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
  37. clear_bit(bit, &bdi->state);
  38. smp_mb__after_clear_bit();
  39. if (waitqueue_active(wqh))
  40. wake_up(wqh);
  41. }
  42. EXPORT_SYMBOL(clear_bdi_congested);
  43. void set_bdi_congested(struct backing_dev_info *bdi, int rw)
  44. {
  45. enum bdi_state bit;
  46. bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
  47. set_bit(bit, &bdi->state);
  48. }
  49. EXPORT_SYMBOL(set_bdi_congested);
  50. /**
  51. * congestion_wait - wait for a backing_dev to become uncongested
  52. * @rw: READ or WRITE
  53. * @timeout: timeout in jiffies
  54. *
  55. * Waits for up to @timeout jiffies for a backing_dev (any backing_dev) to exit
  56. * write congestion. If no backing_devs are congested then just wait for the
  57. * next write to be completed.
  58. */
  59. long congestion_wait(int rw, long timeout)
  60. {
  61. long ret;
  62. DEFINE_WAIT(wait);
  63. wait_queue_head_t *wqh = &congestion_wqh[rw];
  64. prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
  65. ret = io_schedule_timeout(timeout);
  66. finish_wait(wqh, &wait);
  67. return ret;
  68. }
  69. EXPORT_SYMBOL(congestion_wait);