diff options
Diffstat (limited to 'net/rds')
-rw-r--r-- | net/rds/cong.c | 9 | ||||
-rw-r--r-- | net/rds/ib.c | 9 | ||||
-rw-r--r-- | net/rds/ib.h | 2 | ||||
-rw-r--r-- | net/rds/ib_rdma.c | 27 | ||||
-rw-r--r-- | net/rds/ib_send.c | 7 | ||||
-rw-r--r-- | net/rds/iw_cm.c | 2 | ||||
-rw-r--r-- | net/rds/iw_rdma.c | 2 | ||||
-rw-r--r-- | net/rds/iw_send.c | 2 | ||||
-rw-r--r-- | net/rds/loop.c | 11 | ||||
-rw-r--r-- | net/rds/rds.h | 1 | ||||
-rw-r--r-- | net/rds/send.c | 2 |
11 files changed, 25 insertions, 49 deletions
diff --git a/net/rds/cong.c b/net/rds/cong.c index 75ea686f27d5..6daaa49d133f 100644 --- a/net/rds/cong.c +++ b/net/rds/cong.c | |||
@@ -33,8 +33,7 @@ | |||
33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
34 | #include <linux/types.h> | 34 | #include <linux/types.h> |
35 | #include <linux/rbtree.h> | 35 | #include <linux/rbtree.h> |
36 | 36 | #include <linux/bitops.h> | |
37 | #include <asm-generic/bitops/le.h> | ||
38 | 37 | ||
39 | #include "rds.h" | 38 | #include "rds.h" |
40 | 39 | ||
@@ -285,7 +284,7 @@ void rds_cong_set_bit(struct rds_cong_map *map, __be16 port) | |||
285 | i = be16_to_cpu(port) / RDS_CONG_MAP_PAGE_BITS; | 284 | i = be16_to_cpu(port) / RDS_CONG_MAP_PAGE_BITS; |
286 | off = be16_to_cpu(port) % RDS_CONG_MAP_PAGE_BITS; | 285 | off = be16_to_cpu(port) % RDS_CONG_MAP_PAGE_BITS; |
287 | 286 | ||
288 | generic___set_le_bit(off, (void *)map->m_page_addrs[i]); | 287 | __set_bit_le(off, (void *)map->m_page_addrs[i]); |
289 | } | 288 | } |
290 | 289 | ||
291 | void rds_cong_clear_bit(struct rds_cong_map *map, __be16 port) | 290 | void rds_cong_clear_bit(struct rds_cong_map *map, __be16 port) |
@@ -299,7 +298,7 @@ void rds_cong_clear_bit(struct rds_cong_map *map, __be16 port) | |||
299 | i = be16_to_cpu(port) / RDS_CONG_MAP_PAGE_BITS; | 298 | i = be16_to_cpu(port) / RDS_CONG_MAP_PAGE_BITS; |
300 | off = be16_to_cpu(port) % RDS_CONG_MAP_PAGE_BITS; | 299 | off = be16_to_cpu(port) % RDS_CONG_MAP_PAGE_BITS; |
301 | 300 | ||
302 | generic___clear_le_bit(off, (void *)map->m_page_addrs[i]); | 301 | __clear_bit_le(off, (void *)map->m_page_addrs[i]); |
303 | } | 302 | } |
304 | 303 | ||
305 | static int rds_cong_test_bit(struct rds_cong_map *map, __be16 port) | 304 | static int rds_cong_test_bit(struct rds_cong_map *map, __be16 port) |
@@ -310,7 +309,7 @@ static int rds_cong_test_bit(struct rds_cong_map *map, __be16 port) | |||
310 | i = be16_to_cpu(port) / RDS_CONG_MAP_PAGE_BITS; | 309 | i = be16_to_cpu(port) / RDS_CONG_MAP_PAGE_BITS; |
311 | off = be16_to_cpu(port) % RDS_CONG_MAP_PAGE_BITS; | 310 | off = be16_to_cpu(port) % RDS_CONG_MAP_PAGE_BITS; |
312 | 311 | ||
313 | return generic_test_le_bit(off, (void *)map->m_page_addrs[i]); | 312 | return test_bit_le(off, (void *)map->m_page_addrs[i]); |
314 | } | 313 | } |
315 | 314 | ||
316 | void rds_cong_add_socket(struct rds_sock *rs) | 315 | void rds_cong_add_socket(struct rds_sock *rs) |
diff --git a/net/rds/ib.c b/net/rds/ib.c index 4123967d4d65..cce19f95c624 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c | |||
@@ -364,7 +364,6 @@ void rds_ib_exit(void) | |||
364 | rds_ib_sysctl_exit(); | 364 | rds_ib_sysctl_exit(); |
365 | rds_ib_recv_exit(); | 365 | rds_ib_recv_exit(); |
366 | rds_trans_unregister(&rds_ib_transport); | 366 | rds_trans_unregister(&rds_ib_transport); |
367 | rds_ib_fmr_exit(); | ||
368 | } | 367 | } |
369 | 368 | ||
370 | struct rds_transport rds_ib_transport = { | 369 | struct rds_transport rds_ib_transport = { |
@@ -400,13 +399,9 @@ int rds_ib_init(void) | |||
400 | 399 | ||
401 | INIT_LIST_HEAD(&rds_ib_devices); | 400 | INIT_LIST_HEAD(&rds_ib_devices); |
402 | 401 | ||
403 | ret = rds_ib_fmr_init(); | ||
404 | if (ret) | ||
405 | goto out; | ||
406 | |||
407 | ret = ib_register_client(&rds_ib_client); | 402 | ret = ib_register_client(&rds_ib_client); |
408 | if (ret) | 403 | if (ret) |
409 | goto out_fmr_exit; | 404 | goto out; |
410 | 405 | ||
411 | ret = rds_ib_sysctl_init(); | 406 | ret = rds_ib_sysctl_init(); |
412 | if (ret) | 407 | if (ret) |
@@ -430,8 +425,6 @@ out_sysctl: | |||
430 | rds_ib_sysctl_exit(); | 425 | rds_ib_sysctl_exit(); |
431 | out_ibreg: | 426 | out_ibreg: |
432 | rds_ib_unregister_client(); | 427 | rds_ib_unregister_client(); |
433 | out_fmr_exit: | ||
434 | rds_ib_fmr_exit(); | ||
435 | out: | 428 | out: |
436 | return ret; | 429 | return ret; |
437 | } | 430 | } |
diff --git a/net/rds/ib.h b/net/rds/ib.h index e34ad032b66d..4297d92788dc 100644 --- a/net/rds/ib.h +++ b/net/rds/ib.h | |||
@@ -307,8 +307,6 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents, | |||
307 | void rds_ib_sync_mr(void *trans_private, int dir); | 307 | void rds_ib_sync_mr(void *trans_private, int dir); |
308 | void rds_ib_free_mr(void *trans_private, int invalidate); | 308 | void rds_ib_free_mr(void *trans_private, int invalidate); |
309 | void rds_ib_flush_mrs(void); | 309 | void rds_ib_flush_mrs(void); |
310 | int rds_ib_fmr_init(void); | ||
311 | void rds_ib_fmr_exit(void); | ||
312 | 310 | ||
313 | /* ib_recv.c */ | 311 | /* ib_recv.c */ |
314 | int rds_ib_recv_init(void); | 312 | int rds_ib_recv_init(void); |
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c index 18a833c450c8..819c35a0d9cb 100644 --- a/net/rds/ib_rdma.c +++ b/net/rds/ib_rdma.c | |||
@@ -38,8 +38,6 @@ | |||
38 | #include "ib.h" | 38 | #include "ib.h" |
39 | #include "xlist.h" | 39 | #include "xlist.h" |
40 | 40 | ||
41 | static struct workqueue_struct *rds_ib_fmr_wq; | ||
42 | |||
43 | static DEFINE_PER_CPU(unsigned long, clean_list_grace); | 41 | static DEFINE_PER_CPU(unsigned long, clean_list_grace); |
44 | #define CLEAN_LIST_BUSY_BIT 0 | 42 | #define CLEAN_LIST_BUSY_BIT 0 |
45 | 43 | ||
@@ -307,7 +305,7 @@ static struct rds_ib_mr *rds_ib_alloc_fmr(struct rds_ib_device *rds_ibdev) | |||
307 | int err = 0, iter = 0; | 305 | int err = 0, iter = 0; |
308 | 306 | ||
309 | if (atomic_read(&pool->dirty_count) >= pool->max_items / 10) | 307 | if (atomic_read(&pool->dirty_count) >= pool->max_items / 10) |
310 | queue_delayed_work(rds_ib_fmr_wq, &pool->flush_worker, 10); | 308 | schedule_delayed_work(&pool->flush_worker, 10); |
311 | 309 | ||
312 | while (1) { | 310 | while (1) { |
313 | ibmr = rds_ib_reuse_fmr(pool); | 311 | ibmr = rds_ib_reuse_fmr(pool); |
@@ -696,24 +694,6 @@ out_nolock: | |||
696 | return ret; | 694 | return ret; |
697 | } | 695 | } |
698 | 696 | ||
699 | int rds_ib_fmr_init(void) | ||
700 | { | ||
701 | rds_ib_fmr_wq = create_workqueue("rds_fmr_flushd"); | ||
702 | if (!rds_ib_fmr_wq) | ||
703 | return -ENOMEM; | ||
704 | return 0; | ||
705 | } | ||
706 | |||
707 | /* | ||
708 | * By the time this is called all the IB devices should have been torn down and | ||
709 | * had their pools freed. As each pool is freed its work struct is waited on, | ||
710 | * so the pool flushing work queue should be idle by the time we get here. | ||
711 | */ | ||
712 | void rds_ib_fmr_exit(void) | ||
713 | { | ||
714 | destroy_workqueue(rds_ib_fmr_wq); | ||
715 | } | ||
716 | |||
717 | static void rds_ib_mr_pool_flush_worker(struct work_struct *work) | 697 | static void rds_ib_mr_pool_flush_worker(struct work_struct *work) |
718 | { | 698 | { |
719 | struct rds_ib_mr_pool *pool = container_of(work, struct rds_ib_mr_pool, flush_worker.work); | 699 | struct rds_ib_mr_pool *pool = container_of(work, struct rds_ib_mr_pool, flush_worker.work); |
@@ -741,7 +721,7 @@ void rds_ib_free_mr(void *trans_private, int invalidate) | |||
741 | /* If we've pinned too many pages, request a flush */ | 721 | /* If we've pinned too many pages, request a flush */ |
742 | if (atomic_read(&pool->free_pinned) >= pool->max_free_pinned || | 722 | if (atomic_read(&pool->free_pinned) >= pool->max_free_pinned || |
743 | atomic_read(&pool->dirty_count) >= pool->max_items / 10) | 723 | atomic_read(&pool->dirty_count) >= pool->max_items / 10) |
744 | queue_delayed_work(rds_ib_fmr_wq, &pool->flush_worker, 10); | 724 | schedule_delayed_work(&pool->flush_worker, 10); |
745 | 725 | ||
746 | if (invalidate) { | 726 | if (invalidate) { |
747 | if (likely(!in_interrupt())) { | 727 | if (likely(!in_interrupt())) { |
@@ -749,8 +729,7 @@ void rds_ib_free_mr(void *trans_private, int invalidate) | |||
749 | } else { | 729 | } else { |
750 | /* We get here if the user created a MR marked | 730 | /* We get here if the user created a MR marked |
751 | * as use_once and invalidate at the same time. */ | 731 | * as use_once and invalidate at the same time. */ |
752 | queue_delayed_work(rds_ib_fmr_wq, | 732 | schedule_delayed_work(&pool->flush_worker, 10); |
753 | &pool->flush_worker, 10); | ||
754 | } | 733 | } |
755 | } | 734 | } |
756 | 735 | ||
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index 71f373c421bc..7c4dce8fa5e6 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c | |||
@@ -355,7 +355,7 @@ void rds_ib_send_cq_comp_handler(struct ib_cq *cq, void *context) | |||
355 | * | 355 | * |
356 | * Conceptually, we have two counters: | 356 | * Conceptually, we have two counters: |
357 | * - send credits: this tells us how many WRs we're allowed | 357 | * - send credits: this tells us how many WRs we're allowed |
358 | * to submit without overruning the reciever's queue. For | 358 | * to submit without overruning the receiver's queue. For |
359 | * each SEND WR we post, we decrement this by one. | 359 | * each SEND WR we post, we decrement this by one. |
360 | * | 360 | * |
361 | * - posted credits: this tells us how many WRs we recently | 361 | * - posted credits: this tells us how many WRs we recently |
@@ -551,7 +551,10 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
551 | if (conn->c_loopback | 551 | if (conn->c_loopback |
552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
554 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 554 | scat = &rm->data.op_sg[sg]; |
555 | ret = sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | ||
556 | ret = min_t(int, ret, scat->length - conn->c_xmit_data_off); | ||
557 | return ret; | ||
555 | } | 558 | } |
556 | 559 | ||
557 | /* FIXME we may overallocate here */ | 560 | /* FIXME we may overallocate here */ |
diff --git a/net/rds/iw_cm.c b/net/rds/iw_cm.c index 712cf2d1f28e..3a60a15d1b4a 100644 --- a/net/rds/iw_cm.c +++ b/net/rds/iw_cm.c | |||
@@ -181,7 +181,7 @@ static int rds_iw_init_qp_attrs(struct ib_qp_init_attr *attr, | |||
181 | unsigned int send_size, recv_size; | 181 | unsigned int send_size, recv_size; |
182 | int ret; | 182 | int ret; |
183 | 183 | ||
184 | /* The offset of 1 is to accomodate the additional ACK WR. */ | 184 | /* The offset of 1 is to accommodate the additional ACK WR. */ |
185 | send_size = min_t(unsigned int, rds_iwdev->max_wrs, rds_iw_sysctl_max_send_wr + 1); | 185 | send_size = min_t(unsigned int, rds_iwdev->max_wrs, rds_iw_sysctl_max_send_wr + 1); |
186 | recv_size = min_t(unsigned int, rds_iwdev->max_wrs, rds_iw_sysctl_max_recv_wr + 1); | 186 | recv_size = min_t(unsigned int, rds_iwdev->max_wrs, rds_iw_sysctl_max_recv_wr + 1); |
187 | rds_iw_ring_resize(send_ring, send_size - 1); | 187 | rds_iw_ring_resize(send_ring, send_size - 1); |
diff --git a/net/rds/iw_rdma.c b/net/rds/iw_rdma.c index 59509e9a9e72..6deaa77495e3 100644 --- a/net/rds/iw_rdma.c +++ b/net/rds/iw_rdma.c | |||
@@ -122,7 +122,7 @@ static int rds_iw_get_device(struct rds_sock *rs, struct rds_iw_device **rds_iwd | |||
122 | #else | 122 | #else |
123 | /* FIXME - needs to compare the local and remote | 123 | /* FIXME - needs to compare the local and remote |
124 | * ipaddr/port tuple, but the ipaddr is the only | 124 | * ipaddr/port tuple, but the ipaddr is the only |
125 | * available infomation in the rds_sock (as the rest are | 125 | * available information in the rds_sock (as the rest are |
126 | * zero'ed. It doesn't appear to be properly populated | 126 | * zero'ed. It doesn't appear to be properly populated |
127 | * during connection setup... | 127 | * during connection setup... |
128 | */ | 128 | */ |
diff --git a/net/rds/iw_send.c b/net/rds/iw_send.c index 6280ea020d4e..545d8ee3efb1 100644 --- a/net/rds/iw_send.c +++ b/net/rds/iw_send.c | |||
@@ -307,7 +307,7 @@ void rds_iw_send_cq_comp_handler(struct ib_cq *cq, void *context) | |||
307 | * | 307 | * |
308 | * Conceptually, we have two counters: | 308 | * Conceptually, we have two counters: |
309 | * - send credits: this tells us how many WRs we're allowed | 309 | * - send credits: this tells us how many WRs we're allowed |
310 | * to submit without overruning the reciever's queue. For | 310 | * to submit without overruning the receiver's queue. For |
311 | * each SEND WR we post, we decrement this by one. | 311 | * each SEND WR we post, we decrement this by one. |
312 | * | 312 | * |
313 | * - posted credits: this tells us how many WRs we recently | 313 | * - posted credits: this tells us how many WRs we recently |
diff --git a/net/rds/loop.c b/net/rds/loop.c index aeec1d483b17..bca6761a3ca2 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c | |||
@@ -61,10 +61,15 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
61 | unsigned int hdr_off, unsigned int sg, | 61 | unsigned int hdr_off, unsigned int sg, |
62 | unsigned int off) | 62 | unsigned int off) |
63 | { | 63 | { |
64 | struct scatterlist *sgp = &rm->data.op_sg[sg]; | ||
65 | int ret = sizeof(struct rds_header) + | ||
66 | be32_to_cpu(rm->m_inc.i_hdr.h_len); | ||
67 | |||
64 | /* Do not send cong updates to loopback */ | 68 | /* Do not send cong updates to loopback */ |
65 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 69 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
66 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 70 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
67 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 71 | ret = min_t(int, ret, sgp->length - conn->c_xmit_data_off); |
72 | goto out; | ||
68 | } | 73 | } |
69 | 74 | ||
70 | BUG_ON(hdr_off || sg || off); | 75 | BUG_ON(hdr_off || sg || off); |
@@ -80,8 +85,8 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
80 | NULL); | 85 | NULL); |
81 | 86 | ||
82 | rds_inc_put(&rm->m_inc); | 87 | rds_inc_put(&rm->m_inc); |
83 | 88 | out: | |
84 | return sizeof(struct rds_header) + be32_to_cpu(rm->m_inc.i_hdr.h_len); | 89 | return ret; |
85 | } | 90 | } |
86 | 91 | ||
87 | /* | 92 | /* |
diff --git a/net/rds/rds.h b/net/rds/rds.h index 9542449c0720..da8adac2bf06 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h | |||
@@ -50,7 +50,6 @@ rdsdebug(char *fmt, ...) | |||
50 | #define RDS_FRAG_SIZE ((unsigned int)(1 << RDS_FRAG_SHIFT)) | 50 | #define RDS_FRAG_SIZE ((unsigned int)(1 << RDS_FRAG_SHIFT)) |
51 | 51 | ||
52 | #define RDS_CONG_MAP_BYTES (65536 / 8) | 52 | #define RDS_CONG_MAP_BYTES (65536 / 8) |
53 | #define RDS_CONG_MAP_LONGS (RDS_CONG_MAP_BYTES / sizeof(unsigned long)) | ||
54 | #define RDS_CONG_MAP_PAGES (PAGE_ALIGN(RDS_CONG_MAP_BYTES) / PAGE_SIZE) | 53 | #define RDS_CONG_MAP_PAGES (PAGE_ALIGN(RDS_CONG_MAP_BYTES) / PAGE_SIZE) |
55 | #define RDS_CONG_MAP_PAGE_BITS (PAGE_SIZE * 8) | 54 | #define RDS_CONG_MAP_PAGE_BITS (PAGE_SIZE * 8) |
56 | 55 | ||
diff --git a/net/rds/send.c b/net/rds/send.c index 35b9c2e9caf1..d58ae5f9339e 100644 --- a/net/rds/send.c +++ b/net/rds/send.c | |||
@@ -116,7 +116,7 @@ static void release_in_xmit(struct rds_connection *conn) | |||
116 | } | 116 | } |
117 | 117 | ||
118 | /* | 118 | /* |
119 | * We're making the concious trade-off here to only send one message | 119 | * We're making the conscious trade-off here to only send one message |
120 | * down the connection at a time. | 120 | * down the connection at a time. |
121 | * Pro: | 121 | * Pro: |
122 | * - tx queueing is a simple fifo list | 122 | * - tx queueing is a simple fifo list |