@@ -119,8 +119,6 @@ mlx5_ib_create_mkey_cb(struct mlx5_ib_dev *dev,
119119 create_mkey_callback , context );
120120}
121121
122- static void clean_mr (struct mlx5_ib_dev * dev , struct mlx5_ib_mr * mr );
123- static void dereg_mr (struct mlx5_ib_dev * dev , struct mlx5_ib_mr * mr );
124122static int mr_cache_max_order (struct mlx5_ib_dev * dev );
125123static void queue_adjust_cache_locked (struct mlx5_cache_ent * ent );
126124
@@ -627,30 +625,10 @@ static struct mlx5_ib_mr *get_cache_mr(struct mlx5_cache_ent *req_ent)
627625 return NULL ;
628626}
629627
630- static void detach_mr_from_cache ( struct mlx5_ib_mr * mr )
628+ static void mlx5_mr_cache_free ( struct mlx5_ib_dev * dev , struct mlx5_ib_mr * mr )
631629{
632630 struct mlx5_cache_ent * ent = mr -> cache_ent ;
633631
634- mr -> cache_ent = NULL ;
635- spin_lock_irq (& ent -> lock );
636- ent -> total_mrs -- ;
637- spin_unlock_irq (& ent -> lock );
638- }
639-
640- void mlx5_mr_cache_free (struct mlx5_ib_dev * dev , struct mlx5_ib_mr * mr )
641- {
642- struct mlx5_cache_ent * ent = mr -> cache_ent ;
643-
644- if (!ent )
645- return ;
646-
647- if (mlx5_mr_cache_invalidate (mr )) {
648- detach_mr_from_cache (mr );
649- destroy_mkey (dev , mr );
650- kfree (mr );
651- return ;
652- }
653-
654632 spin_lock_irq (& ent -> lock );
655633 list_add_tail (& mr -> list , & ent -> head );
656634 ent -> available_mrs ++ ;
@@ -1503,7 +1481,7 @@ static struct ib_mr *create_real_mr(struct ib_pd *pd, struct ib_umem *umem,
15031481 */
15041482 err = mlx5_ib_update_mr_pas (mr , MLX5_IB_UPD_XLT_ENABLE );
15051483 if (err ) {
1506- dereg_mr ( dev , mr );
1484+ mlx5_ib_dereg_mr ( & mr -> ibmr , NULL );
15071485 return ERR_PTR (err );
15081486 }
15091487 }
@@ -1560,7 +1538,7 @@ static struct ib_mr *create_user_odp_mr(struct ib_pd *pd, u64 start, u64 length,
15601538 return & mr -> ibmr ;
15611539
15621540err_dereg_mr :
1563- dereg_mr ( dev , mr );
1541+ mlx5_ib_dereg_mr ( & mr -> ibmr , NULL );
15641542 return ERR_PTR (err );
15651543}
15661544
@@ -1657,7 +1635,7 @@ struct ib_mr *mlx5_ib_reg_user_mr_dmabuf(struct ib_pd *pd, u64 offset,
16571635 return & mr -> ibmr ;
16581636
16591637err_dereg_mr :
1660- dereg_mr ( dev , mr );
1638+ mlx5_ib_dereg_mr ( & mr -> ibmr , NULL );
16611639 return ERR_PTR (err );
16621640}
16631641
@@ -1669,7 +1647,7 @@ struct ib_mr *mlx5_ib_reg_user_mr_dmabuf(struct ib_pd *pd, u64 offset,
16691647 * and any DMA inprogress will be completed. Failure of this function
16701648 * indicates the HW has failed catastrophically.
16711649 */
1672- int mlx5_mr_cache_invalidate (struct mlx5_ib_mr * mr )
1650+ static int mlx5_mr_cache_invalidate (struct mlx5_ib_mr * mr )
16731651{
16741652 struct mlx5_umr_wr umrwr = {};
16751653
@@ -1941,69 +1919,82 @@ mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
19411919 }
19421920}
19431921
1944- static void clean_mr (struct mlx5_ib_dev * dev , struct mlx5_ib_mr * mr )
1922+ int mlx5_ib_dereg_mr (struct ib_mr * ibmr , struct ib_udata * udata )
19451923{
1946- if (mr -> ibmr .type == IB_MR_TYPE_INTEGRITY ) {
1924+ struct mlx5_ib_mr * mr = to_mmr (ibmr );
1925+ struct mlx5_ib_dev * dev = to_mdev (ibmr -> device );
1926+ int rc ;
1927+
1928+ /*
1929+ * Any async use of the mr must hold the refcount, once the refcount
1930+ * goes to zero no other thread, such as ODP page faults, prefetch, any
1931+ * UMR activity, etc can touch the mkey. Thus it is safe to destroy it.
1932+ */
1933+ if (IS_ENABLED (CONFIG_INFINIBAND_ON_DEMAND_PAGING ) &&
1934+ refcount_read (& mr -> mmkey .usecount ) != 0 &&
1935+ xa_erase (& mr_to_mdev (mr )-> odp_mkeys , mlx5_base_mkey (mr -> mmkey .key )))
1936+ mlx5r_deref_wait_odp_mkey (& mr -> mmkey );
1937+
1938+ if (ibmr -> type == IB_MR_TYPE_INTEGRITY ) {
1939+ xa_cmpxchg (& dev -> sig_mrs , mlx5_base_mkey (mr -> mmkey .key ), ibmr ,
1940+ NULL , GFP_KERNEL );
1941+
1942+ if (mr -> mtt_mr ) {
1943+ rc = mlx5_ib_dereg_mr (& mr -> mtt_mr -> ibmr , NULL );
1944+ if (rc )
1945+ return rc ;
1946+ mr -> mtt_mr = NULL ;
1947+ }
1948+ if (mr -> klm_mr ) {
1949+ mlx5_ib_dereg_mr (& mr -> klm_mr -> ibmr , NULL );
1950+ if (rc )
1951+ return rc ;
1952+ mr -> klm_mr = NULL ;
1953+ }
1954+
19471955 if (mlx5_core_destroy_psv (dev -> mdev ,
19481956 mr -> sig -> psv_memory .psv_idx ))
19491957 mlx5_ib_warn (dev , "failed to destroy mem psv %d\n" ,
19501958 mr -> sig -> psv_memory .psv_idx );
1951- if (mlx5_core_destroy_psv (dev -> mdev ,
1952- mr -> sig -> psv_wire .psv_idx ))
1959+ if (mlx5_core_destroy_psv (dev -> mdev , mr -> sig -> psv_wire .psv_idx ))
19531960 mlx5_ib_warn (dev , "failed to destroy wire psv %d\n" ,
19541961 mr -> sig -> psv_wire .psv_idx );
1955- xa_erase (& dev -> sig_mrs , mlx5_base_mkey (mr -> mmkey .key ));
19561962 kfree (mr -> sig );
19571963 mr -> sig = NULL ;
19581964 }
19591965
1966+ /* Stop DMA */
1967+ if (mr -> cache_ent ) {
1968+ if (mlx5_mr_cache_invalidate (mr )) {
1969+ spin_lock_irq (& mr -> cache_ent -> lock );
1970+ mr -> cache_ent -> total_mrs -- ;
1971+ spin_unlock_irq (& mr -> cache_ent -> lock );
1972+ mr -> cache_ent = NULL ;
1973+ }
1974+ }
19601975 if (!mr -> cache_ent ) {
1961- destroy_mkey (dev , mr );
1962- mlx5_free_priv_descs (mr );
1976+ rc = destroy_mkey (to_mdev (mr -> ibmr .device ), mr );
1977+ if (rc )
1978+ return rc ;
19631979 }
1964- }
1965-
1966- static void dereg_mr (struct mlx5_ib_dev * dev , struct mlx5_ib_mr * mr )
1967- {
1968- struct ib_umem * umem = mr -> umem ;
19691980
1970- /* Stop all DMA */
1971- if (is_odp_mr (mr ))
1972- mlx5_ib_fence_odp_mr (mr );
1973- else if (is_dmabuf_mr (mr ))
1974- mlx5_ib_fence_dmabuf_mr (mr );
1975- else
1976- clean_mr (dev , mr );
1981+ if (mr -> umem ) {
1982+ bool is_odp = is_odp_mr (mr );
19771983
1978- if (umem ) {
1979- if (!is_odp_mr (mr ))
1980- atomic_sub (ib_umem_num_pages (umem ),
1984+ if (!is_odp )
1985+ atomic_sub (ib_umem_num_pages (mr -> umem ),
19811986 & dev -> mdev -> priv .reg_pages );
1982- ib_umem_release (umem );
1987+ ib_umem_release (mr -> umem );
1988+ if (is_odp )
1989+ mlx5_ib_free_odp_mr (mr );
19831990 }
19841991
1985- if (mr -> cache_ent )
1992+ if (mr -> cache_ent ) {
19861993 mlx5_mr_cache_free (dev , mr );
1987- else
1994+ } else {
1995+ mlx5_free_priv_descs (mr );
19881996 kfree (mr );
1989- }
1990-
1991- int mlx5_ib_dereg_mr (struct ib_mr * ibmr , struct ib_udata * udata )
1992- {
1993- struct mlx5_ib_mr * mmr = to_mmr (ibmr );
1994-
1995- if (ibmr -> type == IB_MR_TYPE_INTEGRITY ) {
1996- dereg_mr (to_mdev (mmr -> mtt_mr -> ibmr .device ), mmr -> mtt_mr );
1997- dereg_mr (to_mdev (mmr -> klm_mr -> ibmr .device ), mmr -> klm_mr );
1998- }
1999-
2000- if (is_odp_mr (mmr ) && to_ib_umem_odp (mmr -> umem )-> is_implicit_odp ) {
2001- mlx5_ib_free_implicit_mr (mmr );
2002- return 0 ;
20031997 }
2004-
2005- dereg_mr (to_mdev (ibmr -> device ), mmr );
2006-
20071998 return 0 ;
20081999}
20092000
@@ -2175,10 +2166,10 @@ static int mlx5_alloc_integrity_descs(struct ib_pd *pd, struct mlx5_ib_mr *mr,
21752166 destroy_mkey (dev , mr );
21762167 mlx5_free_priv_descs (mr );
21772168err_free_mtt_mr :
2178- dereg_mr ( to_mdev ( mr -> mtt_mr -> ibmr . device ), mr -> mtt_mr );
2169+ mlx5_ib_dereg_mr ( & mr -> mtt_mr -> ibmr , NULL );
21792170 mr -> mtt_mr = NULL ;
21802171err_free_klm_mr :
2181- dereg_mr ( to_mdev ( mr -> klm_mr -> ibmr . device ), mr -> klm_mr );
2172+ mlx5_ib_dereg_mr ( & mr -> klm_mr -> ibmr , NULL );
21822173 mr -> klm_mr = NULL ;
21832174err_destroy_psv :
21842175 if (mlx5_core_destroy_psv (dev -> mdev , mr -> sig -> psv_memory .psv_idx ))
0 commit comments