1 /* 2 * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 */ 32 33 #include "uverbs.h" 34 #include <rdma/uverbs_std_types.h> 35 36 static int uverbs_free_dm(struct ib_uobject *uobject, 37 enum rdma_remove_reason why) 38 { 39 struct ib_dm *dm = uobject->object; 40 int ret; 41 42 ret = ib_destroy_usecnt(&dm->usecnt, why, uobject); 43 if (ret) 44 return ret; 45 46 return dm->device->ops.dealloc_dm(dm); 47 } 48 49 static int UVERBS_HANDLER(UVERBS_METHOD_DM_ALLOC)( 50 struct uverbs_attr_bundle *attrs) 51 { 52 struct ib_dm_alloc_attr attr = {}; 53 struct ib_uobject *uobj = 54 uverbs_attr_get(attrs, UVERBS_ATTR_ALLOC_DM_HANDLE) 55 ->obj_attr.uobject; 56 struct ib_device *ib_dev = uobj->context->device; 57 struct ib_dm *dm; 58 int ret; 59 60 if (!ib_dev->ops.alloc_dm) 61 return -EOPNOTSUPP; 62 63 ret = uverbs_copy_from(&attr.length, attrs, 64 UVERBS_ATTR_ALLOC_DM_LENGTH); 65 if (ret) 66 return ret; 67 68 ret = uverbs_copy_from(&attr.alignment, attrs, 69 UVERBS_ATTR_ALLOC_DM_ALIGNMENT); 70 if (ret) 71 return ret; 72 73 dm = ib_dev->ops.alloc_dm(ib_dev, uobj->context, &attr, attrs); 74 if (IS_ERR(dm)) 75 return PTR_ERR(dm); 76 77 dm->device = ib_dev; 78 dm->length = attr.length; 79 dm->uobject = uobj; 80 atomic_set(&dm->usecnt, 0); 81 82 uobj->object = dm; 83 84 return 0; 85 } 86 87 DECLARE_UVERBS_NAMED_METHOD( 88 UVERBS_METHOD_DM_ALLOC, 89 UVERBS_ATTR_IDR(UVERBS_ATTR_ALLOC_DM_HANDLE, 90 UVERBS_OBJECT_DM, 91 UVERBS_ACCESS_NEW, 92 UA_MANDATORY), 93 UVERBS_ATTR_PTR_IN(UVERBS_ATTR_ALLOC_DM_LENGTH, 94 UVERBS_ATTR_TYPE(u64), 95 UA_MANDATORY), 96 UVERBS_ATTR_PTR_IN(UVERBS_ATTR_ALLOC_DM_ALIGNMENT, 97 UVERBS_ATTR_TYPE(u32), 98 UA_MANDATORY)); 99 100 DECLARE_UVERBS_NAMED_METHOD_DESTROY( 101 UVERBS_METHOD_DM_FREE, 102 UVERBS_ATTR_IDR(UVERBS_ATTR_FREE_DM_HANDLE, 103 UVERBS_OBJECT_DM, 104 UVERBS_ACCESS_DESTROY, 105 UA_MANDATORY)); 106 107 DECLARE_UVERBS_NAMED_OBJECT(UVERBS_OBJECT_DM, 108 UVERBS_TYPE_ALLOC_IDR(uverbs_free_dm), 109 &UVERBS_METHOD(UVERBS_METHOD_DM_ALLOC), 110 &UVERBS_METHOD(UVERBS_METHOD_DM_FREE)); 111 112 const struct uapi_definition uverbs_def_obj_dm[] = { 113 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DM, 114 UAPI_DEF_OBJ_NEEDS_FN(dealloc_dm)), 115 {} 116 }; 117