1
1
/* -*- Mode: C++; c-basic-offset:4; indent-tabs-mode:nil -*- */
2
2
/*
3
- * Copyright (c) 2022 Triad National Security, LLC
3
+ * Copyright (c) 2022-2024 Triad National Security, LLC
4
4
* All rights reserved.
5
5
*
6
6
* This file is part of the quo-vadis project. See the LICENSE file at the
48
48
#include " qvi-hwloc.h"
49
49
#include " qvi-utils.h"
50
50
51
- struct qvi_hwpool_s {
52
- /* * The cpuset of this resource pool. */
51
+ /* *
52
+ * Maintains a mapping between a resource ID and associated hint flags.
53
+ */
54
+ using qvi_hwpool_resource_id_hint_map_t = std::unordered_map<
55
+ uint32_t , qv_scope_create_hint_t
56
+ >;
57
+
58
+ /* *
59
+ * Maintains information about a pool of hardware resources by resource ID.
60
+ */
61
+ struct qvi_hwpool_resource_info_s {
62
+ /* *
63
+ * Vector maintaining the reference count for a given resource ID. There is
64
+ * a one-to-one correspondence between resource IDs and addressable vector
65
+ * slots since every resource is reference counted. For example, each bit in
66
+ * a cpuset will have a corresponding reference count indexed by the bit's
67
+ * location in the cpuset.
68
+ */
69
+ std::vector<uint32_t > resid_ref_count;
70
+ qvi_hwpool_resource_id_hint_map_t resid_hint_map;
71
+ };
72
+
73
+ /* *
74
+ * Base hardware pool resource class.
75
+ */
76
+ struct qvi_hwpool_resource_s {
77
+ /* * Resource info. */
78
+ qvi_hwpool_resource_info_s resinfo;
79
+ /* * Base constructor that does minimal work. */
80
+ qvi_hwpool_resource_s (void ) = default ;
81
+ /* * Virtual destructor. */
82
+ virtual ~qvi_hwpool_resource_s (void ) = default ;
83
+ };
84
+
85
+ /* *
86
+ * Defines a cpuset pool.
87
+ */
88
+ struct qvi_hwpool_cpus_s : qvi_hwpool_resource_s {
89
+ int qvim_rc = QV_ERR_INTERNAL;
90
+ /* * The cpuset of the maintained CPUs. */
53
91
hwloc_bitmap_t cpuset = nullptr ;
92
+
93
+ qvi_hwpool_cpus_s (void )
94
+ {
95
+ qvim_rc = qvi_hwloc_bitmap_calloc (&cpuset);
96
+ }
97
+
98
+ virtual
99
+ ~qvi_hwpool_cpus_s (void )
100
+ {
101
+ qvi_hwloc_bitmap_free (&cpuset);
102
+ }
103
+ };
104
+
105
+ struct qvi_hwpool_s {
106
+ int qvim_rc = QV_ERR_INTERNAL;
107
+ /* * The CPUs in the resource pool. */
108
+ qvi_hwpool_cpus_s cpus;
54
109
/* * Device information. */
55
- qvi_hwpool_devinfos_t * devinfos = nullptr ;
110
+ qvi_hwpool_devinfos_t devinfos;
56
111
// TODO(skg) Add owner to structure?
57
112
/* * The obtained cpuset of this resource pool. */
58
113
hwloc_bitmap_t obcpuset = nullptr ;
114
+
115
+ qvi_hwpool_s (void )
116
+ {
117
+ qvim_rc = qvi_construct_rc (cpus);
118
+ if (qvim_rc != QV_SUCCESS) return ;
119
+
120
+ qvim_rc = qvi_hwloc_bitmap_calloc (&obcpuset);
121
+ }
122
+
123
+ ~qvi_hwpool_s (void )
124
+ {
125
+ qvi_hwloc_bitmap_free (&obcpuset);
126
+ }
59
127
};
60
128
61
129
int
62
130
qvi_hwpool_new (
63
131
qvi_hwpool_t **rpool
64
132
) {
65
- int rc = QV_SUCCESS;
66
-
67
133
qvi_hwpool_t *irpool = qvi_new qvi_hwpool_t ();
68
- if (!irpool) {
69
- rc = QV_ERR_OOR;
70
- goto out;
71
- }
72
-
73
- irpool->devinfos = qvi_new qvi_hwpool_devinfos_t ();
74
- if (!irpool->devinfos ) {
75
- rc = QV_ERR_OOR;
76
- goto out;
77
- }
78
-
79
- rc = qvi_hwloc_bitmap_calloc (&irpool->cpuset );
80
- if (rc != QV_SUCCESS) goto out;
81
-
82
- rc = qvi_hwloc_bitmap_calloc (&irpool->obcpuset );
83
- out:
134
+ int rc = qvi_new_rc (irpool);
84
135
if (rc != QV_SUCCESS) {
85
136
qvi_hwpool_free (&irpool);
86
137
}
@@ -97,7 +148,7 @@ qvi_hwpool_new_from_line(
97
148
int rc = qvi_hwpool_new (&irpool);
98
149
if (rc != QV_SUCCESS) goto out;
99
150
100
- rc = qvi_hwloc_bitmap_copy (line->cpuset , irpool->cpuset );
151
+ rc = qvi_hwloc_bitmap_copy (line->cpuset , irpool->cpus . cpuset );
101
152
if (rc != QV_SUCCESS) goto out;
102
153
103
154
for (int i = 0 ; i < line->ndevinfos ; ++i) {
@@ -125,15 +176,15 @@ qvi_hwpool_new_line_from_hwpool(
125
176
qvi_line_hwpool_t **line
126
177
) {
127
178
int rc = QV_SUCCESS;
128
- const int ndevinfos = rpool->devinfos -> size ();
179
+ const int ndevinfos = rpool->devinfos . size ();
129
180
130
181
qvi_line_hwpool_t *iline = nullptr ;
131
182
rc = qvi_line_hwpool_new (&iline);
132
183
if (rc != QV_SUCCESS) goto out;
133
184
// Initialize and copy the cpuset.
134
185
rc = qvi_hwloc_bitmap_calloc (&iline->cpuset );
135
186
if (rc != QV_SUCCESS) goto out;
136
- rc = qvi_hwloc_bitmap_copy (rpool->cpuset , iline->cpuset );
187
+ rc = qvi_hwloc_bitmap_copy (rpool->cpus . cpuset , iline->cpuset );
137
188
if (rc != QV_SUCCESS) goto out;
138
189
// Initialize and fill in the device information.
139
190
iline->ndevinfos = ndevinfos;
@@ -144,7 +195,7 @@ qvi_hwpool_new_line_from_hwpool(
144
195
}
145
196
do {
146
197
int idx = 0 , nw = 0 ;
147
- for (const auto &dinfo : * rpool->devinfos ) {
198
+ for (const auto &dinfo : rpool->devinfos ) {
148
199
iline->devinfos [idx].type = dinfo.second ->type ;
149
200
iline->devinfos [idx].id = dinfo.second ->id ;
150
201
// Initialize and copy cpuset
@@ -191,9 +242,6 @@ qvi_hwpool_free(
191
242
if (!rpool) return ;
192
243
qvi_hwpool_t *irpool = *rpool;
193
244
if (!irpool) goto out;
194
- delete irpool->devinfos ;
195
- qvi_hwloc_bitmap_free (&irpool->cpuset );
196
- qvi_hwloc_bitmap_free (&irpool->obcpuset );
197
245
delete irpool;
198
246
out:
199
247
*rpool = nullptr ;
@@ -204,7 +252,7 @@ qvi_hwpool_init(
204
252
qvi_hwpool_t *rpool,
205
253
hwloc_const_bitmap_t cpuset
206
254
) {
207
- return qvi_hwloc_bitmap_copy (cpuset, rpool->cpuset );
255
+ return qvi_hwloc_bitmap_copy (cpuset, rpool->cpus . cpuset );
208
256
}
209
257
210
258
int
@@ -216,7 +264,7 @@ qvi_hwpool_add_device(
216
264
cstr_t uuid,
217
265
hwloc_const_cpuset_t affinity
218
266
) {
219
- rpool->devinfos -> insert (
267
+ rpool->devinfos . insert (
220
268
std::make_pair (
221
269
type,
222
270
std::make_shared<qvi_devinfo_t >(
@@ -231,24 +279,24 @@ int
231
279
qvi_hwpool_release_devices (
232
280
qvi_hwpool_t *pool
233
281
) {
234
- pool->devinfos -> clear ();
282
+ pool->devinfos . clear ();
235
283
return QV_SUCCESS;
236
284
}
237
285
238
286
hwloc_const_cpuset_t
239
287
qvi_hwpool_cpuset_get (
240
288
qvi_hwpool_t *rpool
241
289
) {
242
- if (! rpool) return nullptr ;
243
- return rpool->cpuset ;
290
+ assert ( rpool);
291
+ return rpool->cpus . cpuset ;
244
292
}
245
293
246
294
const qvi_hwpool_devinfos_t *
247
295
qvi_hwpool_devinfos_get (
248
296
qvi_hwpool_t *pool
249
297
) {
250
- if (! pool) return nullptr ;
251
- return pool->devinfos ;
298
+ assert ( pool);
299
+ return & pool->devinfos ;
252
300
}
253
301
254
302
#if 0
@@ -344,15 +392,15 @@ qvi_hwpool_add_devices_with_affinity(
344
392
const qv_hw_obj_type_t type = devts[i];
345
393
int nobjs = 0 ;
346
394
rc = qvi_hwloc_get_nobjs_in_cpuset (
347
- hwloc, type, pool->cpuset , &nobjs
395
+ hwloc, type, pool->cpus . cpuset , &nobjs
348
396
);
349
397
if (rc != QV_SUCCESS) break ;
350
398
// Iterate over the number of devices in each type.
351
399
for (int devi = 0 ; devi < nobjs; ++devi) {
352
400
char *devids = nullptr , *pcibid = nullptr , *uuids = nullptr ;
353
401
// Device ID
354
402
rc = qvi_hwloc_get_device_in_cpuset (
355
- hwloc, type, devi, pool->cpuset ,
403
+ hwloc, type, devi, pool->cpus . cpuset ,
356
404
QV_DEVICE_ID_ORDINAL, &devids
357
405
);
358
406
if (rc != QV_SUCCESS) break ;
@@ -362,13 +410,13 @@ qvi_hwpool_add_devices_with_affinity(
362
410
if (rc != QV_SUCCESS) break ;
363
411
// PCI Bus ID
364
412
rc = qvi_hwloc_get_device_in_cpuset (
365
- hwloc, type, devi, pool->cpuset ,
413
+ hwloc, type, devi, pool->cpus . cpuset ,
366
414
QV_DEVICE_ID_PCI_BUS_ID, &pcibid
367
415
);
368
416
if (rc != QV_SUCCESS) break ;
369
417
// UUID
370
418
rc = qvi_hwloc_get_device_in_cpuset (
371
- hwloc, type, devi, pool->cpuset ,
419
+ hwloc, type, devi, pool->cpus . cpuset ,
372
420
QV_DEVICE_ID_UUID, &uuids
373
421
);
374
422
if (rc != QV_SUCCESS) break ;
0 commit comments