Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause
0002 /*
0003  * Copyright(c) 2016 Intel Corporation.
0004  */
0005 
0006 #include <linux/slab.h>
0007 #include "pd.h"
0008 
0009 /**
0010  * rvt_alloc_pd - allocate a protection domain
0011  * @ibpd: PD
0012  * @udata: optional user data
0013  *
0014  * Allocate and keep track of a PD.
0015  *
0016  * Return: 0 on success
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      * While we could continue allocating protecetion domains, being
0027      * constrained only by system resources. The IBTA spec defines that
0028      * there is a max_pd limit that can be set and we need to check for
0029      * that.
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     /* ib_alloc_pd() will initialize pd->ibpd. */
0043     pd->user = !!udata;
0044 
0045 bail:
0046     return ret;
0047 }
0048 
0049 /**
0050  * rvt_dealloc_pd - Free PD
0051  * @ibpd: Free up PD
0052  * @udata: Valid user data or NULL for kernel object
0053  *
0054  * Return: always 0
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 }