-static int get_segment_lock_fd(int list_idx, int seg_idx)
-{
- char path[PATH_MAX] = {0};
- int fd;
-
- if (list_idx < 0 || list_idx >= (int)RTE_DIM(fd_list))
- return -1;
- if (seg_idx < 0 || seg_idx >= fd_list[list_idx].len)
- return -1;
-
- fd = fd_list[list_idx].fds[seg_idx];
- /* does this lock already exist? */
- if (fd >= 0)
- return fd;
-
- eal_get_hugefile_lock_path(path, sizeof(path),
- list_idx * RTE_MAX_MEMSEG_PER_LIST + seg_idx);
-
- fd = open(path, O_CREAT | O_RDWR, 0660);
- if (fd < 0) {
- RTE_LOG(ERR, EAL, "%s(): error creating lockfile '%s': %s\n",
- __func__, path, strerror(errno));
- return -1;
- }
- /* take out a read lock */
- if (lock(fd, LOCK_SH) != 1) {
- RTE_LOG(ERR, EAL, "%s(): failed to take out a readlock on '%s': %s\n",
- __func__, path, strerror(errno));
- close(fd);
- return -1;
- }
- /* store it for future reference */
- fd_list[list_idx].fds[seg_idx] = fd;
- fd_list[list_idx].count++;
- return fd;
-}
-
-static int unlock_segment(int list_idx, int seg_idx)
-{
- int fd, ret;
-
- if (list_idx < 0 || list_idx >= (int)RTE_DIM(fd_list))
- return -1;
- if (seg_idx < 0 || seg_idx >= fd_list[list_idx].len)
- return -1;
-
- fd = fd_list[list_idx].fds[seg_idx];
-
- /* upgrade lock to exclusive to see if we can remove the lockfile */
- ret = lock(fd, LOCK_EX);
- if (ret == 1) {
- /* we've succeeded in taking exclusive lock, this lockfile may
- * be removed.
- */
- char path[PATH_MAX] = {0};
- eal_get_hugefile_lock_path(path, sizeof(path),
- list_idx * RTE_MAX_MEMSEG_PER_LIST + seg_idx);
- if (unlink(path)) {
- RTE_LOG(ERR, EAL, "%s(): error removing lockfile '%s': %s\n",
- __func__, path, strerror(errno));
- }
- }
- /* we don't want to leak the fd, so even if we fail to lock, close fd
- * and remove it from list anyway.
- */
- close(fd);
- fd_list[list_idx].fds[seg_idx] = -1;
- fd_list[list_idx].count--;
-
- if (ret < 0)
- return -1;
- return 0;
-}
-