sched.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:28k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/net/sunrpc/sched.c
  3.  *
  4.  * Scheduling for synchronous and asynchronous RPC requests.
  5.  *
  6.  * Copyright (C) 1996 Olaf Kirch, <okir@monad.swb.de>
  7.  * 
  8.  * TCP NFS related read + write fixes
  9.  * (C) 1999 Dave Airlie, University of Limerick, Ireland <airlied@linux.ie>
  10.  */
  11. #include <linux/module.h>
  12. #define __KERNEL_SYSCALLS__
  13. #include <linux/sched.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/slab.h>
  16. #include <linux/unistd.h>
  17. #include <linux/smp.h>
  18. #include <linux/smp_lock.h>
  19. #include <linux/spinlock.h>
  20. #include <linux/sunrpc/clnt.h>
  21. #include <linux/sunrpc/xprt.h>
  22. #ifdef RPC_DEBUG
  23. #define RPCDBG_FACILITY RPCDBG_SCHED
  24. static int rpc_task_id;
  25. #endif
  26. /*
  27.  * We give RPC the same get_free_pages priority as NFS
  28.  */
  29. #define GFP_RPC GFP_NOFS
  30. static void __rpc_default_timer(struct rpc_task *task);
  31. static void rpciod_killall(void);
  32. /*
  33.  * When an asynchronous RPC task is activated within a bottom half
  34.  * handler, or while executing another RPC task, it is put on
  35.  * schedq, and rpciod is woken up.
  36.  */
  37. static struct rpc_wait_queue schedq = RPC_INIT_WAITQ("schedq");
  38. /*
  39.  * RPC tasks that create another task (e.g. for contacting the portmapper)
  40.  * will wait on this queue for their child's completion
  41.  */
  42. static struct rpc_wait_queue childq = RPC_INIT_WAITQ("childq");
  43. /*
  44.  * RPC tasks sit here while waiting for conditions to improve.
  45.  */
  46. static struct rpc_wait_queue delay_queue = RPC_INIT_WAITQ("delayq");
  47. /*
  48.  * All RPC tasks are linked into this list
  49.  */
  50. static struct rpc_task * all_tasks;
  51. /*
  52.  * rpciod-related stuff
  53.  */
  54. static DECLARE_WAIT_QUEUE_HEAD(rpciod_idle);
  55. static DECLARE_WAIT_QUEUE_HEAD(rpciod_killer);
  56. static DECLARE_MUTEX(rpciod_sema);
  57. static unsigned int rpciod_users;
  58. static pid_t rpciod_pid;
  59. static int rpc_inhibit;
  60. /*
  61.  * Spinlock for wait queues. Access to the latter also has to be
  62.  * interrupt-safe in order to allow timers to wake up sleeping tasks.
  63.  */
  64. spinlock_t rpc_queue_lock = SPIN_LOCK_UNLOCKED;
  65. /*
  66.  * Spinlock for other critical sections of code.
  67.  */
  68. static spinlock_t rpc_sched_lock = SPIN_LOCK_UNLOCKED;
  69. /*
  70.  * This is the last-ditch buffer for NFS swap requests
  71.  */
  72. static u32 swap_buffer[PAGE_SIZE >> 2];
  73. static long swap_buffer_used;
  74. /*
  75.  * Make allocation of the swap_buffer SMP-safe
  76.  */
  77. static __inline__ int rpc_lock_swapbuf(void)
  78. {
  79. return !test_and_set_bit(1, &swap_buffer_used);
  80. }
  81. static __inline__ void rpc_unlock_swapbuf(void)
  82. {
  83. clear_bit(1, &swap_buffer_used);
  84. }
  85. /*
  86.  * Disable the timer for a given RPC task. Should be called with
  87.  * rpc_queue_lock and bh_disabled in order to avoid races within
  88.  * rpc_run_timer().
  89.  */
  90. static inline void
  91. __rpc_disable_timer(struct rpc_task *task)
  92. {
  93. dprintk("RPC: %4d disabling timern", task->tk_pid);
  94. task->tk_timeout_fn = NULL;
  95. task->tk_timeout = 0;
  96. }
  97. /*
  98.  * Run a timeout function.
  99.  * We use the callback in order to allow __rpc_wake_up_task()
  100.  * and friends to disable the timer synchronously on SMP systems
  101.  * without calling del_timer_sync(). The latter could cause a
  102.  * deadlock if called while we're holding spinlocks...
  103.  */
  104. static void
  105. rpc_run_timer(struct rpc_task *task)
  106. {
  107. void (*callback)(struct rpc_task *);
  108. spin_lock_bh(&rpc_queue_lock);
  109. callback = task->tk_timeout_fn;
  110. task->tk_timeout_fn = NULL;
  111. spin_unlock_bh(&rpc_queue_lock);
  112. if (callback) {
  113. dprintk("RPC: %4d running timern", task->tk_pid);
  114. callback(task);
  115. }
  116. }
  117. /*
  118.  * Set up a timer for the current task.
  119.  */
  120. static inline void
  121. __rpc_add_timer(struct rpc_task *task, rpc_action timer)
  122. {
  123. if (!task->tk_timeout)
  124. return;
  125. dprintk("RPC: %4d setting alarm for %lu msn",
  126. task->tk_pid, task->tk_timeout * 1000 / HZ);
  127. if (timer)
  128. task->tk_timeout_fn = timer;
  129. else
  130. task->tk_timeout_fn = __rpc_default_timer;
  131. mod_timer(&task->tk_timer, jiffies + task->tk_timeout);
  132. }
  133. /*
  134.  * Set up a timer for an already sleeping task.
  135.  */
  136. void rpc_add_timer(struct rpc_task *task, rpc_action timer)
  137. {
  138. spin_lock_bh(&rpc_queue_lock);
  139. if (!(RPC_IS_RUNNING(task) || task->tk_wakeup))
  140. __rpc_add_timer(task, timer);
  141. spin_unlock_bh(&rpc_queue_lock);
  142. }
  143. /*
  144.  * Delete any timer for the current task. Because we use del_timer_sync(),
  145.  * this function should never be called while holding rpc_queue_lock.
  146.  */
  147. static inline void
  148. rpc_delete_timer(struct rpc_task *task)
  149. {
  150. if (timer_pending(&task->tk_timer)) {
  151. dprintk("RPC: %4d deleting timern", task->tk_pid);
  152. del_timer_sync(&task->tk_timer);
  153. }
  154. }
  155. /*
  156.  * Add new request to wait queue.
  157.  *
  158.  * Swapper tasks always get inserted at the head of the queue.
  159.  * This should avoid many nasty memory deadlocks and hopefully
  160.  * improve overall performance.
  161.  * Everyone else gets appended to the queue to ensure proper FIFO behavior.
  162.  */
  163. static inline int
  164. __rpc_add_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *task)
  165. {
  166. if (task->tk_rpcwait == queue)
  167. return 0;
  168. if (task->tk_rpcwait) {
  169. printk(KERN_WARNING "RPC: doubly enqueued task!n");
  170. return -EWOULDBLOCK;
  171. }
  172. if (RPC_IS_SWAPPER(task))
  173. rpc_insert_list(&queue->task, task);
  174. else
  175. rpc_append_list(&queue->task, task);
  176. task->tk_rpcwait = queue;
  177. dprintk("RPC: %4d added to queue %p "%s"n",
  178. task->tk_pid, queue, rpc_qname(queue));
  179. return 0;
  180. }
  181. int
  182. rpc_add_wait_queue(struct rpc_wait_queue *q, struct rpc_task *task)
  183. {
  184. int result;
  185. spin_lock_bh(&rpc_queue_lock);
  186. result = __rpc_add_wait_queue(q, task);
  187. spin_unlock_bh(&rpc_queue_lock);
  188. return result;
  189. }
  190. /*
  191.  * Remove request from queue.
  192.  * Note: must be called with spin lock held.
  193.  */
  194. static inline void
  195. __rpc_remove_wait_queue(struct rpc_task *task)
  196. {
  197. struct rpc_wait_queue *queue = task->tk_rpcwait;
  198. if (!queue)
  199. return;
  200. rpc_remove_list(&queue->task, task);
  201. task->tk_rpcwait = NULL;
  202. dprintk("RPC: %4d removed from queue %p "%s"n",
  203. task->tk_pid, queue, rpc_qname(queue));
  204. }
  205. void
  206. rpc_remove_wait_queue(struct rpc_task *task)
  207. {
  208. if (!task->tk_rpcwait)
  209. return;
  210. spin_lock_bh(&rpc_queue_lock);
  211. __rpc_remove_wait_queue(task);
  212. spin_unlock_bh(&rpc_queue_lock);
  213. }
  214. /*
  215.  * Make an RPC task runnable.
  216.  *
  217.  * Note: If the task is ASYNC, this must be called with 
  218.  * the spinlock held to protect the wait queue operation.
  219.  */
  220. static inline void
  221. rpc_make_runnable(struct rpc_task *task)
  222. {
  223. if (task->tk_timeout_fn) {
  224. printk(KERN_ERR "RPC: task w/ running timer in rpc_make_runnable!!n");
  225. return;
  226. }
  227. rpc_set_running(task);
  228. if (RPC_IS_ASYNC(task)) {
  229. if (RPC_IS_SLEEPING(task)) {
  230. int status;
  231. status = __rpc_add_wait_queue(&schedq, task);
  232. if (status < 0) {
  233. printk(KERN_WARNING "RPC: failed to add task to queue: error: %d!n", status);
  234. task->tk_status = status;
  235. return;
  236. }
  237. rpc_clear_sleeping(task);
  238. if (waitqueue_active(&rpciod_idle))
  239. wake_up(&rpciod_idle);
  240. }
  241. } else {
  242. rpc_clear_sleeping(task);
  243. if (waitqueue_active(&task->tk_wait))
  244. wake_up(&task->tk_wait);
  245. }
  246. }
  247. /*
  248.  * Place a newly initialized task on the schedq.
  249.  */
  250. static inline void
  251. rpc_schedule_run(struct rpc_task *task)
  252. {
  253. /* Don't run a child twice! */
  254. if (RPC_IS_ACTIVATED(task))
  255. return;
  256. task->tk_active = 1;
  257. rpc_set_sleeping(task);
  258. rpc_make_runnable(task);
  259. }
  260. /*
  261.  * For other people who may need to wake the I/O daemon
  262.  * but should (for now) know nothing about its innards
  263.  */
  264. void rpciod_wake_up(void)
  265. {
  266. if(rpciod_pid==0)
  267. printk(KERN_ERR "rpciod: wot no daemon?n");
  268. if (waitqueue_active(&rpciod_idle))
  269. wake_up(&rpciod_idle);
  270. }
  271. /*
  272.  * Prepare for sleeping on a wait queue.
  273.  * By always appending tasks to the list we ensure FIFO behavior.
  274.  * NB: An RPC task will only receive interrupt-driven events as long
  275.  * as it's on a wait queue.
  276.  */
  277. static void
  278. __rpc_sleep_on(struct rpc_wait_queue *q, struct rpc_task *task,
  279. rpc_action action, rpc_action timer)
  280. {
  281. int status;
  282. dprintk("RPC: %4d sleep_on(queue "%s" time %ld)n", task->tk_pid,
  283. rpc_qname(q), jiffies);
  284. if (!RPC_IS_ASYNC(task) && !RPC_IS_ACTIVATED(task)) {
  285. printk(KERN_ERR "RPC: Inactive synchronous task put to sleep!n");
  286. return;
  287. }
  288. /* Mark the task as being activated if so needed */
  289. if (!RPC_IS_ACTIVATED(task)) {
  290. task->tk_active = 1;
  291. rpc_set_sleeping(task);
  292. }
  293. status = __rpc_add_wait_queue(q, task);
  294. if (status) {
  295. printk(KERN_WARNING "RPC: failed to add task to queue: error: %d!n", status);
  296. task->tk_status = status;
  297. } else {
  298. rpc_clear_running(task);
  299. if (task->tk_callback) {
  300. dprintk(KERN_ERR "RPC: %4d overwrites an active callbackn", task->tk_pid);
  301. BUG();
  302. }
  303. task->tk_callback = action;
  304. __rpc_add_timer(task, timer);
  305. }
  306. }
  307. void
  308. rpc_sleep_on(struct rpc_wait_queue *q, struct rpc_task *task,
  309. rpc_action action, rpc_action timer)
  310. {
  311. /*
  312.  * Protect the queue operations.
  313.  */
  314. spin_lock_bh(&rpc_queue_lock);
  315. __rpc_sleep_on(q, task, action, timer);
  316. spin_unlock_bh(&rpc_queue_lock);
  317. }
  318. void
  319. rpc_sleep_locked(struct rpc_wait_queue *q, struct rpc_task *task,
  320.  rpc_action action, rpc_action timer)
  321. {
  322. /*
  323.  * Protect the queue operations.
  324.  */
  325. spin_lock_bh(&rpc_queue_lock);
  326. __rpc_sleep_on(q, task, action, timer);
  327. __rpc_lock_task(task);
  328. spin_unlock_bh(&rpc_queue_lock);
  329. }
  330. /**
  331.  * __rpc_wake_up_task - wake up a single rpc_task
  332.  * @task: task to be woken up
  333.  *
  334.  * If the task is locked, it is merely removed from the queue, and
  335.  * 'task->tk_wakeup' is set. rpc_unlock_task() will then ensure
  336.  * that it is woken up as soon as the lock count goes to zero.
  337.  *
  338.  * Caller must hold rpc_queue_lock
  339.  */
  340. static void
  341. __rpc_wake_up_task(struct rpc_task *task)
  342. {
  343. dprintk("RPC: %4d __rpc_wake_up_task (now %ld inh %d)n",
  344. task->tk_pid, jiffies, rpc_inhibit);
  345. #ifdef RPC_DEBUG
  346. if (task->tk_magic != 0xf00baa) {
  347. printk(KERN_ERR "RPC: attempt to wake up non-existing task!n");
  348. rpc_debug = ~0;
  349. rpc_show_tasks();
  350. return;
  351. }
  352. #endif
  353. /* Has the task been executed yet? If not, we cannot wake it up! */
  354. if (!RPC_IS_ACTIVATED(task)) {
  355. printk(KERN_ERR "RPC: Inactive task (%p) being woken up!n", task);
  356. return;
  357. }
  358. if (RPC_IS_RUNNING(task))
  359. return;
  360. __rpc_disable_timer(task);
  361. if (task->tk_rpcwait != &schedq)
  362. __rpc_remove_wait_queue(task);
  363. /* If the task has been locked, then set tk_wakeup so that
  364.  * rpc_unlock_task() wakes us up... */
  365. if (task->tk_lock) {
  366. task->tk_wakeup = 1;
  367. return;
  368. } else
  369. task->tk_wakeup = 0;
  370. rpc_make_runnable(task);
  371. dprintk("RPC:      __rpc_wake_up_task donen");
  372. }
  373. /*
  374.  * Default timeout handler if none specified by user
  375.  */
  376. static void
  377. __rpc_default_timer(struct rpc_task *task)
  378. {
  379. dprintk("RPC: %d timeout (default timer)n", task->tk_pid);
  380. task->tk_status = -ETIMEDOUT;
  381. rpc_wake_up_task(task);
  382. }
  383. /*
  384.  * Wake up the specified task
  385.  */
  386. void
  387. rpc_wake_up_task(struct rpc_task *task)
  388. {
  389. if (RPC_IS_RUNNING(task))
  390. return;
  391. spin_lock_bh(&rpc_queue_lock);
  392. __rpc_wake_up_task(task);
  393. spin_unlock_bh(&rpc_queue_lock);
  394. }
  395. /*
  396.  * Wake up the next task on the wait queue.
  397.  */
  398. struct rpc_task *
  399. rpc_wake_up_next(struct rpc_wait_queue *queue)
  400. {
  401. struct rpc_task *task;
  402. dprintk("RPC:      wake_up_next(%p "%s")n", queue, rpc_qname(queue));
  403. spin_lock_bh(&rpc_queue_lock);
  404. if ((task = queue->task) != 0)
  405. __rpc_wake_up_task(task);
  406. spin_unlock_bh(&rpc_queue_lock);
  407. return task;
  408. }
  409. /**
  410.  * rpc_wake_up - wake up all rpc_tasks
  411.  * @queue: rpc_wait_queue on which the tasks are sleeping
  412.  *
  413.  * Grabs rpc_queue_lock
  414.  */
  415. void
  416. rpc_wake_up(struct rpc_wait_queue *queue)
  417. {
  418. spin_lock_bh(&rpc_queue_lock);
  419. while (queue->task)
  420. __rpc_wake_up_task(queue->task);
  421. spin_unlock_bh(&rpc_queue_lock);
  422. }
  423. /**
  424.  * rpc_wake_up_status - wake up all rpc_tasks and set their status value.
  425.  * @queue: rpc_wait_queue on which the tasks are sleeping
  426.  * @status: status value to set
  427.  *
  428.  * Grabs rpc_queue_lock
  429.  */
  430. void
  431. rpc_wake_up_status(struct rpc_wait_queue *queue, int status)
  432. {
  433. struct rpc_task *task;
  434. spin_lock_bh(&rpc_queue_lock);
  435. while ((task = queue->task) != NULL) {
  436. task->tk_status = status;
  437. __rpc_wake_up_task(task);
  438. }
  439. spin_unlock_bh(&rpc_queue_lock);
  440. }
  441. /*
  442.  * Lock down a sleeping task to prevent it from waking up
  443.  * and disappearing from beneath us.
  444.  *
  445.  * This function should always be called with the
  446.  * rpc_queue_lock held.
  447.  */
  448. int
  449. __rpc_lock_task(struct rpc_task *task)
  450. {
  451. if (!RPC_IS_RUNNING(task))
  452. return ++task->tk_lock;
  453. return 0;
  454. }
  455. void
  456. rpc_unlock_task(struct rpc_task *task)
  457. {
  458. spin_lock_bh(&rpc_queue_lock);
  459. if (task->tk_lock && !--task->tk_lock && task->tk_wakeup)
  460. __rpc_wake_up_task(task);
  461. spin_unlock_bh(&rpc_queue_lock);
  462. }
  463. /*
  464.  * Run a task at a later time
  465.  */
  466. static void __rpc_atrun(struct rpc_task *);
  467. void
  468. rpc_delay(struct rpc_task *task, unsigned long delay)
  469. {
  470. task->tk_timeout = delay;
  471. rpc_sleep_on(&delay_queue, task, NULL, __rpc_atrun);
  472. }
  473. static void
  474. __rpc_atrun(struct rpc_task *task)
  475. {
  476. task->tk_status = 0;
  477. rpc_wake_up_task(task);
  478. }
  479. /*
  480.  * This is the RPC `scheduler' (or rather, the finite state machine).
  481.  */
  482. static int
  483. __rpc_execute(struct rpc_task *task)
  484. {
  485. int status = 0;
  486. dprintk("RPC: %4d rpc_execute flgs %xn",
  487. task->tk_pid, task->tk_flags);
  488. if (!RPC_IS_RUNNING(task)) {
  489. printk(KERN_WARNING "RPC: rpc_execute called for sleeping task!!n");
  490. return 0;
  491. }
  492.  restarted:
  493. while (1) {
  494. /*
  495.  * Execute any pending callback.
  496.  */
  497. if (RPC_DO_CALLBACK(task)) {
  498. /* Define a callback save pointer */
  499. void (*save_callback)(struct rpc_task *);
  500. /* 
  501.  * If a callback exists, save it, reset it,
  502.  * call it.
  503.  * The save is needed to stop from resetting
  504.  * another callback set within the callback handler
  505.  * - Dave
  506.  */
  507. save_callback=task->tk_callback;
  508. task->tk_callback=NULL;
  509. save_callback(task);
  510. }
  511. /*
  512.  * Perform the next FSM step.
  513.  * tk_action may be NULL when the task has been killed
  514.  * by someone else.
  515.  */
  516. if (RPC_IS_RUNNING(task)) {
  517. /*
  518.  * Garbage collection of pending timers...
  519.  */
  520. rpc_delete_timer(task);
  521. if (!task->tk_action)
  522. break;
  523. task->tk_action(task);
  524. }
  525. /*
  526.  * Check whether task is sleeping.
  527.  */
  528. spin_lock_bh(&rpc_queue_lock);
  529. if (!RPC_IS_RUNNING(task)) {
  530. rpc_set_sleeping(task);
  531. if (RPC_IS_ASYNC(task)) {
  532. spin_unlock_bh(&rpc_queue_lock);
  533. return 0;
  534. }
  535. }
  536. spin_unlock_bh(&rpc_queue_lock);
  537. while (RPC_IS_SLEEPING(task)) {
  538. /* sync task: sleep here */
  539. dprintk("RPC: %4d sync task going to sleepn",
  540. task->tk_pid);
  541. if (current->pid == rpciod_pid)
  542. printk(KERN_ERR "RPC: rpciod waiting on sync task!n");
  543. __wait_event(task->tk_wait, !RPC_IS_SLEEPING(task));
  544. dprintk("RPC: %4d sync task resumingn", task->tk_pid);
  545. /*
  546.  * When a sync task receives a signal, it exits with
  547.  * -ERESTARTSYS. In order to catch any callbacks that
  548.  * clean up after sleeping on some queue, we don't
  549.  * break the loop here, but go around once more.
  550.  */
  551. if (task->tk_client->cl_intr && signalled()) {
  552. dprintk("RPC: %4d got signaln", task->tk_pid);
  553. task->tk_flags |= RPC_TASK_KILLED;
  554. rpc_exit(task, -ERESTARTSYS);
  555. rpc_wake_up_task(task);
  556. }
  557. }
  558. }
  559. if (task->tk_exit) {
  560. task->tk_exit(task);
  561. /* If tk_action is non-null, the user wants us to restart */
  562. if (task->tk_action) {
  563. if (!RPC_ASSASSINATED(task)) {
  564. /* Release RPC slot and buffer memory */
  565. if (task->tk_rqstp)
  566. xprt_release(task);
  567. if (task->tk_buffer) {
  568. rpc_free(task->tk_buffer);
  569. task->tk_buffer = NULL;
  570. }
  571. goto restarted;
  572. }
  573. printk(KERN_ERR "RPC: dead task tries to walk away.n");
  574. }
  575. }
  576. dprintk("RPC: %4d exit() = %dn", task->tk_pid, task->tk_status);
  577. status = task->tk_status;
  578. /* Release all resources associated with the task */
  579. rpc_release_task(task);
  580. return status;
  581. }
  582. /*
  583.  * User-visible entry point to the scheduler.
  584.  *
  585.  * This may be called recursively if e.g. an async NFS task updates
  586.  * the attributes and finds that dirty pages must be flushed.
  587.  * NOTE: Upon exit of this function the task is guaranteed to be
  588.  *  released. In particular note that tk_release() will have
  589.  *  been called, so your task memory may have been freed.
  590.  */
  591. int
  592. rpc_execute(struct rpc_task *task)
  593. {
  594. int status = -EIO;
  595. if (rpc_inhibit) {
  596. printk(KERN_INFO "RPC: execution inhibited!n");
  597. goto out_release;
  598. }
  599. status = -EWOULDBLOCK;
  600. if (task->tk_active) {
  601. printk(KERN_ERR "RPC: active task was run twice!n");
  602. goto out_err;
  603. }
  604. task->tk_active = 1;
  605. rpc_set_running(task);
  606. return __rpc_execute(task);
  607.  out_release:
  608. rpc_release_task(task);
  609.  out_err:
  610. return status;
  611. }
  612. /*
  613.  * This is our own little scheduler for async RPC tasks.
  614.  */
  615. static void
  616. __rpc_schedule(void)
  617. {
  618. struct rpc_task *task;
  619. int count = 0;
  620. dprintk("RPC:      rpc_schedule entern");
  621. while (1) {
  622. /* Ensure equal rights for tcp tasks... */
  623. rpciod_tcp_dispatcher();
  624. spin_lock_bh(&rpc_queue_lock);
  625. if (!(task = schedq.task)) {
  626. spin_unlock_bh(&rpc_queue_lock);
  627. break;
  628. }
  629. if (task->tk_lock) {
  630. spin_unlock_bh(&rpc_queue_lock);
  631. printk(KERN_ERR "RPC: Locked task was scheduled !!!!n");
  632. #ifdef RPC_DEBUG
  633. rpc_debug = ~0;
  634. rpc_show_tasks();
  635. #endif
  636. break;
  637. }
  638. __rpc_remove_wait_queue(task);
  639. spin_unlock_bh(&rpc_queue_lock);
  640. __rpc_execute(task);
  641. if (++count >= 200 || current->need_resched) {
  642. count = 0;
  643. schedule();
  644. }
  645. }
  646. dprintk("RPC:      rpc_schedule leaven");
  647. }
  648. /*
  649.  * Allocate memory for RPC purpose.
  650.  *
  651.  * This is yet another tricky issue: For sync requests issued by
  652.  * a user process, we want to make kmalloc sleep if there isn't
  653.  * enough memory. Async requests should not sleep too excessively
  654.  * because that will block rpciod (but that's not dramatic when
  655.  * it's starved of memory anyway). Finally, swapout requests should
  656.  * never sleep at all, and should not trigger another swap_out
  657.  * request through kmalloc which would just increase memory contention.
  658.  *
  659.  * I hope the following gets it right, which gives async requests
  660.  * a slight advantage over sync requests (good for writeback, debatable
  661.  * for readahead):
  662.  *
  663.  *   sync user requests: GFP_KERNEL
  664.  *   async requests: GFP_RPC (== GFP_NOFS)
  665.  *   swap requests: GFP_ATOMIC (or new GFP_SWAPPER)
  666.  */
  667. void *
  668. rpc_allocate(unsigned int flags, unsigned int size)
  669. {
  670. u32 *buffer;
  671. int gfp;
  672. if (flags & RPC_TASK_SWAPPER)
  673. gfp = GFP_ATOMIC;
  674. else if (flags & RPC_TASK_ASYNC)
  675. gfp = GFP_RPC;
  676. else
  677. gfp = GFP_KERNEL;
  678. do {
  679. if ((buffer = (u32 *) kmalloc(size, gfp)) != NULL) {
  680. dprintk("RPC:      allocated buffer %pn", buffer);
  681. return buffer;
  682. }
  683. if ((flags & RPC_TASK_SWAPPER) && size <= sizeof(swap_buffer)
  684.     && rpc_lock_swapbuf()) {
  685. dprintk("RPC:      used last-ditch swap buffern");
  686. return swap_buffer;
  687. }
  688. if (flags & RPC_TASK_ASYNC)
  689. return NULL;
  690. current->policy |= SCHED_YIELD;
  691. schedule();
  692. } while (!signalled());
  693. return NULL;
  694. }
  695. void
  696. rpc_free(void *buffer)
  697. {
  698. if (buffer != swap_buffer) {
  699. kfree(buffer);
  700. return;
  701. }
  702. rpc_unlock_swapbuf();
  703. }
  704. /*
  705.  * Creation and deletion of RPC task structures
  706.  */
  707. inline void
  708. rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt,
  709. rpc_action callback, int flags)
  710. {
  711. memset(task, 0, sizeof(*task));
  712. init_timer(&task->tk_timer);
  713. task->tk_timer.data     = (unsigned long) task;
  714. task->tk_timer.function = (void (*)(unsigned long)) rpc_run_timer;
  715. task->tk_client = clnt;
  716. task->tk_flags  = flags;
  717. task->tk_exit   = callback;
  718. init_waitqueue_head(&task->tk_wait);
  719. if (current->uid != current->fsuid || current->gid != current->fsgid)
  720. task->tk_flags |= RPC_TASK_SETUID;
  721. /* Initialize retry counters */
  722. task->tk_garb_retry = 2;
  723. task->tk_cred_retry = 2;
  724. task->tk_suid_retry = 1;
  725. /* Add to global list of all tasks */
  726. spin_lock(&rpc_sched_lock);
  727. task->tk_next_task = all_tasks;
  728. task->tk_prev_task = NULL;
  729. if (all_tasks)
  730. all_tasks->tk_prev_task = task;
  731. all_tasks = task;
  732. spin_unlock(&rpc_sched_lock);
  733. if (clnt)
  734. atomic_inc(&clnt->cl_users);
  735. #ifdef RPC_DEBUG
  736. task->tk_magic = 0xf00baa;
  737. task->tk_pid = rpc_task_id++;
  738. #endif
  739. dprintk("RPC: %4d new task procpid %dn", task->tk_pid,
  740. current->pid);
  741. }
  742. static void
  743. rpc_default_free_task(struct rpc_task *task)
  744. {
  745. dprintk("RPC: %4d freeing taskn", task->tk_pid);
  746. rpc_free(task);
  747. }
  748. /*
  749.  * Create a new task for the specified client.  We have to
  750.  * clean up after an allocation failure, as the client may
  751.  * have specified "oneshot".
  752.  */
  753. struct rpc_task *
  754. rpc_new_task(struct rpc_clnt *clnt, rpc_action callback, int flags)
  755. {
  756. struct rpc_task *task;
  757. task = (struct rpc_task *) rpc_allocate(flags, sizeof(*task));
  758. if (!task)
  759. goto cleanup;
  760. rpc_init_task(task, clnt, callback, flags);
  761. /* Replace tk_release */
  762. task->tk_release = rpc_default_free_task;
  763. dprintk("RPC: %4d allocated taskn", task->tk_pid);
  764. task->tk_flags |= RPC_TASK_DYNAMIC;
  765. out:
  766. return task;
  767. cleanup:
  768. /* Check whether to release the client */
  769. if (clnt) {
  770. printk("rpc_new_task: failed, users=%d, oneshot=%dn",
  771. atomic_read(&clnt->cl_users), clnt->cl_oneshot);
  772. atomic_inc(&clnt->cl_users); /* pretend we were used ... */
  773. rpc_release_client(clnt);
  774. }
  775. goto out;
  776. }
  777. void
  778. rpc_release_task(struct rpc_task *task)
  779. {
  780. struct rpc_task *next, *prev;
  781. dprintk("RPC: %4d release taskn", task->tk_pid);
  782. #ifdef RPC_DEBUG
  783. if (task->tk_magic != 0xf00baa) {
  784. printk(KERN_ERR "RPC: attempt to release a non-existing task!n");
  785. rpc_debug = ~0;
  786. rpc_show_tasks();
  787. return;
  788. }
  789. #endif
  790. /* Remove from global task list */
  791. spin_lock(&rpc_sched_lock);
  792. prev = task->tk_prev_task;
  793. next = task->tk_next_task;
  794. if (next)
  795. next->tk_prev_task = prev;
  796. if (prev)
  797. prev->tk_next_task = next;
  798. else
  799. all_tasks = next;
  800. task->tk_next_task = task->tk_prev_task = NULL;
  801. spin_unlock(&rpc_sched_lock);
  802. /* Protect the execution below. */
  803. spin_lock_bh(&rpc_queue_lock);
  804. /* Disable timer to prevent zombie wakeup */
  805. __rpc_disable_timer(task);
  806. /* Remove from any wait queue we're still on */
  807. __rpc_remove_wait_queue(task);
  808. task->tk_active = 0;
  809. spin_unlock_bh(&rpc_queue_lock);
  810. /* Synchronously delete any running timer */
  811. rpc_delete_timer(task);
  812. /* Release resources */
  813. if (task->tk_rqstp)
  814. xprt_release(task);
  815. if (task->tk_msg.rpc_cred)
  816. rpcauth_unbindcred(task);
  817. if (task->tk_buffer) {
  818. rpc_free(task->tk_buffer);
  819. task->tk_buffer = NULL;
  820. }
  821. if (task->tk_client) {
  822. rpc_release_client(task->tk_client);
  823. task->tk_client = NULL;
  824. }
  825. #ifdef RPC_DEBUG
  826. task->tk_magic = 0;
  827. #endif
  828. if (task->tk_release)
  829. task->tk_release(task);
  830. }
  831. /**
  832.  * rpc_find_parent - find the parent of a child task.
  833.  * @child: child task
  834.  *
  835.  * Checks that the parent task is still sleeping on the
  836.  * queue 'childq'. If so returns a pointer to the parent.
  837.  * Upon failure returns NULL.
  838.  *
  839.  * Caller must hold rpc_queue_lock
  840.  */
  841. static inline struct rpc_task *
  842. rpc_find_parent(struct rpc_task *child)
  843. {
  844. struct rpc_task *task, *parent;
  845. parent = (struct rpc_task *) child->tk_calldata;
  846. if ((task = childq.task) != NULL) {
  847. do {
  848. if (task == parent)
  849. return parent;
  850. } while ((task = task->tk_next) != childq.task);
  851. }
  852. return NULL;
  853. }
  854. static void
  855. rpc_child_exit(struct rpc_task *child)
  856. {
  857. struct rpc_task *parent;
  858. spin_lock_bh(&rpc_queue_lock);
  859. if ((parent = rpc_find_parent(child)) != NULL) {
  860. parent->tk_status = child->tk_status;
  861. __rpc_wake_up_task(parent);
  862. }
  863. spin_unlock_bh(&rpc_queue_lock);
  864. }
  865. /*
  866.  * Note: rpc_new_task releases the client after a failure.
  867.  */
  868. struct rpc_task *
  869. rpc_new_child(struct rpc_clnt *clnt, struct rpc_task *parent)
  870. {
  871. struct rpc_task *task;
  872. task = rpc_new_task(clnt, NULL, RPC_TASK_ASYNC | RPC_TASK_CHILD);
  873. if (!task)
  874. goto fail;
  875. task->tk_exit = rpc_child_exit;
  876. task->tk_calldata = parent;
  877. return task;
  878. fail:
  879. parent->tk_status = -ENOMEM;
  880. return NULL;
  881. }
  882. void
  883. rpc_run_child(struct rpc_task *task, struct rpc_task *child, rpc_action func)
  884. {
  885. spin_lock_bh(&rpc_queue_lock);
  886. /* N.B. Is it possible for the child to have already finished? */
  887. __rpc_sleep_on(&childq, task, func, NULL);
  888. rpc_schedule_run(child);
  889. spin_unlock_bh(&rpc_queue_lock);
  890. }
  891. /*
  892.  * Kill all tasks for the given client.
  893.  * XXX: kill their descendants as well?
  894.  */
  895. void
  896. rpc_killall_tasks(struct rpc_clnt *clnt)
  897. {
  898. struct rpc_task **q, *rovr;
  899. dprintk("RPC:      killing all tasks for client %pn", clnt);
  900. /*
  901.  * Spin lock all_tasks to prevent changes...
  902.  */
  903. spin_lock(&rpc_sched_lock);
  904. for (q = &all_tasks; (rovr = *q); q = &rovr->tk_next_task) {
  905. if (!clnt || rovr->tk_client == clnt) {
  906. rovr->tk_flags |= RPC_TASK_KILLED;
  907. rpc_exit(rovr, -EIO);
  908. rpc_wake_up_task(rovr);
  909. }
  910. }
  911. spin_unlock(&rpc_sched_lock);
  912. }
  913. static DECLARE_MUTEX_LOCKED(rpciod_running);
  914. static inline int
  915. rpciod_task_pending(void)
  916. {
  917. return schedq.task != NULL || xprt_tcp_pending();
  918. }
  919. /*
  920.  * This is the rpciod kernel thread
  921.  */
  922. static int
  923. rpciod(void *ptr)
  924. {
  925. wait_queue_head_t *assassin = (wait_queue_head_t*) ptr;
  926. int rounds = 0;
  927. MOD_INC_USE_COUNT;
  928. lock_kernel();
  929. /*
  930.  * Let our maker know we're running ...
  931.  */
  932. rpciod_pid = current->pid;
  933. up(&rpciod_running);
  934. daemonize();
  935. spin_lock_irq(&current->sigmask_lock);
  936. siginitsetinv(&current->blocked, sigmask(SIGKILL));
  937. recalc_sigpending(current);
  938. spin_unlock_irq(&current->sigmask_lock);
  939. strcpy(current->comm, "rpciod");
  940. dprintk("RPC: rpciod starting (pid %d)n", rpciod_pid);
  941. while (rpciod_users) {
  942. if (signalled()) {
  943. rpciod_killall();
  944. flush_signals(current);
  945. }
  946. __rpc_schedule();
  947. if (++rounds >= 64) { /* safeguard */
  948. schedule();
  949. rounds = 0;
  950. }
  951. if (!rpciod_task_pending()) {
  952. dprintk("RPC: rpciod back to sleepn");
  953. wait_event_interruptible(rpciod_idle, rpciod_task_pending());
  954. dprintk("RPC: switch to rpciodn");
  955. rounds = 0;
  956. }
  957. }
  958. dprintk("RPC: rpciod shutdown commencesn");
  959. if (all_tasks) {
  960. printk(KERN_ERR "rpciod: active tasks at shutdown?!n");
  961. rpciod_killall();
  962. }
  963. rpciod_pid = 0;
  964. wake_up(assassin);
  965. dprintk("RPC: rpciod exitingn");
  966. MOD_DEC_USE_COUNT;
  967. return 0;
  968. }
  969. static void
  970. rpciod_killall(void)
  971. {
  972. unsigned long flags;
  973. while (all_tasks) {
  974. current->sigpending = 0;
  975. rpc_killall_tasks(NULL);
  976. __rpc_schedule();
  977. if (all_tasks) {
  978. dprintk("rpciod_killall: waiting for tasks to exitn");
  979. current->policy |= SCHED_YIELD;
  980. schedule();
  981. }
  982. }
  983. spin_lock_irqsave(&current->sigmask_lock, flags);
  984. recalc_sigpending(current);
  985. spin_unlock_irqrestore(&current->sigmask_lock, flags);
  986. }
  987. /*
  988.  * Start up the rpciod process if it's not already running.
  989.  */
  990. int
  991. rpciod_up(void)
  992. {
  993. int error = 0;
  994. MOD_INC_USE_COUNT;
  995. down(&rpciod_sema);
  996. dprintk("rpciod_up: pid %d, users %dn", rpciod_pid, rpciod_users);
  997. rpciod_users++;
  998. if (rpciod_pid)
  999. goto out;
  1000. /*
  1001.  * If there's no pid, we should be the first user.
  1002.  */
  1003. if (rpciod_users > 1)
  1004. printk(KERN_WARNING "rpciod_up: no pid, %d users??n", rpciod_users);
  1005. /*
  1006.  * Create the rpciod thread and wait for it to start.
  1007.  */
  1008. error = kernel_thread(rpciod, &rpciod_killer, 0);
  1009. if (error < 0) {
  1010. printk(KERN_WARNING "rpciod_up: create thread failed, error=%dn", error);
  1011. rpciod_users--;
  1012. goto out;
  1013. }
  1014. down(&rpciod_running);
  1015. error = 0;
  1016. out:
  1017. up(&rpciod_sema);
  1018. MOD_DEC_USE_COUNT;
  1019. return error;
  1020. }
  1021. void
  1022. rpciod_down(void)
  1023. {
  1024. unsigned long flags;
  1025. MOD_INC_USE_COUNT;
  1026. down(&rpciod_sema);
  1027. dprintk("rpciod_down pid %d sema %dn", rpciod_pid, rpciod_users);
  1028. if (rpciod_users) {
  1029. if (--rpciod_users)
  1030. goto out;
  1031. } else
  1032. printk(KERN_WARNING "rpciod_down: pid=%d, no users??n", rpciod_pid);
  1033. if (!rpciod_pid) {
  1034. dprintk("rpciod_down: Nothing to do!n");
  1035. goto out;
  1036. }
  1037. kill_proc(rpciod_pid, SIGKILL, 1);
  1038. /*
  1039.  * Usually rpciod will exit very quickly, so we
  1040.  * wait briefly before checking the process id.
  1041.  */
  1042. current->sigpending = 0;
  1043. current->policy |= SCHED_YIELD;
  1044. schedule();
  1045. /*
  1046.  * Display a message if we're going to wait longer.
  1047.  */
  1048. while (rpciod_pid) {
  1049. dprintk("rpciod_down: waiting for pid %d to exitn", rpciod_pid);
  1050. if (signalled()) {
  1051. dprintk("rpciod_down: caught signaln");
  1052. break;
  1053. }
  1054. interruptible_sleep_on(&rpciod_killer);
  1055. }
  1056. spin_lock_irqsave(&current->sigmask_lock, flags);
  1057. recalc_sigpending(current);
  1058. spin_unlock_irqrestore(&current->sigmask_lock, flags);
  1059. out:
  1060. up(&rpciod_sema);
  1061. MOD_DEC_USE_COUNT;
  1062. }
  1063. #ifdef RPC_DEBUG
  1064. void rpc_show_tasks(void)
  1065. {
  1066. struct rpc_task *t = all_tasks, *next;
  1067. spin_lock(&rpc_sched_lock);
  1068. t = all_tasks;
  1069. if (!t) {
  1070. spin_unlock(&rpc_sched_lock);
  1071. return;
  1072. }
  1073. printk("-pid- proc flgs status -client- -prog- --rqstp- -timeout "
  1074. "-rpcwait -action- --exit--n");
  1075. for (; t; t = next) {
  1076. next = t->tk_next_task;
  1077. printk("%05d %04d %04x %06d %8p %6d %8p %08ld %8s %8p %8pn",
  1078. t->tk_pid, t->tk_msg.rpc_proc, t->tk_flags, t->tk_status,
  1079. t->tk_client, t->tk_client->cl_prog,
  1080. t->tk_rqstp, t->tk_timeout,
  1081. t->tk_rpcwait ? rpc_qname(t->tk_rpcwait) : " <NULL> ",
  1082. t->tk_action, t->tk_exit);
  1083. }
  1084. spin_unlock(&rpc_sched_lock);
  1085. }
  1086. #endif