]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
RDS: Fix congestion issues for loopback
authorAndy Grover <andy.grover@oracle.com>
Wed, 20 Jan 2010 23:01:05 +0000 (15:01 -0800)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 7 Jul 2015 23:41:21 +0000 (16:41 -0700)
We have two kinds of loopback: software (via loop transport)
and hardware (via IB). sw is used for 127.0.0.1, and doesn't
support rdma ops. hw is used for sends to local device IPs,
and supports rdma. Both are used in different cases.

For both of these, when there is a congestion map update, we
want to call rds_cong_map_updated() but not actually send
anything -- since loopback local and foreign congestion maps
point to the same spot, they're already in sync.

The old code never called sw loop's xmit_cong_map(),so
rds_cong_map_updated() wasn't being called for it. sw loop
ports would not work right with the congestion monitor.

Fixing that meant that hw loopback now would send congestion maps
to itself. This is also undesirable (racy), so we check for this
case in the ib-specific xmit code.

Signed-off-by: Andy Grover <andy.grover@oracle.com>
net/rds/cong.c
net/rds/ib_send.c
net/rds/loop.c

index 6d06cac2649cd6bc62cdbb71975612c338185e08..dd2711df640b5e391b91565a79d53babfa3210c2 100644 (file)
@@ -218,8 +218,6 @@ void rds_cong_queue_updates(struct rds_cong_map *map)
        spin_lock_irqsave(&rds_cong_lock, flags);
 
        list_for_each_entry(conn, &map->m_conn_list, c_map_item) {
-               if (conn->c_loopback)
-                       continue;
                if (!test_and_set_bit(0, &conn->c_map_queued)) {
                        rds_stats_inc(s_cong_update_queued);
                        queue_delayed_work(rds_wq, &conn->c_send_w, 0);
index a07d311b8ae39b79ec3e0456c735e3eaf03d996f..da7bd53cdf467fd090d78b9178c669d0dfd385cd 100644 (file)
@@ -482,6 +482,13 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm,
        BUG_ON(off % RDS_FRAG_SIZE);
        BUG_ON(hdr_off != 0 && hdr_off != sizeof(struct rds_header));
 
+       /* Do not send cong updates to IB loopback */
+       if (conn->c_loopback
+           && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) {
+               rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
+               return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;
+       }
+
        /* FIXME we may overallocate here */
        if (be32_to_cpu(rm->m_inc.i_hdr.h_len) == 0)
                i = 1;
index 4a61997f554db1108c69cd619662526d80079f0a..93a45f1ce61fbc5c9c38f7ede19c4ee177397d48 100644 (file)
@@ -80,16 +80,9 @@ static int rds_loop_xmit_cong_map(struct rds_connection *conn,
                                  struct rds_cong_map *map,
                                  unsigned long offset)
 {
-       unsigned long i;
-
        BUG_ON(offset);
        BUG_ON(map != conn->c_lcong);
 
-       for (i = 0; i < RDS_CONG_MAP_PAGES; i++) {
-               memcpy((void *)conn->c_fcong->m_page_addrs[i],
-                      (void *)map->m_page_addrs[i], PAGE_SIZE);
-       }
-
        rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
 
        return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;