Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

svcrdma: Adjust the number of entries in svc_rdma_send_ctxt::sc_pages

Allow allocation of more entries in the sc_pages[] array when the
maximum size of an RPC message is increased.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Chuck Lever 56ab43f5 81381d1a

+15 -4
+2 -1
include/linux/sunrpc/svc_rdma.h
··· 245 245 void *sc_xprt_buf; 246 246 int sc_page_count; 247 247 int sc_cur_sge_no; 248 - struct page *sc_pages[RPCSVC_MAXPAGES]; 248 + unsigned long sc_maxpages; 249 + struct page **sc_pages; 249 250 struct ib_sge sc_sges[]; 250 251 }; 251 252
+13 -3
net/sunrpc/xprtrdma/svc_rdma_sendto.c
··· 118 118 { 119 119 int node = ibdev_to_node(rdma->sc_cm_id->device); 120 120 struct svc_rdma_send_ctxt *ctxt; 121 + unsigned long pages; 121 122 dma_addr_t addr; 122 123 void *buffer; 123 124 int i; ··· 127 126 GFP_KERNEL, node); 128 127 if (!ctxt) 129 128 goto fail0; 129 + pages = svc_serv_maxpages(rdma->sc_xprt.xpt_server); 130 + ctxt->sc_pages = kcalloc_node(pages, sizeof(struct page *), 131 + GFP_KERNEL, node); 132 + if (!ctxt->sc_pages) 133 + goto fail1; 134 + ctxt->sc_maxpages = pages; 130 135 buffer = kmalloc_node(rdma->sc_max_req_size, GFP_KERNEL, node); 131 136 if (!buffer) 132 - goto fail1; 137 + goto fail2; 133 138 addr = ib_dma_map_single(rdma->sc_pd->device, buffer, 134 139 rdma->sc_max_req_size, DMA_TO_DEVICE); 135 140 if (ib_dma_mapping_error(rdma->sc_pd->device, addr)) 136 - goto fail2; 141 + goto fail3; 137 142 138 143 svc_rdma_send_cid_init(rdma, &ctxt->sc_cid); 139 144 ··· 158 151 ctxt->sc_sges[i].lkey = rdma->sc_pd->local_dma_lkey; 159 152 return ctxt; 160 153 161 - fail2: 154 + fail3: 162 155 kfree(buffer); 156 + fail2: 157 + kfree(ctxt->sc_pages); 163 158 fail1: 164 159 kfree(ctxt); 165 160 fail0: ··· 185 176 rdma->sc_max_req_size, 186 177 DMA_TO_DEVICE); 187 178 kfree(ctxt->sc_xprt_buf); 179 + kfree(ctxt->sc_pages); 188 180 kfree(ctxt); 189 181 } 190 182 }