Skip to content

Commit 5cfa461

Browse files
AbinashLalotragregkh
authored andcommitted
dma: dw-edma: Fix build warning in dw_edma_pcie_probe()
[ Upstream commit 3df63fa ] The function dw_edma_pcie_probe() in dw-edma-pcie.c triggered a frame size warning: ld.lld:warning: drivers/dma/dw-edma/dw-edma-pcie.c:162:0: stack frame size (1040) exceeds limit (1024) in function 'dw_edma_pcie_probe' This patch reduces the stack usage by dynamically allocating the `vsec_data` structure using kmalloc(), rather than placing it on the stack. This eliminates the overflow warning and improves kernel robustness. Signed-off-by: Abinash Singh <abinashsinghlalotra@gmail.com> Acked-by: Manivannan Sadhasivam <mani@kernel.org> Link: https://lore.kernel.org/r/20250705160055.808165-1-abinashsinghlalotra@gmail.com Signed-off-by: Vinod Koul <vkoul@kernel.org> Stable-dep-of: 11d7cfe ("dmaengine: dw-edma-pcie: Reject devices without driver data") Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f12885f commit 5cfa461

1 file changed

Lines changed: 32 additions & 28 deletions

File tree

drivers/dma/dw-edma/dw-edma-pcie.c

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -160,36 +160,40 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
160160
const struct pci_device_id *pid)
161161
{
162162
struct dw_edma_pcie_data *pdata = (void *)pid->driver_data;
163-
struct dw_edma_pcie_data vsec_data;
163+
struct dw_edma_pcie_data *vsec_data __free(kfree) = NULL;
164164
struct device *dev = &pdev->dev;
165165
struct dw_edma_chip *chip;
166166
int err, nr_irqs;
167167
int i, mask;
168168

169+
vsec_data = kmalloc(sizeof(*vsec_data), GFP_KERNEL);
170+
if (!vsec_data)
171+
return -ENOMEM;
172+
169173
/* Enable PCI device */
170174
err = pcim_enable_device(pdev);
171175
if (err) {
172176
pci_err(pdev, "enabling device failed\n");
173177
return err;
174178
}
175179

176-
memcpy(&vsec_data, pdata, sizeof(struct dw_edma_pcie_data));
180+
memcpy(vsec_data, pdata, sizeof(struct dw_edma_pcie_data));
177181

178182
/*
179183
* Tries to find if exists a PCIe Vendor-Specific Extended Capability
180184
* for the DMA, if one exists, then reconfigures it.
181185
*/
182-
dw_edma_pcie_get_vsec_dma_data(pdev, &vsec_data);
186+
dw_edma_pcie_get_vsec_dma_data(pdev, vsec_data);
183187

184188
/* Mapping PCI BAR regions */
185-
mask = BIT(vsec_data.rg.bar);
186-
for (i = 0; i < vsec_data.wr_ch_cnt; i++) {
187-
mask |= BIT(vsec_data.ll_wr[i].bar);
188-
mask |= BIT(vsec_data.dt_wr[i].bar);
189+
mask = BIT(vsec_data->rg.bar);
190+
for (i = 0; i < vsec_data->wr_ch_cnt; i++) {
191+
mask |= BIT(vsec_data->ll_wr[i].bar);
192+
mask |= BIT(vsec_data->dt_wr[i].bar);
189193
}
190-
for (i = 0; i < vsec_data.rd_ch_cnt; i++) {
191-
mask |= BIT(vsec_data.ll_rd[i].bar);
192-
mask |= BIT(vsec_data.dt_rd[i].bar);
194+
for (i = 0; i < vsec_data->rd_ch_cnt; i++) {
195+
mask |= BIT(vsec_data->ll_rd[i].bar);
196+
mask |= BIT(vsec_data->dt_rd[i].bar);
193197
}
194198
err = pcim_iomap_regions(pdev, mask, pci_name(pdev));
195199
if (err) {
@@ -212,7 +216,7 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
212216
return -ENOMEM;
213217

214218
/* IRQs allocation */
215-
nr_irqs = pci_alloc_irq_vectors(pdev, 1, vsec_data.irqs,
219+
nr_irqs = pci_alloc_irq_vectors(pdev, 1, vsec_data->irqs,
216220
PCI_IRQ_MSI | PCI_IRQ_MSIX);
217221
if (nr_irqs < 1) {
218222
pci_err(pdev, "fail to alloc IRQ vector (number of IRQs=%u)\n",
@@ -223,22 +227,22 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
223227
/* Data structure initialization */
224228
chip->dev = dev;
225229

226-
chip->mf = vsec_data.mf;
230+
chip->mf = vsec_data->mf;
227231
chip->nr_irqs = nr_irqs;
228232
chip->ops = &dw_edma_pcie_plat_ops;
229233

230-
chip->ll_wr_cnt = vsec_data.wr_ch_cnt;
231-
chip->ll_rd_cnt = vsec_data.rd_ch_cnt;
234+
chip->ll_wr_cnt = vsec_data->wr_ch_cnt;
235+
chip->ll_rd_cnt = vsec_data->rd_ch_cnt;
232236

233-
chip->reg_base = pcim_iomap_table(pdev)[vsec_data.rg.bar];
237+
chip->reg_base = pcim_iomap_table(pdev)[vsec_data->rg.bar];
234238
if (!chip->reg_base)
235239
return -ENOMEM;
236240

237241
for (i = 0; i < chip->ll_wr_cnt; i++) {
238242
struct dw_edma_region *ll_region = &chip->ll_region_wr[i];
239243
struct dw_edma_region *dt_region = &chip->dt_region_wr[i];
240-
struct dw_edma_block *ll_block = &vsec_data.ll_wr[i];
241-
struct dw_edma_block *dt_block = &vsec_data.dt_wr[i];
244+
struct dw_edma_block *ll_block = &vsec_data->ll_wr[i];
245+
struct dw_edma_block *dt_block = &vsec_data->dt_wr[i];
242246

243247
ll_region->vaddr.io = pcim_iomap_table(pdev)[ll_block->bar];
244248
if (!ll_region->vaddr.io)
@@ -262,8 +266,8 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
262266
for (i = 0; i < chip->ll_rd_cnt; i++) {
263267
struct dw_edma_region *ll_region = &chip->ll_region_rd[i];
264268
struct dw_edma_region *dt_region = &chip->dt_region_rd[i];
265-
struct dw_edma_block *ll_block = &vsec_data.ll_rd[i];
266-
struct dw_edma_block *dt_block = &vsec_data.dt_rd[i];
269+
struct dw_edma_block *ll_block = &vsec_data->ll_rd[i];
270+
struct dw_edma_block *dt_block = &vsec_data->dt_rd[i];
267271

268272
ll_region->vaddr.io = pcim_iomap_table(pdev)[ll_block->bar];
269273
if (!ll_region->vaddr.io)
@@ -295,31 +299,31 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
295299
pci_dbg(pdev, "Version:\tUnknown (0x%x)\n", chip->mf);
296300

297301
pci_dbg(pdev, "Registers:\tBAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p)\n",
298-
vsec_data.rg.bar, vsec_data.rg.off, vsec_data.rg.sz,
302+
vsec_data->rg.bar, vsec_data->rg.off, vsec_data->rg.sz,
299303
chip->reg_base);
300304

301305

302306
for (i = 0; i < chip->ll_wr_cnt; i++) {
303307
pci_dbg(pdev, "L. List:\tWRITE CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
304-
i, vsec_data.ll_wr[i].bar,
305-
vsec_data.ll_wr[i].off, chip->ll_region_wr[i].sz,
308+
i, vsec_data->ll_wr[i].bar,
309+
vsec_data->ll_wr[i].off, chip->ll_region_wr[i].sz,
306310
chip->ll_region_wr[i].vaddr.io, &chip->ll_region_wr[i].paddr);
307311

308312
pci_dbg(pdev, "Data:\tWRITE CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
309-
i, vsec_data.dt_wr[i].bar,
310-
vsec_data.dt_wr[i].off, chip->dt_region_wr[i].sz,
313+
i, vsec_data->dt_wr[i].bar,
314+
vsec_data->dt_wr[i].off, chip->dt_region_wr[i].sz,
311315
chip->dt_region_wr[i].vaddr.io, &chip->dt_region_wr[i].paddr);
312316
}
313317

314318
for (i = 0; i < chip->ll_rd_cnt; i++) {
315319
pci_dbg(pdev, "L. List:\tREAD CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
316-
i, vsec_data.ll_rd[i].bar,
317-
vsec_data.ll_rd[i].off, chip->ll_region_rd[i].sz,
320+
i, vsec_data->ll_rd[i].bar,
321+
vsec_data->ll_rd[i].off, chip->ll_region_rd[i].sz,
318322
chip->ll_region_rd[i].vaddr.io, &chip->ll_region_rd[i].paddr);
319323

320324
pci_dbg(pdev, "Data:\tREAD CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
321-
i, vsec_data.dt_rd[i].bar,
322-
vsec_data.dt_rd[i].off, chip->dt_region_rd[i].sz,
325+
i, vsec_data->dt_rd[i].bar,
326+
vsec_data->dt_rd[i].off, chip->dt_region_rd[i].sz,
323327
chip->dt_region_rd[i].vaddr.io, &chip->dt_region_rd[i].paddr);
324328
}
325329

0 commit comments

Comments
 (0)