Commit 4b202b71 authored by Jon Derrick's avatar Jon Derrick Committed by Bjorn Helgaas

PCI/AER: Avoid memory allocation in interrupt handling path

When handling AER events, we previously allocated a struct aer_err_info,
processed the error, and freed the struct.  But aer_isr_one_error() is
serialized by rpc_mutex, so we never need more than one copy of the struct,
and the struct is only about 70 bytes, so we're not saving much by
allocating it dynamically.

Embed a struct aer_err_info directly in struct aer_rpc, which is allocated
at probe-time by aer_probe().

[bhelgaas: changelog]
Suggested-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Signed-off-by: default avatarJon Derrick <jonathan.derrick@intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 2458d66b
...@@ -60,6 +60,7 @@ struct aer_rpc { ...@@ -60,6 +60,7 @@ struct aer_rpc {
struct pcie_device *rpd; /* Root Port device */ struct pcie_device *rpd; /* Root Port device */
struct work_struct dpc_handler; struct work_struct dpc_handler;
struct aer_err_source e_sources[AER_ERROR_SOURCES_MAX]; struct aer_err_source e_sources[AER_ERROR_SOURCES_MAX];
struct aer_err_info e_info;
unsigned short prod_idx; /* Error Producer Index */ unsigned short prod_idx; /* Error Producer Index */
unsigned short cons_idx; /* Error Consumer Index */ unsigned short cons_idx; /* Error Consumer Index */
int isr; int isr;
......
...@@ -711,15 +711,8 @@ static inline void aer_process_err_devices(struct pcie_device *p_device, ...@@ -711,15 +711,8 @@ static inline void aer_process_err_devices(struct pcie_device *p_device,
static void aer_isr_one_error(struct pcie_device *p_device, static void aer_isr_one_error(struct pcie_device *p_device,
struct aer_err_source *e_src) struct aer_err_source *e_src)
{ {
struct aer_err_info *e_info; struct aer_rpc *rpc = get_service_data(p_device);
struct aer_err_info *e_info = &rpc->e_info;
/* struct aer_err_info might be big, so we allocate it with slab */
e_info = kmalloc(sizeof(struct aer_err_info), GFP_KERNEL);
if (!e_info) {
dev_printk(KERN_DEBUG, &p_device->port->dev,
"Can't allocate mem when processing AER errors\n");
return;
}
/* /*
* There is a possibility that both correctable error and * There is a possibility that both correctable error and
...@@ -758,8 +751,6 @@ static void aer_isr_one_error(struct pcie_device *p_device, ...@@ -758,8 +751,6 @@ static void aer_isr_one_error(struct pcie_device *p_device,
if (find_source_device(p_device->port, e_info)) if (find_source_device(p_device->port, e_info))
aer_process_err_devices(p_device, e_info); aer_process_err_devices(p_device, e_info);
} }
kfree(e_info);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment