@@ -56,6 +56,7 @@ static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
5656{
5757 struct smc_lo_dmb_node * dmb_node , * tmp_node ;
5858 struct smc_lo_dev * ldev = smcd -> priv ;
59+ struct folio * folio ;
5960 int sba_idx , rc ;
6061
6162 /* check space for new dmb */
@@ -74,13 +75,16 @@ static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
7475
7576 dmb_node -> sba_idx = sba_idx ;
7677 dmb_node -> len = dmb -> dmb_len ;
77- dmb_node -> cpu_addr = kzalloc (dmb_node -> len , GFP_KERNEL |
78- __GFP_NOWARN | __GFP_NORETRY |
79- __GFP_NOMEMALLOC );
80- if (!dmb_node -> cpu_addr ) {
78+
79+ /* not critical; fail under memory pressure and fallback to TCP */
80+ folio = folio_alloc (GFP_KERNEL | __GFP_NOWARN | __GFP_NOMEMALLOC |
81+ __GFP_NORETRY | __GFP_ZERO ,
82+ get_order (dmb_node -> len ));
83+ if (!folio ) {
8184 rc = - ENOMEM ;
8285 goto err_node ;
8386 }
87+ dmb_node -> cpu_addr = folio_address (folio );
8488 dmb_node -> dma_addr = SMC_DMA_ADDR_INVALID ;
8589 refcount_set (& dmb_node -> refcnt , 1 );
8690
@@ -122,7 +126,7 @@ static void __smc_lo_unregister_dmb(struct smc_lo_dev *ldev,
122126 write_unlock_bh (& ldev -> dmb_ht_lock );
123127
124128 clear_bit (dmb_node -> sba_idx , ldev -> sba_idx_mask );
125- kvfree ( dmb_node -> cpu_addr );
129+ folio_put ( virt_to_folio ( dmb_node -> cpu_addr ) );
126130 kfree (dmb_node );
127131
128132 if (atomic_dec_and_test (& ldev -> dmb_cnt ))
0 commit comments