From: Ami Perlmutter Date: Wed, 25 Apr 2007 14:19:07 +0000 (+0300) Subject: IB/sdp: prevent removal of ib device before cleanup X-Git-Tag: v4.1.12-92~264^2~5^2~355 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=4466dede8eddc1471f72844423c0df1275a062f4;p=users%2Fjedix%2Flinux-maple.git IB/sdp: prevent removal of ib device before cleanup Should cleanup all related resources (bugzzila num. 579) Signed-off-by: Ami Perlmutter --- diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index f6cca6fa02263..be947f6ada515 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -124,6 +124,8 @@ static spinlock_t sock_list_lock; extern atomic_t current_mem_usage; +DEFINE_RWLOCK(device_removal_lock); + inline void sdp_add_sock(struct sdp_sock *ssk) { spin_lock_irq(&sock_list_lock); @@ -224,6 +226,8 @@ void sdp_reset_sk(struct sock *sk, int rc) sdp_dbg(sk, "%s\n", __func__); + read_lock(&device_removal_lock); + if (ssk->cq) sdp_poll_cq(ssk, ssk->cq); @@ -240,6 +244,8 @@ void sdp_reset_sk(struct sock *sk, int rc) } sk->sk_state_change(sk); + + read_unlock(&device_removal_lock); } /* Like tcp_reset */ @@ -1863,12 +1869,28 @@ static void sdp_proc_unregister(void) } #endif /* CONFIG_PROC_FS */ +static void sdp_add_device(struct ib_device *device) +{ +} + +static void sdp_remove_device(struct ib_device *device) +{ + write_lock(&device_removal_lock); + write_unlock(&device_removal_lock); +} + static struct net_proto_family sdp_net_proto = { .family = AF_INET_SDP, .create = sdp_create_socket, .owner = THIS_MODULE, }; +struct ib_client sdp_client = { + .name = "sdp", + .add = sdp_add_device, + .remove = sdp_remove_device +}; + static int __init sdp_init(void) { int rc; @@ -1900,6 +1922,8 @@ static int __init sdp_init(void) atomic_set(¤t_mem_usage, 0); + ib_register_client(&sdp_client); + return 0; } @@ -1921,6 +1945,8 @@ static void __exit sdp_exit(void) atomic_read(¤t_mem_usage)); sdp_proc_unregister(); + + ib_unregister_client(&sdp_client); } module_init(sdp_init);