peer.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. /* peer.c: Rx RPC peer management
  2. *
  3. * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/sched.h>
  12. #include <linux/slab.h>
  13. #include <linux/module.h>
  14. #include <rxrpc/rxrpc.h>
  15. #include <rxrpc/transport.h>
  16. #include <rxrpc/peer.h>
  17. #include <rxrpc/connection.h>
  18. #include <rxrpc/call.h>
  19. #include <rxrpc/message.h>
  20. #include <linux/udp.h>
  21. #include <linux/ip.h>
  22. #include <net/sock.h>
  23. #include <asm/uaccess.h>
  24. #include <asm/div64.h>
  25. #include "internal.h"
  26. __RXACCT_DECL(atomic_t rxrpc_peer_count);
  27. LIST_HEAD(rxrpc_peers);
  28. DECLARE_RWSEM(rxrpc_peers_sem);
  29. unsigned long rxrpc_peer_timeout = 12 * 60 * 60;
  30. static void rxrpc_peer_do_timeout(struct rxrpc_peer *peer);
  31. static void __rxrpc_peer_timeout(rxrpc_timer_t *timer)
  32. {
  33. struct rxrpc_peer *peer =
  34. list_entry(timer, struct rxrpc_peer, timeout);
  35. _debug("Rx PEER TIMEOUT [%p{u=%d}]", peer, atomic_read(&peer->usage));
  36. rxrpc_peer_do_timeout(peer);
  37. }
  38. static const struct rxrpc_timer_ops rxrpc_peer_timer_ops = {
  39. .timed_out = __rxrpc_peer_timeout,
  40. };
  41. /*****************************************************************************/
  42. /*
  43. * create a peer record
  44. */
  45. static int __rxrpc_create_peer(struct rxrpc_transport *trans, __be32 addr,
  46. struct rxrpc_peer **_peer)
  47. {
  48. struct rxrpc_peer *peer;
  49. _enter("%p,%08x", trans, ntohl(addr));
  50. /* allocate and initialise a peer record */
  51. peer = kmalloc(sizeof(struct rxrpc_peer), GFP_KERNEL);
  52. if (!peer) {
  53. _leave(" = -ENOMEM");
  54. return -ENOMEM;
  55. }
  56. memset(peer, 0, sizeof(struct rxrpc_peer));
  57. atomic_set(&peer->usage, 1);
  58. INIT_LIST_HEAD(&peer->link);
  59. INIT_LIST_HEAD(&peer->proc_link);
  60. INIT_LIST_HEAD(&peer->conn_idlist);
  61. INIT_LIST_HEAD(&peer->conn_active);
  62. INIT_LIST_HEAD(&peer->conn_graveyard);
  63. spin_lock_init(&peer->conn_gylock);
  64. init_waitqueue_head(&peer->conn_gy_waitq);
  65. rwlock_init(&peer->conn_idlock);
  66. rwlock_init(&peer->conn_lock);
  67. atomic_set(&peer->conn_count, 0);
  68. spin_lock_init(&peer->lock);
  69. rxrpc_timer_init(&peer->timeout, &rxrpc_peer_timer_ops);
  70. peer->addr.s_addr = addr;
  71. peer->trans = trans;
  72. peer->ops = trans->peer_ops;
  73. __RXACCT(atomic_inc(&rxrpc_peer_count));
  74. *_peer = peer;
  75. _leave(" = 0 (%p)", peer);
  76. return 0;
  77. } /* end __rxrpc_create_peer() */
  78. /*****************************************************************************/
  79. /*
  80. * find a peer record on the specified transport
  81. * - returns (if successful) with peer record usage incremented
  82. * - resurrects it from the graveyard if found there
  83. */
  84. int rxrpc_peer_lookup(struct rxrpc_transport *trans, __be32 addr,
  85. struct rxrpc_peer **_peer)
  86. {
  87. struct rxrpc_peer *peer, *candidate = NULL;
  88. struct list_head *_p;
  89. int ret;
  90. _enter("%p{%hu},%08x", trans, trans->port, ntohl(addr));
  91. /* [common case] search the transport's active list first */
  92. read_lock(&trans->peer_lock);
  93. list_for_each(_p, &trans->peer_active) {
  94. peer = list_entry(_p, struct rxrpc_peer, link);
  95. if (peer->addr.s_addr == addr)
  96. goto found_active;
  97. }
  98. read_unlock(&trans->peer_lock);
  99. /* [uncommon case] not active - create a candidate for a new record */
  100. ret = __rxrpc_create_peer(trans, addr, &candidate);
  101. if (ret < 0) {
  102. _leave(" = %d", ret);
  103. return ret;
  104. }
  105. /* search the active list again, just in case it appeared whilst we
  106. * were busy */
  107. write_lock(&trans->peer_lock);
  108. list_for_each(_p, &trans->peer_active) {
  109. peer = list_entry(_p, struct rxrpc_peer, link);
  110. if (peer->addr.s_addr == addr)
  111. goto found_active_second_chance;
  112. }
  113. /* search the transport's graveyard list */
  114. spin_lock(&trans->peer_gylock);
  115. list_for_each(_p, &trans->peer_graveyard) {
  116. peer = list_entry(_p, struct rxrpc_peer, link);
  117. if (peer->addr.s_addr == addr)
  118. goto found_in_graveyard;
  119. }
  120. spin_unlock(&trans->peer_gylock);
  121. /* we can now add the new candidate to the list
  122. * - tell the application layer that this peer has been added
  123. */
  124. rxrpc_get_transport(trans);
  125. peer = candidate;
  126. candidate = NULL;
  127. if (peer->ops && peer->ops->adding) {
  128. ret = peer->ops->adding(peer);
  129. if (ret < 0) {
  130. write_unlock(&trans->peer_lock);
  131. __RXACCT(atomic_dec(&rxrpc_peer_count));
  132. kfree(peer);
  133. rxrpc_put_transport(trans);
  134. _leave(" = %d", ret);
  135. return ret;
  136. }
  137. }
  138. atomic_inc(&trans->peer_count);
  139. make_active:
  140. list_add_tail(&peer->link, &trans->peer_active);
  141. success_uwfree:
  142. write_unlock(&trans->peer_lock);
  143. if (candidate) {
  144. __RXACCT(atomic_dec(&rxrpc_peer_count));
  145. kfree(candidate);
  146. }
  147. if (list_empty(&peer->proc_link)) {
  148. down_write(&rxrpc_peers_sem);
  149. list_add_tail(&peer->proc_link, &rxrpc_peers);
  150. up_write(&rxrpc_peers_sem);
  151. }
  152. success:
  153. *_peer = peer;
  154. _leave(" = 0 (%p{u=%d cc=%d})",
  155. peer,
  156. atomic_read(&peer->usage),
  157. atomic_read(&peer->conn_count));
  158. return 0;
  159. /* handle the peer being found in the active list straight off */
  160. found_active:
  161. rxrpc_get_peer(peer);
  162. read_unlock(&trans->peer_lock);
  163. goto success;
  164. /* handle resurrecting a peer from the graveyard */
  165. found_in_graveyard:
  166. rxrpc_get_peer(peer);
  167. rxrpc_get_transport(peer->trans);
  168. rxrpc_krxtimod_del_timer(&peer->timeout);
  169. list_del_init(&peer->link);
  170. spin_unlock(&trans->peer_gylock);
  171. goto make_active;
  172. /* handle finding the peer on the second time through the active
  173. * list */
  174. found_active_second_chance:
  175. rxrpc_get_peer(peer);
  176. goto success_uwfree;
  177. } /* end rxrpc_peer_lookup() */
  178. /*****************************************************************************/
  179. /*
  180. * finish with a peer record
  181. * - it gets sent to the graveyard from where it can be resurrected or timed
  182. * out
  183. */
  184. void rxrpc_put_peer(struct rxrpc_peer *peer)
  185. {
  186. struct rxrpc_transport *trans = peer->trans;
  187. _enter("%p{cc=%d a=%08x}",
  188. peer,
  189. atomic_read(&peer->conn_count),
  190. ntohl(peer->addr.s_addr));
  191. /* sanity check */
  192. if (atomic_read(&peer->usage) <= 0)
  193. BUG();
  194. write_lock(&trans->peer_lock);
  195. spin_lock(&trans->peer_gylock);
  196. if (likely(!atomic_dec_and_test(&peer->usage))) {
  197. spin_unlock(&trans->peer_gylock);
  198. write_unlock(&trans->peer_lock);
  199. _leave("");
  200. return;
  201. }
  202. /* move to graveyard queue */
  203. list_del(&peer->link);
  204. write_unlock(&trans->peer_lock);
  205. list_add_tail(&peer->link, &trans->peer_graveyard);
  206. BUG_ON(!list_empty(&peer->conn_active));
  207. rxrpc_krxtimod_add_timer(&peer->timeout, rxrpc_peer_timeout * HZ);
  208. spin_unlock(&trans->peer_gylock);
  209. rxrpc_put_transport(trans);
  210. _leave(" [killed]");
  211. } /* end rxrpc_put_peer() */
  212. /*****************************************************************************/
  213. /*
  214. * handle a peer timing out in the graveyard
  215. * - called from krxtimod
  216. */
  217. static void rxrpc_peer_do_timeout(struct rxrpc_peer *peer)
  218. {
  219. struct rxrpc_transport *trans = peer->trans;
  220. _enter("%p{u=%d cc=%d a=%08x}",
  221. peer,
  222. atomic_read(&peer->usage),
  223. atomic_read(&peer->conn_count),
  224. ntohl(peer->addr.s_addr));
  225. BUG_ON(atomic_read(&peer->usage) < 0);
  226. /* remove from graveyard if still dead */
  227. spin_lock(&trans->peer_gylock);
  228. if (atomic_read(&peer->usage) == 0)
  229. list_del_init(&peer->link);
  230. else
  231. peer = NULL;
  232. spin_unlock(&trans->peer_gylock);
  233. if (!peer) {
  234. _leave("");
  235. return; /* resurrected */
  236. }
  237. /* clear all connections on this peer */
  238. rxrpc_conn_clearall(peer);
  239. BUG_ON(!list_empty(&peer->conn_active));
  240. BUG_ON(!list_empty(&peer->conn_graveyard));
  241. /* inform the application layer */
  242. if (peer->ops && peer->ops->discarding)
  243. peer->ops->discarding(peer);
  244. if (!list_empty(&peer->proc_link)) {
  245. down_write(&rxrpc_peers_sem);
  246. list_del(&peer->proc_link);
  247. up_write(&rxrpc_peers_sem);
  248. }
  249. __RXACCT(atomic_dec(&rxrpc_peer_count));
  250. kfree(peer);
  251. /* if the graveyard is now empty, wake up anyone waiting for that */
  252. if (atomic_dec_and_test(&trans->peer_count))
  253. wake_up(&trans->peer_gy_waitq);
  254. _leave(" [destroyed]");
  255. } /* end rxrpc_peer_do_timeout() */
  256. /*****************************************************************************/
  257. /*
  258. * clear all peer records from a transport endpoint
  259. */
  260. void rxrpc_peer_clearall(struct rxrpc_transport *trans)
  261. {
  262. DECLARE_WAITQUEUE(myself,current);
  263. struct rxrpc_peer *peer;
  264. int err;
  265. _enter("%p",trans);
  266. /* there shouldn't be any active peers remaining */
  267. BUG_ON(!list_empty(&trans->peer_active));
  268. /* manually timeout all peers in the graveyard */
  269. spin_lock(&trans->peer_gylock);
  270. while (!list_empty(&trans->peer_graveyard)) {
  271. peer = list_entry(trans->peer_graveyard.next,
  272. struct rxrpc_peer, link);
  273. _debug("Clearing peer %p\n", peer);
  274. err = rxrpc_krxtimod_del_timer(&peer->timeout);
  275. spin_unlock(&trans->peer_gylock);
  276. if (err == 0)
  277. rxrpc_peer_do_timeout(peer);
  278. spin_lock(&trans->peer_gylock);
  279. }
  280. spin_unlock(&trans->peer_gylock);
  281. /* wait for the the peer graveyard to be completely cleared */
  282. set_current_state(TASK_UNINTERRUPTIBLE);
  283. add_wait_queue(&trans->peer_gy_waitq, &myself);
  284. while (atomic_read(&trans->peer_count) != 0) {
  285. schedule();
  286. set_current_state(TASK_UNINTERRUPTIBLE);
  287. }
  288. remove_wait_queue(&trans->peer_gy_waitq, &myself);
  289. set_current_state(TASK_RUNNING);
  290. _leave("");
  291. } /* end rxrpc_peer_clearall() */
  292. /*****************************************************************************/
  293. /*
  294. * calculate and cache the Round-Trip-Time for a message and its response
  295. */
  296. void rxrpc_peer_calculate_rtt(struct rxrpc_peer *peer,
  297. struct rxrpc_message *msg,
  298. struct rxrpc_message *resp)
  299. {
  300. unsigned long long rtt;
  301. int loop;
  302. _enter("%p,%p,%p", peer, msg, resp);
  303. /* calculate the latest RTT */
  304. rtt = resp->stamp.tv_sec - msg->stamp.tv_sec;
  305. rtt *= 1000000UL;
  306. rtt += resp->stamp.tv_usec - msg->stamp.tv_usec;
  307. /* add to cache */
  308. peer->rtt_cache[peer->rtt_point] = rtt;
  309. peer->rtt_point++;
  310. peer->rtt_point %= RXRPC_RTT_CACHE_SIZE;
  311. if (peer->rtt_usage < RXRPC_RTT_CACHE_SIZE)
  312. peer->rtt_usage++;
  313. /* recalculate RTT */
  314. rtt = 0;
  315. for (loop = peer->rtt_usage - 1; loop >= 0; loop--)
  316. rtt += peer->rtt_cache[loop];
  317. do_div(rtt, peer->rtt_usage);
  318. peer->rtt = rtt;
  319. _leave(" RTT=%lu.%lums",
  320. (long) (peer->rtt / 1000), (long) (peer->rtt % 1000));
  321. } /* end rxrpc_peer_calculate_rtt() */