rtuDataOperationAnalysis.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * Functions related to sysfs handling
  3. */
  4. #include <linux/kernel.h>
  5. #include <linux/slab.h>
  6. #include <linux/module.h>
  7. #include <linux/bio.h>
  8. #include <linux/blkdev.h>
  9. #include <linux/blktrace_api.h>
  10. #include "blk.h"
  11. #include "blk-cgroup.h"
  12. struct queue_sysfs_entry {
  13. struct attribute attr;
  14. ssize_t (*show)(struct request_queue *, char *);
  15. ssize_t (*store)(struct request_queue *, const char *, size_t);
  16. };
  17. static ssize_t
  18. queue_var_show(unsigned long var, char *page)
  19. {
  20. return sprintf(page, "%lu\n", var);
  21. }
  22. static ssize_t
  23. queue_var_store(unsigned long *var, const char *page, size_t count)
  24. {
  25. int err;
  26. unsigned long v;
  27. err = strict_strtoul(page, 10, &v);
  28. if (err || v > UINT_MAX)
  29. return -EINVAL;
  30. *var = v;
  31. return count;
  32. }
  33. static ssize_t queue_requests_show(struct request_queue *q, char *page)
  34. {
  35. return queue_var_show(q->nr_requests, (page));
  36. }
  37. static ssize_t
  38. queue_requests_store(struct request_queue *q, const char *page, size_t count)
  39. {
  40. struct request_list *rl;
  41. unsigned long nr;
  42. int ret;
  43. if (!q->request_fn)
  44. return -EINVAL;
  45. ret = queue_var_store(&nr, page, count);
  46. if (ret < 0)
  47. return ret;
  48. if (nr < BLKDEV_MIN_RQ)
  49. nr = BLKDEV_MIN_RQ;
  50. spin_lock_irq(q->queue_lock);
  51. q->nr_requests = nr;
  52. blk_queue_congestion_threshold(q);
  53. /* congestion isn't cgroup aware and follows root blkcg for now */
  54. rl = &q->root_rl;
  55. if (rl->count[BLK_RW_SYNC] >= queue_congestion_on_threshold(q))
  56. blk_set_queue_congested(q, BLK_RW_SYNC);
  57. else if (rl->count[BLK_RW_SYNC] < queue_congestion_off_threshold(q))
  58. blk_clear_queue_congested(q, BLK_RW_SYNC);