1 /*
2 * Copyright (C) by Argonne National Laboratory
3 * See COPYRIGHT in top-level directory
4 */
5
6 #include "yaksi.h"
7 #include "yaksuri_cudai.h"
8 #include <assert.h>
9 #include <string.h>
10 #include <stdlib.h>
11
yaksuri_cudai_info_create_hook(yaksi_info_s * info)12 int yaksuri_cudai_info_create_hook(yaksi_info_s * info)
13 {
14 int rc = YAKSA_SUCCESS;
15 yaksuri_cudai_info_s *infopriv;
16
17 infopriv = (yaksuri_cudai_info_s *) malloc(sizeof(yaksuri_cudai_info_s));
18 YAKSU_ERR_CHKANDJUMP(!infopriv, rc, YAKSA_ERR__OUT_OF_MEM, fn_fail);
19
20 /* set default values for info keys */
21 infopriv->iov_pack_threshold = YAKSURI_CUDAI_INFO__DEFAULT_IOV_PUP_THRESHOLD;
22 infopriv->iov_unpack_threshold = YAKSURI_CUDAI_INFO__DEFAULT_IOV_PUP_THRESHOLD;
23 infopriv->inbuf.is_valid = false;
24 infopriv->outbuf.is_valid = false;
25
26 info->backend.cuda.priv = (void *) infopriv;
27
28 fn_exit:
29 return rc;
30 fn_fail:
31 goto fn_exit;
32 }
33
yaksuri_cudai_info_free_hook(yaksi_info_s * info)34 int yaksuri_cudai_info_free_hook(yaksi_info_s * info)
35 {
36 free(info->backend.cuda.priv);
37
38 return YAKSA_SUCCESS;
39 }
40
yaksuri_cudai_info_keyval_append(yaksi_info_s * info,const char * key,const void * val,unsigned int vallen)41 int yaksuri_cudai_info_keyval_append(yaksi_info_s * info, const char *key, const void *val,
42 unsigned int vallen)
43 {
44 yaksuri_cudai_info_s *infopriv = (yaksuri_cudai_info_s *) info->backend.cuda.priv;
45
46 if (!strncmp(key, "yaksa_cuda_iov_pack_threshold", YAKSA_INFO_MAX_KEYLEN)) {
47 assert(vallen == sizeof(uintptr_t));
48 infopriv->iov_pack_threshold = (uintptr_t) val;
49 } else if (!strncmp(key, "yaksa_cuda_iov_unpack_threshold", YAKSA_INFO_MAX_KEYLEN)) {
50 assert(vallen == sizeof(uintptr_t));
51 infopriv->iov_unpack_threshold = (uintptr_t) val;
52 } else if (!strncmp(key, "yaksa_cuda_inbuf_ptr_attr", YAKSA_INFO_MAX_KEYLEN)) {
53 assert(vallen == sizeof(struct cudaPointerAttributes));
54 infopriv->inbuf.is_valid = true;
55 memcpy(&infopriv->inbuf.attr, val, sizeof(struct cudaPointerAttributes));
56 } else if (!strncmp(key, "yaksa_cuda_outbuf_ptr_attr", YAKSA_INFO_MAX_KEYLEN)) {
57 assert(vallen == sizeof(struct cudaPointerAttributes));
58 infopriv->outbuf.is_valid = true;
59 memcpy(&infopriv->outbuf.attr, val, sizeof(struct cudaPointerAttributes));
60 }
61
62 return YAKSA_SUCCESS;
63 }
64