forked from ofiwg/libfabric
-
Notifications
You must be signed in to change notification settings - Fork 1
/
sharp_eq.c
102 lines (87 loc) · 2.83 KB
/
sharp_eq.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
* Copyright (c) 2022 Intel Corporation. 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
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "sharp.h"
static int sharp_eq_close(struct fid *fid)
{
struct sharp_eq *eq;
int ret;
eq = container_of(fid, struct sharp_eq, util_eq.eq_fid.fid);
ret = ofi_eq_cleanup(fid);
if (ret)
return ret;
free(eq);
return 0;
}
static struct fi_ops sharp_eq_fi_ops = {
.size = sizeof(struct fi_ops),
.close = sharp_eq_close,
.bind = fi_no_bind,
.control = fi_no_control,
.ops_open = fi_no_ops_open,
};
static struct fi_ops_eq sharp_eq_ops = {
.size = sizeof(struct fi_ops_cq),
.read = fi_no_eq_read,
.readerr = fi_no_eq_readerr,
.write = fi_no_eq_write,
.sread = fi_no_eq_sread,
.strerror = fi_no_eq_strerror,
};
int sharp_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
struct fid_eq **eq_fid, void *context)
{
struct sharp_eq *eq;
struct fi_peer_eq_context *peer_context = context;
int ret;
if (!attr || !(attr->flags & FI_PEER)) {
FI_WARN(&sharp_prov, FI_LOG_CORE, "FI_PEER flag required\n");
return -EINVAL;
}
if (!peer_context || peer_context->size < sizeof(*peer_context)) {
FI_WARN(&sharp_prov, FI_LOG_CORE, "invalid peer EQ context\n");
return -EINVAL;
}
eq = calloc(1, sizeof(*eq));
if (!eq)
return -FI_ENOMEM;
eq->peer_eq = peer_context->eq;
ret = ofi_eq_init(fabric, attr, &eq->util_eq.eq_fid, context);
if (ret)
goto err;
*eq_fid = &eq->util_eq.eq_fid;
(*eq_fid)->fid.ops = &sharp_eq_fi_ops;
(*eq_fid)->ops = &sharp_eq_ops;
return 0;
err:
free(eq);
return ret;
}