Lines Matching refs:ldev
29 static void smc_lo_generate_ids(struct smc_lo_dev *ldev) in smc_lo_generate_ids() argument
31 struct smcd_gid *lgid = &ldev->local_gid; in smc_lo_generate_ids()
39 ldev->chid = SMC_LO_RESERVED_CHID; in smc_lo_generate_ids()
45 struct smc_lo_dev *ldev = smcd->priv; in smc_lo_query_rgid() local
48 if (!ldev || rgid->gid != ldev->local_gid.gid || in smc_lo_query_rgid()
49 rgid->gid_ext != ldev->local_gid.gid_ext) in smc_lo_query_rgid()
58 struct smc_lo_dev *ldev = smcd->priv; in smc_lo_register_dmb() local
62 for_each_clear_bit(sba_idx, ldev->sba_idx_mask, SMC_LO_MAX_DMBS) { in smc_lo_register_dmb()
63 if (!test_and_set_bit(sba_idx, ldev->sba_idx_mask)) in smc_lo_register_dmb()
90 write_lock_bh(&ldev->dmb_ht_lock); in smc_lo_register_dmb()
91 hash_for_each_possible(ldev->dmb_ht, tmp_node, list, dmb_node->token) { in smc_lo_register_dmb()
93 write_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_register_dmb()
97 hash_add(ldev->dmb_ht, &dmb_node->list, dmb_node->token); in smc_lo_register_dmb()
98 write_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_register_dmb()
99 atomic_inc(&ldev->dmb_cnt); in smc_lo_register_dmb()
112 clear_bit(sba_idx, ldev->sba_idx_mask); in smc_lo_register_dmb()
116 static void __smc_lo_unregister_dmb(struct smc_lo_dev *ldev, in __smc_lo_unregister_dmb() argument
120 write_lock_bh(&ldev->dmb_ht_lock); in __smc_lo_unregister_dmb()
122 write_unlock_bh(&ldev->dmb_ht_lock); in __smc_lo_unregister_dmb()
124 clear_bit(dmb_node->sba_idx, ldev->sba_idx_mask); in __smc_lo_unregister_dmb()
128 if (atomic_dec_and_test(&ldev->dmb_cnt)) in __smc_lo_unregister_dmb()
129 wake_up(&ldev->ldev_release); in __smc_lo_unregister_dmb()
135 struct smc_lo_dev *ldev = smcd->priv; in smc_lo_unregister_dmb() local
138 read_lock_bh(&ldev->dmb_ht_lock); in smc_lo_unregister_dmb()
139 hash_for_each_possible(ldev->dmb_ht, tmp_node, list, dmb->dmb_tok) { in smc_lo_unregister_dmb()
146 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_unregister_dmb()
149 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_unregister_dmb()
152 __smc_lo_unregister_dmb(ldev, dmb_node); in smc_lo_unregister_dmb()
164 struct smc_lo_dev *ldev = smcd->priv; in smc_lo_attach_dmb() local
167 read_lock_bh(&ldev->dmb_ht_lock); in smc_lo_attach_dmb()
168 hash_for_each_possible(ldev->dmb_ht, tmp_node, list, dmb->dmb_tok) { in smc_lo_attach_dmb()
175 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_attach_dmb()
178 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_attach_dmb()
198 struct smc_lo_dev *ldev = smcd->priv; in smc_lo_detach_dmb() local
201 read_lock_bh(&ldev->dmb_ht_lock); in smc_lo_detach_dmb()
202 hash_for_each_possible(ldev->dmb_ht, tmp_node, list, token) { in smc_lo_detach_dmb()
209 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_detach_dmb()
212 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_detach_dmb()
215 __smc_lo_unregister_dmb(ldev, dmb_node); in smc_lo_detach_dmb()
224 struct smc_lo_dev *ldev = smcd->priv; in smc_lo_move_data() local
233 read_lock_bh(&ldev->dmb_ht_lock); in smc_lo_move_data()
234 hash_for_each_possible(ldev->dmb_ht, tmp_node, list, dmb_tok) { in smc_lo_move_data()
241 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_move_data()
245 read_unlock_bh(&ldev->dmb_ht_lock); in smc_lo_move_data()
262 struct smc_lo_dev *ldev = smcd->priv; in smc_lo_get_local_gid() local
264 smcd_gid->gid = ldev->local_gid.gid; in smc_lo_get_local_gid()
265 smcd_gid->gid_ext = ldev->local_gid.gid_ext; in smc_lo_get_local_gid()
325 static int smcd_lo_register_dev(struct smc_lo_dev *ldev) in smcd_lo_register_dev() argument
332 ldev->smcd = smcd; in smcd_lo_register_dev()
333 smcd->priv = ldev; in smcd_lo_register_dev()
339 dev_name(&ldev->dev)); in smcd_lo_register_dev()
343 static void smcd_lo_unregister_dev(struct smc_lo_dev *ldev) in smcd_lo_unregister_dev() argument
345 struct smcd_dev *smcd = ldev->smcd; in smcd_lo_unregister_dev()
348 dev_name(&ldev->dev)); in smcd_lo_unregister_dev()
358 static int smc_lo_dev_init(struct smc_lo_dev *ldev) in smc_lo_dev_init() argument
360 smc_lo_generate_ids(ldev); in smc_lo_dev_init()
361 rwlock_init(&ldev->dmb_ht_lock); in smc_lo_dev_init()
362 hash_init(ldev->dmb_ht); in smc_lo_dev_init()
363 atomic_set(&ldev->dmb_cnt, 0); in smc_lo_dev_init()
364 init_waitqueue_head(&ldev->ldev_release); in smc_lo_dev_init()
366 return smcd_lo_register_dev(ldev); in smc_lo_dev_init()
369 static void smc_lo_dev_exit(struct smc_lo_dev *ldev) in smc_lo_dev_exit() argument
371 smcd_lo_unregister_dev(ldev); in smc_lo_dev_exit()
372 if (atomic_read(&ldev->dmb_cnt)) in smc_lo_dev_exit()
373 wait_event(ldev->ldev_release, !atomic_read(&ldev->dmb_cnt)); in smc_lo_dev_exit()
378 struct smc_lo_dev *ldev = in smc_lo_dev_release() local
381 kfree(ldev); in smc_lo_dev_release()
386 struct smc_lo_dev *ldev; in smc_lo_dev_probe() local
389 ldev = kzalloc(sizeof(*ldev), GFP_KERNEL); in smc_lo_dev_probe()
390 if (!ldev) in smc_lo_dev_probe()
393 ldev->dev.parent = NULL; in smc_lo_dev_probe()
394 ldev->dev.release = smc_lo_dev_release; in smc_lo_dev_probe()
395 device_initialize(&ldev->dev); in smc_lo_dev_probe()
396 dev_set_name(&ldev->dev, smc_lo_dev_name); in smc_lo_dev_probe()
398 ret = smc_lo_dev_init(ldev); in smc_lo_dev_probe()
402 lo_dev = ldev; /* global loopback device */ in smc_lo_dev_probe()
406 put_device(&ldev->dev); in smc_lo_dev_probe()