Blame view
net/rds/transport.c
3.6 KB
0fbc78cbf RDS: Transport code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/* * Copyright (c) 2006 Oracle. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/in.h> #include "rds.h" #include "loop.h" |
335776bd6 RDS: Track transp... |
39 |
static struct rds_transport *transports[RDS_TRANS_COUNT]; |
0fbc78cbf RDS: Transport code |
40 41 42 43 44 45 46 |
static DECLARE_RWSEM(rds_trans_sem); int rds_trans_register(struct rds_transport *trans) { BUG_ON(strlen(trans->t_name) + 1 > TRANSNAMSIZ); down_write(&rds_trans_sem); |
335776bd6 RDS: Track transp... |
47 48 49 50 51 52 53 54 55 |
if (transports[trans->t_type]) printk(KERN_ERR "RDS Transport type %d already registered ", trans->t_type); else { transports[trans->t_type] = trans; printk(KERN_INFO "Registered RDS/%s transport ", trans->t_name); } |
0fbc78cbf RDS: Transport code |
56 57 58 59 60 |
up_write(&rds_trans_sem); return 0; } |
616b757ae RDS: Export symbo... |
61 |
EXPORT_SYMBOL_GPL(rds_trans_register); |
0fbc78cbf RDS: Transport code |
62 63 64 65 |
void rds_trans_unregister(struct rds_transport *trans) { down_write(&rds_trans_sem); |
335776bd6 RDS: Track transp... |
66 |
transports[trans->t_type] = NULL; |
0fbc78cbf RDS: Transport code |
67 68 69 70 71 |
printk(KERN_INFO "Unregistered RDS/%s transport ", trans->t_name); up_write(&rds_trans_sem); } |
616b757ae RDS: Export symbo... |
72 |
EXPORT_SYMBOL_GPL(rds_trans_unregister); |
0fbc78cbf RDS: Transport code |
73 |
|
5adb5bc65 RDS: have sockets... |
74 75 76 77 78 |
void rds_trans_put(struct rds_transport *trans) { if (trans && trans->t_owner) module_put(trans->t_owner); } |
0fbc78cbf RDS: Transport code |
79 80 |
struct rds_transport *rds_trans_get_preferred(__be32 addr) { |
0fbc78cbf RDS: Transport code |
81 |
struct rds_transport *ret = NULL; |
5adb5bc65 RDS: have sockets... |
82 83 |
struct rds_transport *trans; unsigned int i; |
0fbc78cbf RDS: Transport code |
84 85 86 87 88 |
if (IN_LOOPBACK(ntohl(addr))) return &rds_loop_transport; down_read(&rds_trans_sem); |
5adb5bc65 RDS: have sockets... |
89 90 91 92 93 94 |
for (i = 0; i < RDS_TRANS_COUNT; i++) { trans = transports[i]; if (trans && (trans->laddr_check(addr) == 0) && (!trans->t_owner || try_module_get(trans->t_owner))) { ret = trans; |
0fbc78cbf RDS: Transport code |
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
break; } } up_read(&rds_trans_sem); return ret; } /* * This returns the number of stats entries in the snapshot and only * copies them using the iter if there is enough space for them. The * caller passes in the global stats so that we can size and copy while * holding the lock. */ unsigned int rds_trans_stats_info_copy(struct rds_info_iterator *iter, unsigned int avail) { struct rds_transport *trans; unsigned int total = 0; unsigned int part; |
335776bd6 RDS: Track transp... |
116 |
int i; |
0fbc78cbf RDS: Transport code |
117 118 119 |
rds_info_iter_unmap(iter); down_read(&rds_trans_sem); |
335776bd6 RDS: Track transp... |
120 121 122 123 |
for (i = 0; i < RDS_TRANS_COUNT; i++) { trans = transports[i]; if (!trans || !trans->stats_info_copy) |
0fbc78cbf RDS: Transport code |
124 125 126 127 128 129 130 131 132 133 134 |
continue; part = trans->stats_info_copy(iter, avail); avail -= min(avail, part); total += part; } up_read(&rds_trans_sem); return total; } |