@@ -222,7 +222,6 @@ struct cm_id_private {
222
222
/* todo: use alternate port on send failure */
223
223
struct cm_av av ;
224
224
struct cm_av alt_av ;
225
- struct ib_cm_compare_data * compare_data ;
226
225
227
226
void * private_data ;
228
227
__be64 tid ;
@@ -443,40 +442,6 @@ static struct cm_id_private * cm_acquire_id(__be32 local_id, __be32 remote_id)
443
442
return cm_id_priv ;
444
443
}
445
444
446
- static void cm_mask_copy (u32 * dst , const u32 * src , const u32 * mask )
447
- {
448
- int i ;
449
-
450
- for (i = 0 ; i < IB_CM_COMPARE_SIZE ; i ++ )
451
- dst [i ] = src [i ] & mask [i ];
452
- }
453
-
454
- static int cm_compare_data (struct ib_cm_compare_data * src_data ,
455
- struct ib_cm_compare_data * dst_data )
456
- {
457
- u32 src [IB_CM_COMPARE_SIZE ];
458
- u32 dst [IB_CM_COMPARE_SIZE ];
459
-
460
- if (!src_data || !dst_data )
461
- return 0 ;
462
-
463
- cm_mask_copy (src , src_data -> data , dst_data -> mask );
464
- cm_mask_copy (dst , dst_data -> data , src_data -> mask );
465
- return memcmp (src , dst , sizeof (src ));
466
- }
467
-
468
- static int cm_compare_private_data (u32 * private_data ,
469
- struct ib_cm_compare_data * dst_data )
470
- {
471
- u32 src [IB_CM_COMPARE_SIZE ];
472
-
473
- if (!dst_data )
474
- return 0 ;
475
-
476
- cm_mask_copy (src , private_data , dst_data -> mask );
477
- return memcmp (src , dst_data -> data , sizeof (src ));
478
- }
479
-
480
445
/*
481
446
* Trivial helpers to strip endian annotation and compare; the
482
447
* endianness doesn't actually matter since we just need a stable
@@ -509,18 +474,14 @@ static struct cm_id_private * cm_insert_listen(struct cm_id_private *cm_id_priv)
509
474
struct cm_id_private * cur_cm_id_priv ;
510
475
__be64 service_id = cm_id_priv -> id .service_id ;
511
476
__be64 service_mask = cm_id_priv -> id .service_mask ;
512
- int data_cmp ;
513
477
514
478
while (* link ) {
515
479
parent = * link ;
516
480
cur_cm_id_priv = rb_entry (parent , struct cm_id_private ,
517
481
service_node );
518
- data_cmp = cm_compare_data (cm_id_priv -> compare_data ,
519
- cur_cm_id_priv -> compare_data );
520
482
if ((cur_cm_id_priv -> id .service_mask & service_id ) ==
521
483
(service_mask & cur_cm_id_priv -> id .service_id ) &&
522
- (cm_id_priv -> id .device == cur_cm_id_priv -> id .device ) &&
523
- !data_cmp )
484
+ (cm_id_priv -> id .device == cur_cm_id_priv -> id .device ))
524
485
return cur_cm_id_priv ;
525
486
526
487
if (cm_id_priv -> id .device < cur_cm_id_priv -> id .device )
@@ -531,8 +492,6 @@ static struct cm_id_private * cm_insert_listen(struct cm_id_private *cm_id_priv)
531
492
link = & (* link )-> rb_left ;
532
493
else if (be64_gt (service_id , cur_cm_id_priv -> id .service_id ))
533
494
link = & (* link )-> rb_right ;
534
- else if (data_cmp < 0 )
535
- link = & (* link )-> rb_left ;
536
495
else
537
496
link = & (* link )-> rb_right ;
538
497
}
@@ -542,20 +501,16 @@ static struct cm_id_private * cm_insert_listen(struct cm_id_private *cm_id_priv)
542
501
}
543
502
544
503
static struct cm_id_private * cm_find_listen (struct ib_device * device ,
545
- __be64 service_id ,
546
- u32 * private_data )
504
+ __be64 service_id )
547
505
{
548
506
struct rb_node * node = cm .listen_service_table .rb_node ;
549
507
struct cm_id_private * cm_id_priv ;
550
- int data_cmp ;
551
508
552
509
while (node ) {
553
510
cm_id_priv = rb_entry (node , struct cm_id_private , service_node );
554
- data_cmp = cm_compare_private_data (private_data ,
555
- cm_id_priv -> compare_data );
556
511
if ((cm_id_priv -> id .service_mask & service_id ) ==
557
512
cm_id_priv -> id .service_id &&
558
- (cm_id_priv -> id .device == device ) && ! data_cmp )
513
+ (cm_id_priv -> id .device == device ))
559
514
return cm_id_priv ;
560
515
561
516
if (device < cm_id_priv -> id .device )
@@ -566,8 +521,6 @@ static struct cm_id_private * cm_find_listen(struct ib_device *device,
566
521
node = node -> rb_left ;
567
522
else if (be64_gt (service_id , cm_id_priv -> id .service_id ))
568
523
node = node -> rb_right ;
569
- else if (data_cmp < 0 )
570
- node = node -> rb_left ;
571
524
else
572
525
node = node -> rb_right ;
573
526
}
@@ -939,7 +892,6 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err)
939
892
wait_for_completion (& cm_id_priv -> comp );
940
893
while ((work = cm_dequeue_work (cm_id_priv )) != NULL )
941
894
cm_free_work (work );
942
- kfree (cm_id_priv -> compare_data );
943
895
kfree (cm_id_priv -> private_data );
944
896
kfree (cm_id_priv );
945
897
}
@@ -962,20 +914,11 @@ EXPORT_SYMBOL(ib_destroy_cm_id);
962
914
* range of service IDs. If set to 0, the service ID is matched
963
915
* exactly. This parameter is ignored if %service_id is set to
964
916
* IB_CM_ASSIGN_SERVICE_ID.
965
- * @compare_data: This parameter is optional. It specifies data that must
966
- * appear in the private data of a connection request for the specified
967
- * listen request.
968
- * @lock: If set, lock the cm.lock spin-lock when adding the id to the
969
- * listener tree. When false, the caller must already hold the spin-lock,
970
- * and compare_data must be NULL.
971
917
*/
972
918
static int __ib_cm_listen (struct ib_cm_id * cm_id , __be64 service_id ,
973
- __be64 service_mask ,
974
- struct ib_cm_compare_data * compare_data ,
975
- bool lock )
919
+ __be64 service_mask )
976
920
{
977
921
struct cm_id_private * cm_id_priv , * cur_cm_id_priv ;
978
- unsigned long flags = 0 ;
979
922
int ret = 0 ;
980
923
981
924
service_mask = service_mask ? service_mask : ~cpu_to_be64 (0 );
@@ -988,22 +931,9 @@ static int __ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id,
988
931
if (cm_id -> state != IB_CM_IDLE )
989
932
return - EINVAL ;
990
933
991
- if (compare_data ) {
992
- cm_id_priv -> compare_data = kzalloc (sizeof * compare_data ,
993
- GFP_KERNEL );
994
- if (!cm_id_priv -> compare_data )
995
- return - ENOMEM ;
996
- cm_mask_copy (cm_id_priv -> compare_data -> data ,
997
- compare_data -> data , compare_data -> mask );
998
- memcpy (cm_id_priv -> compare_data -> mask , compare_data -> mask ,
999
- sizeof (compare_data -> mask ));
1000
- }
1001
-
1002
934
cm_id -> state = IB_CM_LISTEN ;
1003
- if (lock )
1004
- spin_lock_irqsave (& cm .lock , flags );
1005
-
1006
935
++ cm_id_priv -> listen_sharecount ;
936
+
1007
937
if (service_id == IB_CM_ASSIGN_SERVICE_ID ) {
1008
938
cm_id -> service_id = cpu_to_be64 (cm .listen_service_id ++ );
1009
939
cm_id -> service_mask = ~cpu_to_be64 (0 );
@@ -1016,22 +946,21 @@ static int __ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id,
1016
946
if (cur_cm_id_priv ) {
1017
947
cm_id -> state = IB_CM_IDLE ;
1018
948
-- cm_id_priv -> listen_sharecount ;
1019
- kfree (cm_id_priv -> compare_data );
1020
- cm_id_priv -> compare_data = NULL ;
1021
949
ret = - EBUSY ;
1022
950
}
1023
-
1024
- if (lock )
1025
- spin_unlock_irqrestore (& cm .lock , flags );
1026
-
1027
951
return ret ;
1028
952
}
1029
953
1030
- int ib_cm_listen (struct ib_cm_id * cm_id , __be64 service_id , __be64 service_mask ,
1031
- struct ib_cm_compare_data * compare_data )
954
+ int ib_cm_listen (struct ib_cm_id * cm_id , __be64 service_id , __be64 service_mask )
1032
955
{
1033
- return __ib_cm_listen (cm_id , service_id , service_mask , compare_data ,
1034
- true);
956
+ unsigned long flags ;
957
+ int ret ;
958
+
959
+ spin_lock_irqsave (& cm .lock , flags );
960
+ ret = __ib_cm_listen (cm_id , service_id , service_mask );
961
+ spin_unlock_irqrestore (& cm .lock , flags );
962
+
963
+ return ret ;
1035
964
}
1036
965
EXPORT_SYMBOL (ib_cm_listen );
1037
966
@@ -1071,7 +1000,7 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,
1071
1000
goto new_id ;
1072
1001
1073
1002
/* Find an existing ID */
1074
- cm_id_priv = cm_find_listen (device , service_id , NULL );
1003
+ cm_id_priv = cm_find_listen (device , service_id );
1075
1004
if (cm_id_priv ) {
1076
1005
if (cm_id -> cm_handler != cm_handler || cm_id -> context ) {
1077
1006
/* Sharing an ib_cm_id with different handlers is not
@@ -1090,7 +1019,7 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,
1090
1019
1091
1020
new_id :
1092
1021
/* Use newly created ID */
1093
- err = __ib_cm_listen (cm_id , service_id , 0 , NULL , false );
1022
+ err = __ib_cm_listen (cm_id , service_id , 0 );
1094
1023
1095
1024
spin_unlock_irqrestore (& cm .lock , flags );
1096
1025
@@ -1615,8 +1544,7 @@ static struct cm_id_private * cm_match_req(struct cm_work *work,
1615
1544
1616
1545
/* Find matching listen request. */
1617
1546
listen_cm_id_priv = cm_find_listen (cm_id_priv -> id .device ,
1618
- req_msg -> service_id ,
1619
- req_msg -> private_data );
1547
+ req_msg -> service_id );
1620
1548
if (!listen_cm_id_priv ) {
1621
1549
cm_cleanup_timewait (cm_id_priv -> timewait_info );
1622
1550
spin_unlock_irq (& cm .lock );
@@ -3164,8 +3092,7 @@ static int cm_sidr_req_handler(struct cm_work *work)
3164
3092
}
3165
3093
cm_id_priv -> id .state = IB_CM_SIDR_REQ_RCVD ;
3166
3094
cur_cm_id_priv = cm_find_listen (cm_id -> device ,
3167
- sidr_req_msg -> service_id ,
3168
- sidr_req_msg -> private_data );
3095
+ sidr_req_msg -> service_id );
3169
3096
if (!cur_cm_id_priv ) {
3170
3097
spin_unlock_irq (& cm .lock );
3171
3098
cm_reject_sidr_req (cm_id_priv , IB_SIDR_UNSUPPORTED );
0 commit comments