@@ -2993,6 +2993,70 @@ static int add_adev(struct gdma_dev *gd, const char *name)
29932993 return ret ;
29942994}
29952995
2996+ static void mana_rdma_service_handle (struct work_struct * work )
2997+ {
2998+ struct mana_service_work * serv_work =
2999+ container_of (work , struct mana_service_work , work );
3000+ struct gdma_dev * gd = serv_work -> gdma_dev ;
3001+ struct device * dev = gd -> gdma_context -> dev ;
3002+ int ret ;
3003+
3004+ if (READ_ONCE (gd -> rdma_teardown ))
3005+ goto out ;
3006+
3007+ switch (serv_work -> event ) {
3008+ case GDMA_SERVICE_TYPE_RDMA_SUSPEND :
3009+ if (!gd -> adev || gd -> is_suspended )
3010+ break ;
3011+
3012+ remove_adev (gd );
3013+ gd -> is_suspended = true;
3014+ break ;
3015+
3016+ case GDMA_SERVICE_TYPE_RDMA_RESUME :
3017+ if (!gd -> is_suspended )
3018+ break ;
3019+
3020+ ret = add_adev (gd , "rdma" );
3021+ if (ret )
3022+ dev_err (dev , "Failed to add adev on resume: %d\n" , ret );
3023+ else
3024+ gd -> is_suspended = false;
3025+ break ;
3026+
3027+ default :
3028+ dev_warn (dev , "unknown adev service event %u\n" ,
3029+ serv_work -> event );
3030+ break ;
3031+ }
3032+
3033+ out :
3034+ kfree (serv_work );
3035+ }
3036+
3037+ int mana_rdma_service_event (struct gdma_context * gc , enum gdma_service_type event )
3038+ {
3039+ struct gdma_dev * gd = & gc -> mana_ib ;
3040+ struct mana_service_work * serv_work ;
3041+
3042+ if (gd -> dev_id .type != GDMA_DEVICE_MANA_IB ) {
3043+ /* RDMA device is not detected on pci */
3044+ return 0 ;
3045+ }
3046+
3047+ serv_work = kzalloc (sizeof (* serv_work ), GFP_ATOMIC );
3048+ if (!serv_work )
3049+ return - ENOMEM ;
3050+
3051+ serv_work -> event = event ;
3052+ serv_work -> gdma_dev = gd ;
3053+
3054+ INIT_WORK (& serv_work -> work , mana_rdma_service_handle );
3055+ queue_work (gc -> service_wq , & serv_work -> work );
3056+
3057+ return 0 ;
3058+ }
3059+
29963060int mana_probe (struct gdma_dev * gd , bool resuming )
29973061{
29983062 struct gdma_context * gc = gd -> gdma_context ;
@@ -3173,11 +3237,16 @@ int mana_rdma_probe(struct gdma_dev *gd)
31733237
31743238void mana_rdma_remove (struct gdma_dev * gd )
31753239{
3240+ struct gdma_context * gc = gd -> gdma_context ;
3241+
31763242 if (gd -> dev_id .type != GDMA_DEVICE_MANA_IB ) {
31773243 /* RDMA device is not detected on pci */
31783244 return ;
31793245 }
31803246
3247+ WRITE_ONCE (gd -> rdma_teardown , true);
3248+ flush_workqueue (gc -> service_wq );
3249+
31813250 if (gd -> adev )
31823251 remove_adev (gd );
31833252
0 commit comments