diff options
Diffstat (limited to 'net/rds/ib_cm.c')
-rw-r--r-- | net/rds/ib_cm.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c index 0532237bd128..f8e40e1a6038 100644 --- a/net/rds/ib_cm.c +++ b/net/rds/ib_cm.c | |||
@@ -126,9 +126,7 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even | |||
126 | err = rds_ib_update_ipaddr(rds_ibdev, conn->c_laddr); | 126 | err = rds_ib_update_ipaddr(rds_ibdev, conn->c_laddr); |
127 | if (err) | 127 | if (err) |
128 | printk(KERN_ERR "rds_ib_update_ipaddr failed (%d)\n", err); | 128 | printk(KERN_ERR "rds_ib_update_ipaddr failed (%d)\n", err); |
129 | err = rds_ib_add_conn(rds_ibdev, conn); | 129 | rds_ib_add_conn(rds_ibdev, conn); |
130 | if (err) | ||
131 | printk(KERN_ERR "rds_ib_add_conn failed (%d)\n", err); | ||
132 | 130 | ||
133 | /* If the peer gave us the last packet it saw, process this as if | 131 | /* If the peer gave us the last packet it saw, process this as if |
134 | * we had received a regular ACK. */ | 132 | * we had received a regular ACK. */ |
@@ -616,18 +614,8 @@ void rds_ib_conn_shutdown(struct rds_connection *conn) | |||
616 | /* | 614 | /* |
617 | * Move connection back to the nodev list. | 615 | * Move connection back to the nodev list. |
618 | */ | 616 | */ |
619 | if (ic->rds_ibdev) { | 617 | if (ic->rds_ibdev) |
620 | 618 | rds_ib_remove_conn(ic->rds_ibdev, conn); | |
621 | spin_lock_irq(&ic->rds_ibdev->spinlock); | ||
622 | BUG_ON(list_empty(&ic->ib_node)); | ||
623 | list_del(&ic->ib_node); | ||
624 | spin_unlock_irq(&ic->rds_ibdev->spinlock); | ||
625 | |||
626 | spin_lock_irq(&ib_nodev_conns_lock); | ||
627 | list_add_tail(&ic->ib_node, &ib_nodev_conns); | ||
628 | spin_unlock_irq(&ib_nodev_conns_lock); | ||
629 | ic->rds_ibdev = NULL; | ||
630 | } | ||
631 | 619 | ||
632 | ic->i_cm_id = NULL; | 620 | ic->i_cm_id = NULL; |
633 | ic->i_pd = NULL; | 621 | ic->i_pd = NULL; |
@@ -648,7 +636,11 @@ void rds_ib_conn_shutdown(struct rds_connection *conn) | |||
648 | 636 | ||
649 | /* Clear the ACK state */ | 637 | /* Clear the ACK state */ |
650 | clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags); | 638 | clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags); |
651 | rds_ib_set_64bit(&ic->i_ack_next, 0); | 639 | #ifdef KERNEL_HAS_ATOMIC64 |
640 | atomic64_set(&ic->i_ack_next, 0); | ||
641 | #else | ||
642 | ic->i_ack_next = 0; | ||
643 | #endif | ||
652 | ic->i_ack_recv = 0; | 644 | ic->i_ack_recv = 0; |
653 | 645 | ||
654 | /* Clear flow control state */ | 646 | /* Clear flow control state */ |
@@ -681,6 +673,9 @@ int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp) | |||
681 | 673 | ||
682 | INIT_LIST_HEAD(&ic->ib_node); | 674 | INIT_LIST_HEAD(&ic->ib_node); |
683 | mutex_init(&ic->i_recv_mutex); | 675 | mutex_init(&ic->i_recv_mutex); |
676 | #ifndef KERNEL_HAS_ATOMIC64 | ||
677 | spin_lock_init(&ic->i_ack_lock); | ||
678 | #endif | ||
684 | 679 | ||
685 | /* | 680 | /* |
686 | * rds_ib_conn_shutdown() waits for these to be emptied so they | 681 | * rds_ib_conn_shutdown() waits for these to be emptied so they |
@@ -701,11 +696,27 @@ int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp) | |||
701 | return 0; | 696 | return 0; |
702 | } | 697 | } |
703 | 698 | ||
699 | /* | ||
700 | * Free a connection. Connection must be shut down and not set for reconnect. | ||
701 | */ | ||
704 | void rds_ib_conn_free(void *arg) | 702 | void rds_ib_conn_free(void *arg) |
705 | { | 703 | { |
706 | struct rds_ib_connection *ic = arg; | 704 | struct rds_ib_connection *ic = arg; |
705 | spinlock_t *lock_ptr; | ||
706 | |||
707 | rdsdebug("ic %p\n", ic); | 707 | rdsdebug("ic %p\n", ic); |
708 | |||
709 | /* | ||
710 | * Conn is either on a dev's list or on the nodev list. | ||
711 | * A race with shutdown() or connect() would cause problems | ||
712 | * (since rds_ibdev would change) but that should never happen. | ||
713 | */ | ||
714 | lock_ptr = ic->rds_ibdev ? &ic->rds_ibdev->spinlock : &ib_nodev_conns_lock; | ||
715 | |||
716 | spin_lock_irq(lock_ptr); | ||
708 | list_del(&ic->ib_node); | 717 | list_del(&ic->ib_node); |
718 | spin_unlock_irq(lock_ptr); | ||
719 | |||
709 | kfree(ic); | 720 | kfree(ic); |
710 | } | 721 | } |
711 | 722 | ||