static int opae_shm_open(char *shm_name, u32 size, int *new_shm)
{
int shm_id;
int ret;
shm_id = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0666);
if (shm_id == -1) {
if (errno == EEXIST) {
dev_info(NULL, "shared memory %s already exist\n",
shm_name);
shm_id = shm_open(shm_name, O_RDWR, 0666);
} else {
dev_err(NULL, "failed to create shared memory %s\n",
shm_name);
return -1;
}
} else {
*new_shm = 1;
ret = ftruncate(shm_id, size);
if (ret == -1) {
dev_err(NULL,
"failed to set shared memory size to %u\n",
size);
ret = shm_unlink(shm_name);
if (ret == -1) {
dev_err(NULL,
"failed to unlink shared memory %s\n",
shm_name);
}
return -1;
}
}
return shm_id;
}
static pthread_mutex_t *opae_adapter_mutex_open(struct opae_adapter *adapter)
{
char shm_name[32];
void *ptr;
int shm_id;
int new_shm = 0;
if (!adapter->data)
return NULL;
adapter->lock = NULL;
snprintf(shm_name, sizeof(shm_name), "/mutex.IFPGA:%s", adapter->name);
shm_id = opae_shm_open(shm_name, sizeof(pthread_mutex_t), &new_shm);
if (shm_id == -1) {
dev_err(NULL, "failed to open shared memory %s\n", shm_name);
} else {
dev_info(NULL, "shared memory %s id is %d\n",
shm_name, shm_id);
ptr = mmap(NULL, sizeof(pthread_mutex_t),
PROT_READ | PROT_WRITE, MAP_SHARED,
shm_id, 0);
adapter->lock = (pthread_mutex_t *)ptr;
if (ptr) {
dev_info(NULL,
"shared memory %s address is %p\n",
shm_name, ptr);
if (new_shm)
opae_mutex_init(adapter->lock);
} else {
dev_err(NULL, "failed to map shared memory %s\n",
shm_name);
}
}
return adapter->lock;
}