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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * net/sched/sch_generic.c Generic packet scheduler routines.
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version
  7.  * 2 of the License, or (at your option) any later version.
  8.  *
  9.  * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  10.  *              Jamal Hadi Salim, <hadi@nortelnetworks.com> 990601
  11.  *              - Ingress support
  12.  */
  13. #include <asm/uaccess.h>
  14. #include <asm/system.h>
  15. #include <asm/bitops.h>
  16. #include <linux/config.h>
  17. #include <linux/types.h>
  18. #include <linux/kernel.h>
  19. #include <linux/sched.h>
  20. #include <linux/string.h>
  21. #include <linux/mm.h>
  22. #include <linux/socket.h>
  23. #include <linux/sockios.h>
  24. #include <linux/in.h>
  25. #include <linux/errno.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/netdevice.h>
  28. #include <linux/skbuff.h>
  29. #include <linux/rtnetlink.h>
  30. #include <linux/init.h>
  31. #include <net/sock.h>
  32. #include <net/pkt_sched.h>
  33. /* Main transmission queue. */
  34. /* Main qdisc structure lock. 
  35.    However, modifications
  36.    to data, participating in scheduling must be additionally
  37.    protected with dev->queue_lock spinlock.
  38.    The idea is the following:
  39.    - enqueue, dequeue are serialized via top level device
  40.      spinlock dev->queue_lock.
  41.    - tree walking is protected by read_lock(qdisc_tree_lock)
  42.      and this lock is used only in process context.
  43.    - updates to tree are made only under rtnl semaphore,
  44.      hence this lock may be made without local bh disabling.
  45.    qdisc_tree_lock must be grabbed BEFORE dev->queue_lock!
  46.  */
  47. rwlock_t qdisc_tree_lock = RW_LOCK_UNLOCKED;
  48. /* 
  49.    dev->queue_lock serializes queue accesses for this device
  50.    AND dev->qdisc pointer itself.
  51.    dev->xmit_lock serializes accesses to device driver.
  52.    dev->queue_lock and dev->xmit_lock are mutually exclusive,
  53.    if one is grabbed, another must be free.
  54.  */
  55. /* Kick device.
  56.    Note, that this procedure can be called by a watchdog timer, so that
  57.    we do not check dev->tbusy flag here.
  58.    Returns:  0  - queue is empty.
  59.             >0  - queue is not empty, but throttled.
  60.     <0  - queue is not empty. Device is throttled, if dev->tbusy != 0.
  61.    NOTE: Called under dev->queue_lock with locally disabled BH.
  62. */
  63. int qdisc_restart(struct net_device *dev)
  64. {
  65. struct Qdisc *q = dev->qdisc;
  66. struct sk_buff *skb;
  67. /* Dequeue packet */
  68. if ((skb = q->dequeue(q)) != NULL) {
  69. if (spin_trylock(&dev->xmit_lock)) {
  70. /* Remember that the driver is grabbed by us. */
  71. dev->xmit_lock_owner = smp_processor_id();
  72. /* And release queue */
  73. spin_unlock(&dev->queue_lock);
  74. if (!netif_queue_stopped(dev)) {
  75. if (netdev_nit)
  76. dev_queue_xmit_nit(skb, dev);
  77. if (dev->hard_start_xmit(skb, dev) == 0) {
  78. dev->xmit_lock_owner = -1;
  79. spin_unlock(&dev->xmit_lock);
  80. spin_lock(&dev->queue_lock);
  81. return -1;
  82. }
  83. }
  84. /* Release the driver */
  85. dev->xmit_lock_owner = -1;
  86. spin_unlock(&dev->xmit_lock);
  87. spin_lock(&dev->queue_lock);
  88. q = dev->qdisc;
  89. } else {
  90. /* So, someone grabbed the driver. */
  91. /* It may be transient configuration error,
  92.    when hard_start_xmit() recurses. We detect
  93.    it by checking xmit owner and drop the
  94.    packet when deadloop is detected.
  95.  */
  96. if (dev->xmit_lock_owner == smp_processor_id()) {
  97. kfree_skb(skb);
  98. if (net_ratelimit())
  99. printk(KERN_DEBUG "Dead loop on netdevice %s, fix it urgently!n", dev->name);
  100. return -1;
  101. }
  102. netdev_rx_stat[smp_processor_id()].cpu_collision++;
  103. }
  104. /* Device kicked us out :(
  105.    This is possible in three cases:
  106.    0. driver is locked
  107.    1. fastroute is enabled
  108.    2. device cannot determine busy state
  109.       before start of transmission (f.e. dialout)
  110.    3. device is buggy (ppp)
  111.  */
  112. q->ops->requeue(skb, q);
  113. netif_schedule(dev);
  114. return 1;
  115. }
  116. return q->q.qlen;
  117. }
  118. static void dev_watchdog(unsigned long arg)
  119. {
  120. struct net_device *dev = (struct net_device *)arg;
  121. spin_lock(&dev->xmit_lock);
  122. if (dev->qdisc != &noop_qdisc) {
  123. if (netif_device_present(dev) &&
  124.     netif_running(dev) &&
  125.     netif_carrier_ok(dev)) {
  126. if (netif_queue_stopped(dev) &&
  127.     (jiffies - dev->trans_start) > dev->watchdog_timeo) {
  128. printk(KERN_INFO "NETDEV WATCHDOG: %s: transmit timed outn", dev->name);
  129. dev->tx_timeout(dev);
  130. }
  131. if (!mod_timer(&dev->watchdog_timer, jiffies + dev->watchdog_timeo))
  132. dev_hold(dev);
  133. }
  134. }
  135. spin_unlock(&dev->xmit_lock);
  136. dev_put(dev);
  137. }
  138. static void dev_watchdog_init(struct net_device *dev)
  139. {
  140. init_timer(&dev->watchdog_timer);
  141. dev->watchdog_timer.data = (unsigned long)dev;
  142. dev->watchdog_timer.function = dev_watchdog;
  143. }
  144. void __netdev_watchdog_up(struct net_device *dev)
  145. {
  146. if (dev->tx_timeout) {
  147. if (dev->watchdog_timeo <= 0)
  148. dev->watchdog_timeo = 5*HZ;
  149. if (!mod_timer(&dev->watchdog_timer, jiffies + dev->watchdog_timeo))
  150. dev_hold(dev);
  151. }
  152. }
  153. static void dev_watchdog_up(struct net_device *dev)
  154. {
  155. spin_lock_bh(&dev->xmit_lock);
  156. __netdev_watchdog_up(dev);
  157. spin_unlock_bh(&dev->xmit_lock);
  158. }
  159. static void dev_watchdog_down(struct net_device *dev)
  160. {
  161. spin_lock_bh(&dev->xmit_lock);
  162. if (del_timer(&dev->watchdog_timer))
  163. __dev_put(dev);
  164. spin_unlock_bh(&dev->xmit_lock);
  165. }
  166. /* "NOOP" scheduler: the best scheduler, recommended for all interfaces
  167.    under all circumstances. It is difficult to invent anything faster or
  168.    cheaper.
  169.  */
  170. static int
  171. noop_enqueue(struct sk_buff *skb, struct Qdisc * qdisc)
  172. {
  173. kfree_skb(skb);
  174. return NET_XMIT_CN;
  175. }
  176. static struct sk_buff *
  177. noop_dequeue(struct Qdisc * qdisc)
  178. {
  179. return NULL;
  180. }
  181. static int
  182. noop_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
  183. {
  184. if (net_ratelimit())
  185. printk(KERN_DEBUG "%s deferred output. It is buggy.n", skb->dev->name);
  186. kfree_skb(skb);
  187. return NET_XMIT_CN;
  188. }
  189. struct Qdisc_ops noop_qdisc_ops =
  190. {
  191. NULL,
  192. NULL,
  193. "noop",
  194. 0,
  195. noop_enqueue,
  196. noop_dequeue,
  197. noop_requeue,
  198. };
  199. struct Qdisc noop_qdisc =
  200. {
  201. noop_enqueue,
  202. noop_dequeue,
  203. TCQ_F_BUILTIN,
  204. &noop_qdisc_ops,
  205. };
  206. struct Qdisc_ops noqueue_qdisc_ops =
  207. {
  208. NULL,
  209. NULL,
  210. "noqueue",
  211. 0,
  212. noop_enqueue,
  213. noop_dequeue,
  214. noop_requeue,
  215. };
  216. struct Qdisc noqueue_qdisc =
  217. {
  218. NULL,
  219. noop_dequeue,
  220. TCQ_F_BUILTIN,
  221. &noqueue_qdisc_ops,
  222. };
  223. static const u8 prio2band[TC_PRIO_MAX+1] =
  224. { 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 };
  225. /* 3-band FIFO queue: old style, but should be a bit faster than
  226.    generic prio+fifo combination.
  227.  */
  228. static int
  229. pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
  230. {
  231. struct sk_buff_head *list;
  232. list = ((struct sk_buff_head*)qdisc->data) +
  233. prio2band[skb->priority&TC_PRIO_MAX];
  234. if (list->qlen <= skb->dev->tx_queue_len) {
  235. __skb_queue_tail(list, skb);
  236. qdisc->q.qlen++;
  237. return 0;
  238. }
  239. qdisc->stats.drops++;
  240. kfree_skb(skb);
  241. return NET_XMIT_DROP;
  242. }
  243. static struct sk_buff *
  244. pfifo_fast_dequeue(struct Qdisc* qdisc)
  245. {
  246. int prio;
  247. struct sk_buff_head *list = ((struct sk_buff_head*)qdisc->data);
  248. struct sk_buff *skb;
  249. for (prio = 0; prio < 3; prio++, list++) {
  250. skb = __skb_dequeue(list);
  251. if (skb) {
  252. qdisc->q.qlen--;
  253. return skb;
  254. }
  255. }
  256. return NULL;
  257. }
  258. static int
  259. pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
  260. {
  261. struct sk_buff_head *list;
  262. list = ((struct sk_buff_head*)qdisc->data) +
  263. prio2band[skb->priority&TC_PRIO_MAX];
  264. __skb_queue_head(list, skb);
  265. qdisc->q.qlen++;
  266. return 0;
  267. }
  268. static void
  269. pfifo_fast_reset(struct Qdisc* qdisc)
  270. {
  271. int prio;
  272. struct sk_buff_head *list = ((struct sk_buff_head*)qdisc->data);
  273. for (prio=0; prio < 3; prio++)
  274. skb_queue_purge(list+prio);
  275. qdisc->q.qlen = 0;
  276. }
  277. static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt)
  278. {
  279. int i;
  280. struct sk_buff_head *list;
  281. list = ((struct sk_buff_head*)qdisc->data);
  282. for (i=0; i<3; i++)
  283. skb_queue_head_init(list+i);
  284. return 0;
  285. }
  286. static struct Qdisc_ops pfifo_fast_ops =
  287. {
  288. NULL,
  289. NULL,
  290. "pfifo_fast",
  291. 3 * sizeof(struct sk_buff_head),
  292. pfifo_fast_enqueue,
  293. pfifo_fast_dequeue,
  294. pfifo_fast_requeue,
  295. NULL,
  296. pfifo_fast_init,
  297. pfifo_fast_reset,
  298. };
  299. struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops)
  300. {
  301. struct Qdisc *sch;
  302. int size = sizeof(*sch) + ops->priv_size;
  303. sch = kmalloc(size, GFP_KERNEL);
  304. if (!sch)
  305. return NULL;
  306. memset(sch, 0, size);
  307. skb_queue_head_init(&sch->q);
  308. sch->ops = ops;
  309. sch->enqueue = ops->enqueue;
  310. sch->dequeue = ops->dequeue;
  311. sch->dev = dev;
  312. sch->stats.lock = &dev->queue_lock;
  313. atomic_set(&sch->refcnt, 1);
  314. if (!ops->init || ops->init(sch, NULL) == 0)
  315. return sch;
  316. kfree(sch);
  317. return NULL;
  318. }
  319. /* Under dev->queue_lock and BH! */
  320. void qdisc_reset(struct Qdisc *qdisc)
  321. {
  322. struct Qdisc_ops *ops = qdisc->ops;
  323. if (ops->reset)
  324. ops->reset(qdisc);
  325. }
  326. /* Under dev->queue_lock and BH! */
  327. void qdisc_destroy(struct Qdisc *qdisc)
  328. {
  329. struct Qdisc_ops *ops = qdisc->ops;
  330. struct net_device *dev;
  331. if (!atomic_dec_and_test(&qdisc->refcnt))
  332. return;
  333. dev = qdisc->dev;
  334. #ifdef CONFIG_NET_SCHED
  335. if (dev) {
  336. struct Qdisc *q, **qp;
  337. for (qp = &qdisc->dev->qdisc_list; (q=*qp) != NULL; qp = &q->next) {
  338. if (q == qdisc) {
  339. *qp = q->next;
  340. break;
  341. }
  342. }
  343. }
  344. #ifdef CONFIG_NET_ESTIMATOR
  345. qdisc_kill_estimator(&qdisc->stats);
  346. #endif
  347. #endif
  348. if (ops->reset)
  349. ops->reset(qdisc);
  350. if (ops->destroy)
  351. ops->destroy(qdisc);
  352. if (!(qdisc->flags&TCQ_F_BUILTIN))
  353. kfree(qdisc);
  354. }
  355. void dev_activate(struct net_device *dev)
  356. {
  357. /* No queueing discipline is attached to device;
  358.    create default one i.e. pfifo_fast for devices,
  359.    which need queueing and noqueue_qdisc for
  360.    virtual interfaces
  361.  */
  362. if (dev->qdisc_sleeping == &noop_qdisc) {
  363. struct Qdisc *qdisc;
  364. if (dev->tx_queue_len) {
  365. qdisc = qdisc_create_dflt(dev, &pfifo_fast_ops);
  366. if (qdisc == NULL) {
  367. printk(KERN_INFO "%s: activation failedn", dev->name);
  368. return;
  369. }
  370. } else {
  371. qdisc =  &noqueue_qdisc;
  372. }
  373. write_lock(&qdisc_tree_lock);
  374. dev->qdisc_sleeping = qdisc;
  375. write_unlock(&qdisc_tree_lock);
  376. }
  377. spin_lock_bh(&dev->queue_lock);
  378. if ((dev->qdisc = dev->qdisc_sleeping) != &noqueue_qdisc) {
  379. dev->trans_start = jiffies;
  380. dev_watchdog_up(dev);
  381. }
  382. spin_unlock_bh(&dev->queue_lock);
  383. }
  384. void dev_deactivate(struct net_device *dev)
  385. {
  386. struct Qdisc *qdisc;
  387. spin_lock_bh(&dev->queue_lock);
  388. qdisc = dev->qdisc;
  389. dev->qdisc = &noop_qdisc;
  390. qdisc_reset(qdisc);
  391. spin_unlock_bh(&dev->queue_lock);
  392. dev_watchdog_down(dev);
  393. while (test_bit(__LINK_STATE_SCHED, &dev->state)) {
  394. current->policy |= SCHED_YIELD;
  395. schedule();
  396. }
  397. spin_unlock_wait(&dev->xmit_lock);
  398. }
  399. void dev_init_scheduler(struct net_device *dev)
  400. {
  401. write_lock(&qdisc_tree_lock);
  402. spin_lock_bh(&dev->queue_lock);
  403. dev->qdisc = &noop_qdisc;
  404. spin_unlock_bh(&dev->queue_lock);
  405. dev->qdisc_sleeping = &noop_qdisc;
  406. dev->qdisc_list = NULL;
  407. write_unlock(&qdisc_tree_lock);
  408. dev_watchdog_init(dev);
  409. }
  410. void dev_shutdown(struct net_device *dev)
  411. {
  412. struct Qdisc *qdisc;
  413. write_lock(&qdisc_tree_lock);
  414. spin_lock_bh(&dev->queue_lock);
  415. qdisc = dev->qdisc_sleeping;
  416. dev->qdisc = &noop_qdisc;
  417. dev->qdisc_sleeping = &noop_qdisc;
  418. qdisc_destroy(qdisc);
  419. #if defined(CONFIG_NET_SCH_INGRESS) || defined(CONFIG_NET_SCH_INGRESS_MODULE)
  420.         if ((qdisc = dev->qdisc_ingress) != NULL) {
  421. dev->qdisc_ingress = NULL;
  422. qdisc_destroy(qdisc);
  423.         }
  424. #endif
  425. BUG_TRAP(dev->qdisc_list == NULL);
  426. BUG_TRAP(!timer_pending(&dev->watchdog_timer));
  427. dev->qdisc_list = NULL;
  428. spin_unlock_bh(&dev->queue_lock);
  429. write_unlock(&qdisc_tree_lock);
  430. }