[openib-general] [PATCH] Encapsulate searching of device/port into 1 routine
Krishna Kumar
krkumar at us.ibm.com
Mon Oct 18 16:21:32 PDT 2004
This patch encapsulates the search of existing device/port open into
a new routine that the existing 3 users can call instead of each of
them going through the ib_mad_port_list list (lock and lockless version).
Thanks,
- KK
--- ib_mad.c.org 2004-10-18 16:16:46.000000000 -0700
+++ ib_mad.c 2004-10-18 16:19:25.000000000 -0700
@@ -89,6 +89,38 @@
struct ib_mad_send_wc *mad_send_wc);
/*
+ * Returns a ib_mad_port_private structure or NULL for a device/port.
+ * Assumes ib_mad_port_list_lock is being held.
+ */
+static inline struct ib_mad_port_private *
+__ib_get_mad_port(struct ib_device *device, int port_num)
+{
+ struct ib_mad_port_private *entry;
+
+ BUG_ON(!spin_is_locked(&ib_mad_port_list_lock));
+ list_for_each_entry(entry, &ib_mad_port_list, port_list) {
+ if (entry->device == device && entry->port_num == port_num)
+ return entry;
+ }
+ return NULL;
+}
+
+/*
+ * Wrapper function to return a ib_mad_port_private structure or NULL for
+ * a device/port.
+ */
+static inline struct ib_mad_port_private *
+ib_get_mad_port(struct ib_device *device, int port_num)
+{
+ struct ib_mad_port_private *entry;
+
+ spin_lock_irqsave(&ib_mad_port_list_lock, flags);
+ entry = __ib_get_mad_port(device, port_num);
+ spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
+
+ return entry;
+}
+/*
* ib_register_mad_agent - Register to send/receive MADs
*/
struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
@@ -100,7 +132,7 @@
ib_mad_recv_handler recv_handler,
void *context)
{
- struct ib_mad_port_private *entry, *port_priv = NULL;
+ struct ib_mad_port_private *port_priv;
struct ib_mad_agent *ret;
struct ib_mad_agent_private *mad_agent_priv;
struct ib_mad_reg_req *reg_req = NULL;
@@ -158,14 +190,7 @@
}
/* Validate device and port */
- spin_lock_irqsave(&ib_mad_port_list_lock, flags);
- list_for_each_entry(entry, &ib_mad_port_list, port_list) {
- if (entry->device == device && entry->port_num == port_num) {
- port_priv = entry;
- break;
- }
- }
- spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
+ port_priv = ib_get_mad_port(device, port_num);
if (!port_priv) {
ret = ERR_PTR(-ENODEV);
goto error1;
@@ -1647,18 +1672,11 @@
};
struct ib_qp_init_attr qp_init_attr;
struct ib_qp_cap qp_cap;
- struct ib_mad_port_private *entry, *port_priv = NULL;
+ struct ib_mad_port_private *port_priv;
unsigned long flags;
/* First, check if port already open at MAD layer */
- spin_lock_irqsave(&ib_mad_port_list_lock, flags);
- list_for_each_entry(entry, &ib_mad_port_list, port_list) {
- if (entry->device == device && entry->port_num == port_num) {
- port_priv = entry;
- break;
- }
- }
- spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
+ port_priv = ib_get_mad_port(device, port_num);
if (port_priv) {
printk(KERN_DEBUG PFX "%s port %d already open\n",
device->name, port_num);
@@ -1778,20 +1796,15 @@
*/
static int ib_mad_port_close(struct ib_device *device, int port_num)
{
- struct ib_mad_port_private *entry, *port_priv = NULL;
+ struct ib_mad_port_private *port_priv;
unsigned long flags;
spin_lock_irqsave(&ib_mad_port_list_lock, flags);
- list_for_each_entry(entry, &ib_mad_port_list, port_list) {
- if (entry->device == device && entry->port_num == port_num) {
- port_priv = entry;
- break;
- }
- }
+ port_priv = __ib_get_mad_port(device, port_num);
if (port_priv == NULL) {
- printk(KERN_ERR PFX "Port %d not found\n", port_num);
spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
+ printk(KERN_ERR PFX "Port %d not found\n", port_num);
return -ENODEV;
}
More information about the general
mailing list