0001
0002
0003
0004
0005
0006 #include <linux/slab.h>
0007 #include "pd.h"
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 int rvt_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
0019 {
0020 struct ib_device *ibdev = ibpd->device;
0021 struct rvt_dev_info *dev = ib_to_rvt(ibdev);
0022 struct rvt_pd *pd = ibpd_to_rvtpd(ibpd);
0023 int ret = 0;
0024
0025
0026
0027
0028
0029
0030
0031
0032 spin_lock(&dev->n_pds_lock);
0033 if (dev->n_pds_allocated == dev->dparms.props.max_pd) {
0034 spin_unlock(&dev->n_pds_lock);
0035 ret = -ENOMEM;
0036 goto bail;
0037 }
0038
0039 dev->n_pds_allocated++;
0040 spin_unlock(&dev->n_pds_lock);
0041
0042
0043 pd->user = !!udata;
0044
0045 bail:
0046 return ret;
0047 }
0048
0049
0050
0051
0052
0053
0054
0055
0056 int rvt_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
0057 {
0058 struct rvt_dev_info *dev = ib_to_rvt(ibpd->device);
0059
0060 spin_lock(&dev->n_pds_lock);
0061 dev->n_pds_allocated--;
0062 spin_unlock(&dev->n_pds_lock);
0063 return 0;
0064 }