int ipa_rm_create_resource(struct ipa_rm_create_params *create_params) { struct ipa_rm_resource *resource; int result; if (!create_params) return -EINVAL; write_lock(&ipa_rm_ctx->lock); if (ipa_rm_dep_graph_get_resource(ipa_rm_ctx->dep_graph, create_params->name, &resource) == 0) { result = -EEXIST; goto bail; } result = ipa_rm_resource_create(create_params, &resource); if (result) goto bail; result = ipa_rm_dep_graph_add(ipa_rm_ctx->dep_graph, resource); if (result) ipa_rm_resource_delete(resource); bail: write_unlock(&ipa_rm_ctx->lock); return result; }
/** * ipa_rm_create_resource() - create resource * @create_params: [in] parameters needed * for resource initialization * * Returns: 0 on success, negative on failure * * This function is called by IPA RM client to initialize client's resources. * This API should be called before any other IPA RM API * on given resource name. * */ int ipa_rm_create_resource(struct ipa_rm_create_params *create_params) { struct ipa_rm_resource *resource; int result; if (!create_params) { IPA_RM_ERR("invalid args\n"); return -EINVAL; } IPA_RM_DBG("%s\n", ipa_rm_resource_str(create_params->name)); write_lock(&ipa_rm_ctx->lock); if (ipa_rm_dep_graph_get_resource(ipa_rm_ctx->dep_graph, create_params->name, &resource) == 0) { IPA_RM_ERR("resource already exists\n"); result = -EEXIST; goto bail; } result = ipa_rm_resource_create(create_params, &resource); if (result) { IPA_RM_ERR("ipa_rm_resource_create() failed\n"); goto bail; } result = ipa_rm_dep_graph_add(ipa_rm_ctx->dep_graph, resource); if (result) { IPA_RM_ERR("ipa_rm_dep_graph_add() failed\n"); ipa_rm_resource_delete(resource); goto bail; } bail: write_unlock(&ipa_rm_ctx->lock); IPA_RM_DBG("EXIT with %d\n", result); return result; }