Commit 3bf76b81 authored by Jan-Bernd Themann's avatar Jan-Bernd Themann Committed by David S. Miller

ehea: use kernel event queue

eHEA recovery and DLPAR functions are called seldomly. The eHEA workqueues
are replaced by the kernel event queue.
Signed-off-by: default avatarJan-Bernd Themann <themann@de.ibm.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent ddfce6bb
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "ehea" #define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_0077" #define DRV_VERSION "EHEA_0078"
/* eHEA capability flags */ /* eHEA capability flags */
#define DLPAR_PORT_ADD_REM 1 #define DLPAR_PORT_ADD_REM 1
...@@ -391,7 +391,6 @@ struct ehea_adapter { ...@@ -391,7 +391,6 @@ struct ehea_adapter {
struct ibmebus_dev *ebus_dev; struct ibmebus_dev *ebus_dev;
struct ehea_port *port[EHEA_MAX_PORTS]; struct ehea_port *port[EHEA_MAX_PORTS];
struct ehea_eq *neq; /* notification event queue */ struct ehea_eq *neq; /* notification event queue */
struct workqueue_struct *ehea_wq;
struct tasklet_struct neq_tasklet; struct tasklet_struct neq_tasklet;
struct ehea_mr mr; struct ehea_mr mr;
u32 pd; /* protection domain */ u32 pd; /* protection domain */
......
...@@ -94,7 +94,6 @@ MODULE_PARM_DESC(use_lro, " Large Receive Offload, 1: enable, 0: disable, " ...@@ -94,7 +94,6 @@ MODULE_PARM_DESC(use_lro, " Large Receive Offload, 1: enable, 0: disable, "
static int port_name_cnt = 0; static int port_name_cnt = 0;
static LIST_HEAD(adapter_list); static LIST_HEAD(adapter_list);
u64 ehea_driver_flags = 0; u64 ehea_driver_flags = 0;
struct workqueue_struct *ehea_driver_wq;
struct work_struct ehea_rereg_mr_task; struct work_struct ehea_rereg_mr_task;
struct semaphore dlpar_mem_lock; struct semaphore dlpar_mem_lock;
...@@ -421,7 +420,7 @@ static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq, ...@@ -421,7 +420,7 @@ static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq,
if (cqe->status & EHEA_CQE_STAT_FAT_ERR_MASK) { if (cqe->status & EHEA_CQE_STAT_FAT_ERR_MASK) {
ehea_error("Critical receive error. Resetting port."); ehea_error("Critical receive error. Resetting port.");
queue_work(pr->port->adapter->ehea_wq, &pr->port->reset_task); schedule_work(&pr->port->reset_task);
return 1; return 1;
} }
...@@ -596,8 +595,7 @@ static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota) ...@@ -596,8 +595,7 @@ static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota)
ehea_error("Send Completion Error: Resetting port"); ehea_error("Send Completion Error: Resetting port");
if (netif_msg_tx_err(pr->port)) if (netif_msg_tx_err(pr->port))
ehea_dump(cqe, sizeof(*cqe), "Send CQE"); ehea_dump(cqe, sizeof(*cqe), "Send CQE");
queue_work(pr->port->adapter->ehea_wq, schedule_work(&pr->port->reset_task);
&pr->port->reset_task);
break; break;
} }
...@@ -716,7 +714,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param) ...@@ -716,7 +714,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
eqe = ehea_poll_eq(port->qp_eq); eqe = ehea_poll_eq(port->qp_eq);
} }
queue_work(port->adapter->ehea_wq, &port->reset_task); schedule_work(&port->reset_task);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -2395,7 +2393,7 @@ static int ehea_stop(struct net_device *dev) ...@@ -2395,7 +2393,7 @@ static int ehea_stop(struct net_device *dev)
if (netif_msg_ifdown(port)) if (netif_msg_ifdown(port))
ehea_info("disabling port %s", dev->name); ehea_info("disabling port %s", dev->name);
flush_workqueue(port->adapter->ehea_wq); flush_scheduled_work();
down(&port->port_lock); down(&port->port_lock);
netif_stop_queue(dev); netif_stop_queue(dev);
ret = ehea_down(dev); ret = ehea_down(dev);
...@@ -2710,7 +2708,7 @@ static void ehea_tx_watchdog(struct net_device *dev) ...@@ -2710,7 +2708,7 @@ static void ehea_tx_watchdog(struct net_device *dev)
if (netif_carrier_ok(dev) && if (netif_carrier_ok(dev) &&
!test_bit(__EHEA_STOP_XFER, &ehea_driver_flags)) !test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))
queue_work(port->adapter->ehea_wq, &port->reset_task); schedule_work(&port->reset_task);
} }
int ehea_sense_adapter_attr(struct ehea_adapter *adapter) int ehea_sense_adapter_attr(struct ehea_adapter *adapter)
...@@ -3243,15 +3241,9 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev, ...@@ -3243,15 +3241,9 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
goto out_kill_eq; goto out_kill_eq;
} }
adapter->ehea_wq = create_workqueue("ehea_wq");
if (!adapter->ehea_wq) {
ret = -EIO;
goto out_free_irq;
}
ret = ehea_create_device_sysfs(dev); ret = ehea_create_device_sysfs(dev);
if (ret) if (ret)
goto out_kill_wq; goto out_free_irq;
ret = ehea_setup_ports(adapter); ret = ehea_setup_ports(adapter);
if (ret) { if (ret) {
...@@ -3265,9 +3257,6 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev, ...@@ -3265,9 +3257,6 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
out_rem_dev_sysfs: out_rem_dev_sysfs:
ehea_remove_device_sysfs(dev); ehea_remove_device_sysfs(dev);
out_kill_wq:
destroy_workqueue(adapter->ehea_wq);
out_free_irq: out_free_irq:
ibmebus_free_irq(NULL, adapter->neq->attr.ist1, adapter); ibmebus_free_irq(NULL, adapter->neq->attr.ist1, adapter);
...@@ -3293,7 +3282,7 @@ static int __devexit ehea_remove(struct ibmebus_dev *dev) ...@@ -3293,7 +3282,7 @@ static int __devexit ehea_remove(struct ibmebus_dev *dev)
ehea_remove_device_sysfs(dev); ehea_remove_device_sysfs(dev);
destroy_workqueue(adapter->ehea_wq); flush_scheduled_work();
ibmebus_free_irq(NULL, adapter->neq->attr.ist1, adapter); ibmebus_free_irq(NULL, adapter->neq->attr.ist1, adapter);
tasklet_kill(&adapter->neq_tasklet); tasklet_kill(&adapter->neq_tasklet);
...@@ -3351,7 +3340,6 @@ int __init ehea_module_init(void) ...@@ -3351,7 +3340,6 @@ int __init ehea_module_init(void)
printk(KERN_INFO "IBM eHEA ethernet device driver (Release %s)\n", printk(KERN_INFO "IBM eHEA ethernet device driver (Release %s)\n",
DRV_VERSION); DRV_VERSION);
ehea_driver_wq = create_workqueue("ehea_driver_wq");
INIT_WORK(&ehea_rereg_mr_task, ehea_rereg_mrs); INIT_WORK(&ehea_rereg_mr_task, ehea_rereg_mrs);
sema_init(&dlpar_mem_lock, 1); sema_init(&dlpar_mem_lock, 1);
...@@ -3385,7 +3373,7 @@ int __init ehea_module_init(void) ...@@ -3385,7 +3373,7 @@ int __init ehea_module_init(void)
static void __exit ehea_module_exit(void) static void __exit ehea_module_exit(void)
{ {
destroy_workqueue(ehea_driver_wq); flush_scheduled_work();
driver_remove_file(&ehea_driver.driver, &driver_attr_capabilities); driver_remove_file(&ehea_driver.driver, &driver_attr_capabilities);
ibmebus_unregister_driver(&ehea_driver); ibmebus_unregister_driver(&ehea_driver);
ehea_destroy_busmap(); ehea_destroy_busmap();
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
struct ehea_busmap ehea_bmap = { 0, 0, NULL }; struct ehea_busmap ehea_bmap = { 0, 0, NULL };
extern u64 ehea_driver_flags; extern u64 ehea_driver_flags;
extern struct workqueue_struct *ehea_driver_wq;
extern struct work_struct ehea_rereg_mr_task; extern struct work_struct ehea_rereg_mr_task;
...@@ -618,7 +617,7 @@ u64 ehea_map_vaddr(void *caddr) ...@@ -618,7 +617,7 @@ u64 ehea_map_vaddr(void *caddr)
if (unlikely(mapped_addr == -1)) if (unlikely(mapped_addr == -1))
if (!test_and_set_bit(__EHEA_STOP_XFER, &ehea_driver_flags)) if (!test_and_set_bit(__EHEA_STOP_XFER, &ehea_driver_flags))
queue_work(ehea_driver_wq, &ehea_rereg_mr_task); schedule_work(&ehea_rereg_mr_task);
return mapped_addr; return mapped_addr;
} }
......
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