Skip to content

Commit

Permalink
Merge pull request #60 from pakmarkthub/invalidate
Browse files Browse the repository at this point in the history
Improve invalidation mechanism and harden security
  • Loading branch information
drossetti committed Jul 30, 2019
2 parents 6ea2ac7 + 3786215 commit 8a6985b
Show file tree
Hide file tree
Showing 4 changed files with 210 additions and 77 deletions.
29 changes: 26 additions & 3 deletions gdrapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include <sys/ioctl.h>
#include <time.h>
#include <asm/types.h>
#include <sys/queue.h>

#include "gdrapi.h"
#include "gdrdrv.h"
Expand Down Expand Up @@ -100,8 +101,9 @@ static void gdr_msg(enum gdrcopy_msg_level lvl, const char* fmt, ...)
#define gdr_warn(FMT, ARGS...) gdr_msg(GDRCOPY_MSG_WARN, "WARN: " FMT, ## ARGS)
#define gdr_err(FMT, ARGS...) gdr_msg(GDRCOPY_MSG_ERROR, "ERR: " FMT, ## ARGS)

typedef struct {
typedef struct gdr_memh_t {
gdr_hnd_t handle;
LIST_ENTRY(gdr_memh_t) entries;
unsigned mapped:1;
unsigned wc_mapping:1;
} gdr_memh_t;
Expand All @@ -121,6 +123,7 @@ static gdr_mh_t from_memh(gdr_memh_t *memh) {

struct gdr {
int fd;
LIST_HEAD(memh_list, gdr_memh_t) memhs;
};

gdr_t gdr_open()
Expand All @@ -134,7 +137,7 @@ gdr_t gdr_open()
return NULL;
}

int fd = open(gdrinode, O_RDWR);
int fd = open(gdrinode, O_RDWR | O_CLOEXEC);
if (-1 == fd ) {
int ret = errno;
gdr_err("error opening driver (errno=%d/%s)\n", ret, strerror(ret));
Expand All @@ -143,14 +146,31 @@ gdr_t gdr_open()
}

g->fd = fd;
LIST_INIT(&g->memhs);

return g;
}

int gdr_close(gdr_t g)
{
int ret = 0;
int retcode = close(g->fd);
int retcode;
gdr_memh_t *mh, *next_mh;

mh = g->memhs.lh_first;
while (mh != NULL) {
// gdr_unpin_buffer frees mh, so we need to get the next one
// beforehand.
next_mh = mh->entries.le_next;
ret = gdr_unpin_buffer(g, from_memh(mh));
if (ret) {
gdr_err("error unpinning buffer inside gdr_close (errno=%d/%s)\n", ret, strerror(ret));
return ret;
}
mh = next_mh;
}

retcode = close(g->fd);
if (-1 == retcode) {
ret = errno;
gdr_err("error closing driver (errno=%d/%s)\n", ret, strerror(ret));
Expand Down Expand Up @@ -188,6 +208,7 @@ int gdr_pin_buffer(gdr_t g, unsigned long addr, size_t size, uint64_t p2p_token,
goto err;
}
mh->handle = params.handle;
LIST_INSERT_HEAD(&g->memhs, mh, entries);
*handle = from_memh(mh);
err:
return ret;
Expand All @@ -206,6 +227,8 @@ int gdr_unpin_buffer(gdr_t g, gdr_mh_t handle)
ret = errno;
gdr_err("ioctl error (errno=%d)\n", ret);
}
LIST_REMOVE(mh, entries);
free(mh);

return ret;
}
Expand Down
6 changes: 1 addition & 5 deletions gdrapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,10 @@ gdr_t gdr_open();

// Destroy library state object, e.g. it closes the connection to kernel-mode
// driver.
//
// Note that altough BAR mappings of GPU memory are destroyed, user-space
// mappings are not. So therefore user code is responsible of calling
// gdr_unmap on all mappings before calling gdr_close.
int gdr_close(gdr_t g);

typedef struct gdr_mh_s {
unsigned long h;
unsigned long h;
} gdr_mh_t;

// Map device memory buffer on GPU BAR1, returning an handle.
Expand Down
Loading

0 comments on commit 8a6985b

Please sign in to comment.