diff options
Diffstat (limited to 'net/rds/iw_cm.c')
-rw-r--r-- | net/rds/iw_cm.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/net/rds/iw_cm.c b/net/rds/iw_cm.c index 57ecb3d4b8a5..a416b0d492b1 100644 --- a/net/rds/iw_cm.c +++ b/net/rds/iw_cm.c | |||
@@ -86,9 +86,7 @@ void rds_iw_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even | |||
86 | err = rds_iw_update_cm_id(rds_iwdev, ic->i_cm_id); | 86 | err = rds_iw_update_cm_id(rds_iwdev, ic->i_cm_id); |
87 | if (err) | 87 | if (err) |
88 | printk(KERN_ERR "rds_iw_update_ipaddr failed (%d)\n", err); | 88 | printk(KERN_ERR "rds_iw_update_ipaddr failed (%d)\n", err); |
89 | err = rds_iw_add_conn(rds_iwdev, conn); | 89 | rds_iw_add_conn(rds_iwdev, conn); |
90 | if (err) | ||
91 | printk(KERN_ERR "rds_iw_add_conn failed (%d)\n", err); | ||
92 | 90 | ||
93 | /* If the peer gave us the last packet it saw, process this as if | 91 | /* If the peer gave us the last packet it saw, process this as if |
94 | * we had received a regular ACK. */ | 92 | * we had received a regular ACK. */ |
@@ -637,19 +635,8 @@ void rds_iw_conn_shutdown(struct rds_connection *conn) | |||
637 | * Move connection back to the nodev list. | 635 | * Move connection back to the nodev list. |
638 | * Remove cm_id from the device cm_id list. | 636 | * Remove cm_id from the device cm_id list. |
639 | */ | 637 | */ |
640 | if (ic->rds_iwdev) { | 638 | if (ic->rds_iwdev) |
641 | 639 | rds_iw_remove_conn(ic->rds_iwdev, conn); | |
642 | spin_lock_irq(&ic->rds_iwdev->spinlock); | ||
643 | BUG_ON(list_empty(&ic->iw_node)); | ||
644 | list_del(&ic->iw_node); | ||
645 | spin_unlock_irq(&ic->rds_iwdev->spinlock); | ||
646 | |||
647 | spin_lock_irq(&iw_nodev_conns_lock); | ||
648 | list_add_tail(&ic->iw_node, &iw_nodev_conns); | ||
649 | spin_unlock_irq(&iw_nodev_conns_lock); | ||
650 | rds_iw_remove_cm_id(ic->rds_iwdev, ic->i_cm_id); | ||
651 | ic->rds_iwdev = NULL; | ||
652 | } | ||
653 | 640 | ||
654 | rdma_destroy_id(ic->i_cm_id); | 641 | rdma_destroy_id(ic->i_cm_id); |
655 | 642 | ||
@@ -672,7 +659,11 @@ void rds_iw_conn_shutdown(struct rds_connection *conn) | |||
672 | 659 | ||
673 | /* Clear the ACK state */ | 660 | /* Clear the ACK state */ |
674 | clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags); | 661 | clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags); |
675 | rds_iw_set_64bit(&ic->i_ack_next, 0); | 662 | #ifdef KERNEL_HAS_ATOMIC64 |
663 | atomic64_set(&ic->i_ack_next, 0); | ||
664 | #else | ||
665 | ic->i_ack_next = 0; | ||
666 | #endif | ||
676 | ic->i_ack_recv = 0; | 667 | ic->i_ack_recv = 0; |
677 | 668 | ||
678 | /* Clear flow control state */ | 669 | /* Clear flow control state */ |
@@ -706,6 +697,9 @@ int rds_iw_conn_alloc(struct rds_connection *conn, gfp_t gfp) | |||
706 | 697 | ||
707 | INIT_LIST_HEAD(&ic->iw_node); | 698 | INIT_LIST_HEAD(&ic->iw_node); |
708 | mutex_init(&ic->i_recv_mutex); | 699 | mutex_init(&ic->i_recv_mutex); |
700 | #ifndef KERNEL_HAS_ATOMIC64 | ||
701 | spin_lock_init(&ic->i_ack_lock); | ||
702 | #endif | ||
709 | 703 | ||
710 | /* | 704 | /* |
711 | * rds_iw_conn_shutdown() waits for these to be emptied so they | 705 | * rds_iw_conn_shutdown() waits for these to be emptied so they |
@@ -726,11 +720,27 @@ int rds_iw_conn_alloc(struct rds_connection *conn, gfp_t gfp) | |||
726 | return 0; | 720 | return 0; |
727 | } | 721 | } |
728 | 722 | ||
723 | /* | ||
724 | * Free a connection. Connection must be shut down and not set for reconnect. | ||
725 | */ | ||
729 | void rds_iw_conn_free(void *arg) | 726 | void rds_iw_conn_free(void *arg) |
730 | { | 727 | { |
731 | struct rds_iw_connection *ic = arg; | 728 | struct rds_iw_connection *ic = arg; |
729 | spinlock_t *lock_ptr; | ||
730 | |||
732 | rdsdebug("ic %p\n", ic); | 731 | rdsdebug("ic %p\n", ic); |
732 | |||
733 | /* | ||
734 | * Conn is either on a dev's list or on the nodev list. | ||
735 | * A race with shutdown() or connect() would cause problems | ||
736 | * (since rds_iwdev would change) but that should never happen. | ||
737 | */ | ||
738 | lock_ptr = ic->rds_iwdev ? &ic->rds_iwdev->spinlock : &iw_nodev_conns_lock; | ||
739 | |||
740 | spin_lock_irq(lock_ptr); | ||
733 | list_del(&ic->iw_node); | 741 | list_del(&ic->iw_node); |
742 | spin_unlock_irq(lock_ptr); | ||
743 | |||
734 | kfree(ic); | 744 | kfree(ic); |
735 | } | 745 | } |
736 | 746 | ||