@@ -266,17 +266,16 @@ static void smc_lgr_free_sndbufs(struct smc_link_group *lgr)
266266
267267static void smc_lgr_free_rmbs (struct smc_link_group * lgr )
268268{
269- struct smc_buf_desc * rmb_desc , * bf_desc ;
270269 struct smc_link * lnk = & lgr -> lnk [SMC_SINGLE_LINK ];
270+ struct smc_buf_desc * rmb_desc , * bf_desc ;
271271 int i ;
272272
273273 for (i = 0 ; i < SMC_RMBE_SIZES ; i ++ ) {
274274 list_for_each_entry_safe (rmb_desc , bf_desc , & lgr -> rmbs [i ],
275275 list ) {
276276 list_del (& rmb_desc -> list );
277- smc_ib_buf_unmap (lnk -> smcibdev ,
278- smc_uncompress_bufsize (i ),
279- rmb_desc , DMA_FROM_DEVICE );
277+ smc_ib_buf_unmap_sg (lnk -> smcibdev , rmb_desc ,
278+ DMA_FROM_DEVICE );
280279 kfree (rmb_desc -> cpu_addr );
281280 kfree (rmb_desc );
282281 }
@@ -580,38 +579,54 @@ int smc_rmb_create(struct smc_sock *smc)
580579 for (bufsize_short = smc_compress_bufsize (smc -> sk .sk_rcvbuf / 2 );
581580 bufsize_short >= 0 ; bufsize_short -- ) {
582581 bufsize = smc_uncompress_bufsize (bufsize_short );
582+ if ((1 << get_order (bufsize )) > SG_MAX_SINGLE_ALLOC )
583+ continue ;
584+
583585 /* check for reusable rmb_slot in the link group */
584586 rmb_desc = smc_rmb_get_slot (lgr , bufsize_short );
585587 if (rmb_desc ) {
586588 memset (rmb_desc -> cpu_addr , 0 , bufsize );
587589 break ; /* found reusable slot */
588590 }
591+
589592 /* try to alloc a new RMB */
590593 rmb_desc = kzalloc (sizeof (* rmb_desc ), GFP_KERNEL );
591594 if (!rmb_desc )
592595 break ; /* give up with -ENOMEM */
593- rmb_desc -> cpu_addr = kzalloc (bufsize ,
594- GFP_KERNEL | __GFP_NOWARN |
595- __GFP_NOMEMALLOC |
596- __GFP_NORETRY );
596+ rmb_desc -> cpu_addr =
597+ (void * )__get_free_pages (GFP_KERNEL | __GFP_NOWARN |
598+ __GFP_NOMEMALLOC |
599+ __GFP_NORETRY | __GFP_ZERO ,
600+ get_order (bufsize ));
597601 if (!rmb_desc -> cpu_addr ) {
598602 kfree (rmb_desc );
599603 rmb_desc = NULL ;
600- /* if RMB allocation has failed,
601- * try a smaller one
602- */
603604 continue ;
604605 }
605- rc = smc_ib_buf_map (lgr -> lnk [SMC_SINGLE_LINK ].smcibdev ,
606- bufsize , rmb_desc , DMA_FROM_DEVICE );
606+ rmb_desc -> order = get_order (bufsize );
607+
608+ rc = sg_alloc_table (& rmb_desc -> sgt [SMC_SINGLE_LINK ], 1 ,
609+ GFP_KERNEL );
607610 if (rc ) {
608- kfree (rmb_desc -> cpu_addr );
611+ free_pages ((unsigned long )rmb_desc -> cpu_addr ,
612+ rmb_desc -> order );
613+ kfree (rmb_desc );
614+ rmb_desc = NULL ;
615+ continue ;
616+ }
617+ sg_set_buf (rmb_desc -> sgt [SMC_SINGLE_LINK ].sgl ,
618+ rmb_desc -> cpu_addr , bufsize );
619+
620+ rc = smc_ib_buf_map_sg (lgr -> lnk [SMC_SINGLE_LINK ].smcibdev ,
621+ rmb_desc , DMA_FROM_DEVICE );
622+ if (rc != 1 ) {
623+ sg_free_table (& rmb_desc -> sgt [SMC_SINGLE_LINK ]);
624+ free_pages ((unsigned long )rmb_desc -> cpu_addr ,
625+ rmb_desc -> order );
609626 kfree (rmb_desc );
610627 rmb_desc = NULL ;
611628 continue ; /* if mapping failed, try smaller one */
612629 }
613- rmb_desc -> rkey [SMC_SINGLE_LINK ] =
614- lgr -> lnk [SMC_SINGLE_LINK ].roce_pd -> unsafe_global_rkey ;
615630 rmb_desc -> used = 1 ;
616631 write_lock_bh (& lgr -> rmbs_lock );
617632 list_add (& rmb_desc -> list , & lgr -> rmbs [bufsize_short ]);
0 commit comments