IB/rdmavt: Add driver notification for new AH
authorDennis Dalessandro <dennis.dalessandro@intel.com>
Wed, 6 Jan 2016 18:04:23 +0000 (10:04 -0800)
committerDoug Ledford <dledford@redhat.com>
Fri, 11 Mar 2016 01:37:14 +0000 (20:37 -0500)
Drivers may need to do some work once an address handle has been
created. Add a driver function for this purpose.

Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Reviewed-by: Harish Chegondi <harish.chegondi@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/sw/rdmavt/ah.c
include/rdma/rdma_vt.h

index 2519db9..621afc3 100644 (file)
@@ -83,8 +83,8 @@ int rvt_check_ah(struct ib_device *ibdev,
                    !(ah_attr->ah_flags & IB_AH_GRH))
                        return -EINVAL;
        }
-       if (rdi->driver_f.check_ah(ibdev, ah_attr))
-               return -EINVAL;
+       if (rdi->driver_f.check_ah)
+               return rdi->driver_f.check_ah(ibdev, ah_attr);
        return 0;
 }
 EXPORT_SYMBOL(rvt_check_ah);
@@ -123,6 +123,9 @@ struct ib_ah *rvt_create_ah(struct ib_pd *pd,
        ah->attr = *ah_attr;
        atomic_set(&ah->refcount, 0);
 
+       if (dev->driver_f.notify_new_ah)
+               dev->driver_f.notify_new_ah(pd->device, ah_attr, ah);
+
        return &ah->ibah;
 }
 
index a3d6a5b..ef66d2b 100644 (file)
@@ -467,9 +467,21 @@ struct rvt_driver_params {
        int nports;
 };
 
-/*
- * Functions that drivers are required to support
- */
+/* Protection domain */
+struct rvt_pd {
+       struct ib_pd ibpd;
+       int user;               /* non-zero if created from user space */
+};
+
+/* Address handle */
+struct rvt_ah {
+       struct ib_ah ibah;
+       struct ib_ah_attr attr;
+       atomic_t refcount;
+       u8 vl;
+       u8 log_pmtu;
+};
+
 struct rvt_dev_info;
 struct rvt_driver_provided {
        /*
@@ -478,23 +490,20 @@ struct rvt_driver_provided {
         * instead drivers are responsible for setting the correct callback for
         * this.
         */
+
+       /* -------------------*/
+       /* Required functions */
+       /* -------------------*/
        int (*port_callback)(struct ib_device *, u8, struct kobject *);
        const char * (*get_card_name)(struct rvt_dev_info *rdi);
        struct pci_dev * (*get_pci_dev)(struct rvt_dev_info *rdi);
-       int (*check_ah)(struct ib_device *, struct ib_ah_attr *);
-};
 
-/* Protection domain */
-struct rvt_pd {
-       struct ib_pd ibpd;
-       int user;               /* non-zero if created from user space */
-};
-
-/* Address handle */
-struct rvt_ah {
-       struct ib_ah ibah;
-       struct ib_ah_attr attr;
-       atomic_t refcount;
+       /*--------------------*/
+       /* Optional functions */
+       /*--------------------*/
+       int (*check_ah)(struct ib_device *, struct ib_ah_attr *);
+       void (*notify_new_ah)(struct ib_device *, struct ib_ah_attr *,
+                             struct rvt_ah *);
 };
 
 struct rvt_dev_info {