Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / infiniband / hw / mthca / mthca_pd.c
index ea66847..59df516 100644 (file)
@@ -1,5 +1,7 @@
 /*
  * Copyright (c) 2004 Topspin Communications.  All rights reserved.
+ * Copyright (c) 2005 Cisco Systems.  All rights reserved.
+ * Copyright (c) 2005 Mellanox Technologies. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
 
 #include "mthca_dev.h"
 
-int mthca_pd_alloc(struct mthca_dev *dev, struct mthca_pd *pd)
+int mthca_pd_alloc(struct mthca_dev *dev, int privileged, struct mthca_pd *pd)
 {
-       int err;
+       int err = 0;
 
-       might_sleep();
+       pd->privileged = privileged;
 
        atomic_set(&pd->sqp_count, 0);
        pd->pd_num = mthca_alloc(&dev->pd_table.alloc);
        if (pd->pd_num == -1)
                return -ENOMEM;
 
-       err = mthca_mr_alloc_notrans(dev, pd->pd_num,
-                                    MTHCA_MPT_FLAG_LOCAL_READ |
-                                    MTHCA_MPT_FLAG_LOCAL_WRITE,
-                                    &pd->ntmr);
-       if (err)
-               mthca_free(&dev->pd_table.alloc, pd->pd_num);
+       if (privileged) {
+               err = mthca_mr_alloc_notrans(dev, pd->pd_num,
+                                            MTHCA_MPT_FLAG_LOCAL_READ |
+                                            MTHCA_MPT_FLAG_LOCAL_WRITE,
+                                            &pd->ntmr);
+               if (err)
+                       mthca_free(&dev->pd_table.alloc, pd->pd_num);
+       }
 
        return err;
 }
 
 void mthca_pd_free(struct mthca_dev *dev, struct mthca_pd *pd)
 {
-       might_sleep();
-       mthca_free_mr(dev, &pd->ntmr);
+       if (pd->privileged)
+               mthca_free_mr(dev, &pd->ntmr);
        mthca_free(&dev->pd_table.alloc, pd->pd_num);
 }
 
@@ -73,7 +77,7 @@ int __devinit mthca_init_pd_table(struct mthca_dev *dev)
                                dev->limits.reserved_pds);
 }
 
-void __devexit mthca_cleanup_pd_table(struct mthca_dev *dev)
+void mthca_cleanup_pd_table(struct mthca_dev *dev)
 {
        /* XXX check if any PDs are still allocated? */
        mthca_alloc_cleanup(&dev->pd_table.alloc);