[dpdk-dev] [PATCH v7 04/10] vhost: add two new messages to support a shared buffer
Tiwei Bie
tiwei.bie at intel.com
Fri Sep 27 04:12:22 CEST 2019
On Thu, Sep 26, 2019 at 11:06:22PM +0800, Yu, Jin wrote:
> > >
> > > +static int
> > > +mem_create(const char *name, unsigned int flags) { #ifdef
> > > +MEMFD_SUPPORTED
> > > + return memfd_create(name, flags);
> > > +#else
> > > + RTE_LOG(ERR, VHOST_CONFIG,
> > > + "doesn't support memfd--name:%s and flag:%x\n",
> > > + name, flags);
> >
> > You probably don't want to always print an error when memfd isn't available.
> I saw below error message from ci/Intel-compilation.
> ../lib/librte_vhost/vhost_user.c:1202:24: error: unused parameter ‘name’ [-Werror=unused-parameter]
> mem_create(const char *name, unsigned int flags)
> ^~~~
> ../lib/librte_vhost/vhost_user.c:1202:43: error: unused parameter ‘flags’ [-Werror=unused-parameter]
> mem_create(const char *name, unsigned int flags)
>
> That's why I add this print.Should I ignore this?
Looks better to do it like this (compile test only):
static void *
inflight_mem_alloc(const char *name, size_t size, int *fd)
{
char fname[20] = "/tmp/memfd-XXXXXX";
int mfd = -1;
void *addr;
#ifdef MEMFD_SUPPORTED
mfd = memfd_create(name, MFD_CLOEXEC);
#else
RTE_SET_USED(name);
#endif
if (mfd == -1) {
mfd = mkstemp(fname);
if (mfd == -1) {
RTE_LOG(ERR, VHOST_CONFIG,
"failed to create memory file for inflight buffer\n");
return NULL;
}
unlink(fname);
}
if (ftruncate(mfd, size) == -1) {
RTE_LOG(ERR, VHOST_CONFIG,
"failed to truncate memory file for inflight buffer\n");
close(mfd);
return NULL;
}
addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, 0);
if (addr == MAP_FAILED) {
RTE_LOG(ERR, VHOST_CONFIG,
"failed to map memory file for inflight buffer\n");
close(mfd);
return NULL;
}
*fd = mfd;
return addr;
}
And you don't need to define CLOEXEC by yourself.
> Thanks.
>
> >
> > > + return -1;
> > > +#endif
> > > +}
> > > +
> > > +static void *
> > > +inflight_mem_alloc(const char *name, size_t size, int *fd) {
> > > + void *ptr;
> > > + int mfd = -1;
> > > + char fname[20] = "/tmp/memfd-XXXXXX";
> > > +
> > > + *fd = -1;
> > > + mfd = mem_create(name, CLOEXEC);
> > > + if (mfd != -1) {
> > > + if (ftruncate(mfd, size) == -1) {
> > > + RTE_LOG(ERR, VHOST_CONFIG,
> > > + "ftruncate fail for alloc inflight buffer\n");
> > > + close(mfd);
> > > + return NULL;
> > > + }
> > > + } else {
> > > + mfd = mkstemp(fname);
> > > + unlink(fname);
> > > +
> > > + if (mfd == -1) {
> > > + RTE_LOG(ERR, VHOST_CONFIG,
> > > + "mkstemp fail for alloc inflight buffer\n");
> > > + return NULL;
> > > + }
> > > +
> > > + if (ftruncate(mfd, size) == -1) {
> > > + RTE_LOG(ERR, VHOST_CONFIG,
> > > + "ftruncate fail for alloc inflight buffer\n");
> > > + close(mfd);
> > > + return NULL;
> > > + }
> > > + }
> > > +
> > > + ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, 0);
> > > + if (ptr == MAP_FAILED) {
> > > + RTE_LOG(ERR, VHOST_CONFIG,
> > > + "mmap fail for alloc inflight buffer\n");
> > > + close(mfd);
> > > + return NULL;
> > > + }
> > > +
> > > + *fd = mfd;
> > > + return ptr;
> > > +}
More information about the dev
mailing list