@@ -56,6 +56,7 @@ static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
56
56
{
57
57
struct smc_lo_dmb_node * dmb_node , * tmp_node ;
58
58
struct smc_lo_dev * ldev = smcd -> priv ;
59
+ struct folio * folio ;
59
60
int sba_idx , rc ;
60
61
61
62
/* check space for new dmb */
@@ -74,13 +75,16 @@ static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
74
75
75
76
dmb_node -> sba_idx = sba_idx ;
76
77
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 ) {
81
84
rc = - ENOMEM ;
82
85
goto err_node ;
83
86
}
87
+ dmb_node -> cpu_addr = folio_address (folio );
84
88
dmb_node -> dma_addr = SMC_DMA_ADDR_INVALID ;
85
89
refcount_set (& dmb_node -> refcnt , 1 );
86
90
@@ -122,7 +126,7 @@ static void __smc_lo_unregister_dmb(struct smc_lo_dev *ldev,
122
126
write_unlock_bh (& ldev -> dmb_ht_lock );
123
127
124
128
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 ) );
126
130
kfree (dmb_node );
127
131
128
132
if (atomic_dec_and_test (& ldev -> dmb_cnt ))
0 commit comments