[infiniband] Add last_opened_ibdev(), analogous to last_opened_netdev()
authorMichael Brown <mcb30@etherboot.org>
Mon, 10 Aug 2009 10:47:11 +0000 (11:47 +0100)
committerMichael Brown <mcb30@etherboot.org>
Mon, 10 Aug 2009 21:25:57 +0000 (22:25 +0100)
The minimal-surprise behaviour, when no explicit SRP initiator device
is specified, will probably be to use the most recently opened
Infiniband device.  This matches our behaviour with using the most
recently opened net device for PXE, iSCSI, AoE, NBI, etc.

src/include/gpxe/infiniband.h
src/net/infiniband.c
src/net/netdevice.c

index 771d2a0..69bc69b 100644 (file)
@@ -368,6 +368,8 @@ struct ib_device {
        struct refcnt refcnt;
        /** List of Infiniband devices */
        struct list_head list;
+       /** List of open Infiniband devices */
+       struct list_head open_list;
        /** Underlying device */
        struct device *dev;
        /** List of completion queues */
@@ -473,6 +475,7 @@ extern struct ib_device * alloc_ibdev ( size_t priv_size );
 extern int register_ibdev ( struct ib_device *ibdev );
 extern void unregister_ibdev ( struct ib_device *ibdev );
 extern struct ib_device * find_ibdev ( struct ib_gid *gid );
+extern struct ib_device * last_opened_ibdev ( void );
 extern void ib_link_state_changed ( struct ib_device *ibdev );
 extern void ib_poll_eq ( struct ib_device *ibdev );
 extern struct list_head ib_devices;
index 45f38d9..cd7deae 100644 (file)
@@ -45,6 +45,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /** List of Infiniband devices */
 struct list_head ib_devices = LIST_HEAD_INIT ( ib_devices );
 
+/** List of open Infiniband devices, in reverse order of opening */
+static struct list_head open_ib_devices = LIST_HEAD_INIT ( open_ib_devices );
+
 /***************************************************************************
  *
  * Completion queues
@@ -565,6 +568,9 @@ int ib_open ( struct ib_device *ibdev ) {
                goto err_open;
        }
 
+       /* Add to head of open devices list */
+       list_add ( &ibdev->open_list, &open_ib_devices );
+
        assert ( ibdev->open_count == 1 );
        return 0;
 
@@ -593,6 +599,7 @@ void ib_close ( struct ib_device *ibdev ) {
 
        /* Close device if this was the last remaining requested opening */
        if ( ibdev->open_count == 0 ) {
+               list_del ( &ibdev->open_list );
                ib_destroy_mi ( ibdev, ibdev->gsi );
                ib_destroy_sma ( ibdev, ibdev->smi );
                ib_destroy_mi ( ibdev, ibdev->smi );
@@ -898,3 +905,19 @@ struct ib_device * find_ibdev ( struct ib_gid *gid ) {
        }
        return NULL;
 }
+
+/**
+ * Get most recently opened Infiniband device
+ *
+ * @ret ibdev          Most recently opened Infiniband device, or NULL
+ */
+struct ib_device * last_opened_ibdev ( void ) {
+       struct ib_device *ibdev;
+
+       list_for_each_entry ( ibdev, &open_ib_devices, open_list ) {
+               assert ( ibdev->open_count != 0 );
+               return ibdev;
+       }
+
+       return NULL;
+}
index 3bb0574..f019eeb 100644 (file)
@@ -43,7 +43,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 struct list_head net_devices = LIST_HEAD_INIT ( net_devices );
 
 /** List of open network devices, in reverse order of opening */
-struct list_head open_net_devices = LIST_HEAD_INIT ( open_net_devices );
+static struct list_head open_net_devices = LIST_HEAD_INIT ( open_net_devices );
 
 /** Default link status code */
 #define EUNKNOWN_LINK_STATUS EINPROGRESS