[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20b93ac5-dd98-172e-505f-094aa6b0df92@oracle.com>
Date: Tue, 18 Jan 2022 15:52:12 -0700
From: Khalid Aziz <khalid.aziz@...cle.com>
To: Dave Hansen <dave.hansen@...el.com>, akpm@...ux-foundation.org,
willy@...radead.org, longpeng2@...wei.com, arnd@...db.de,
dave.hansen@...ux.intel.com, david@...hat.com, rppt@...nel.org,
surenb@...gle.com, linux-kernel@...r.kernel.org, linux-mm@...ck.org
Subject: Re: [RFC PATCH 0/6] Add support for shared PTEs across processes
On 1/18/22 15:06, Dave Hansen wrote:
> On 1/18/22 1:19 PM, Khalid Aziz wrote:
>> This is a proposal to implement a mechanism in kernel to allow
>> userspace processes to opt into sharing PTEs. The proposal is to add
>> a new system call - mshare(), which can be used by a process to
>> create a region (we will call it mshare'd region) which can be used
>> by other processes to map same pages using shared PTEs. Other
>> process(es), assuming they have the right permissions, can then make
>> the mashare() system call to map the shared pages into their address
>> space using the shared PTEs.
>
> One thing that went over my head here was that this allowing sharing of
> relatively arbitrary *EXISTING* regions. The mshared'd region might be
> anonymous or an plain mmap()'d file. It can even be a filesystem or
> device DAX mmap().
>
> In other words, donors can (ideally) share anything. Consumers have
> must use msharefs to access the donated areas.
>
> Right?
>
> ( btw... thanks to willy for the correction on IRC.)
>
Hi Dave,
Consumers use msharefs only to get information on address and size of shared region. Access to the donated are does not
go through msharefs. So the consumer opens the file in msharefs to read starting address and size:
fd = open("testregion", O_RDONLY);
if ((count = read(fd, &mshare_info, sizeof(mshare_info)) > 0))
printf("INFO: %ld bytes shared at addr %lx \n",
mshare_info[1], mshare_info[0]);
else
perror("read failed");
close(fd);
It then uses that information to map in the donated region:
addr = (char *)mshare_info[0];
err = syscall(MSHARE_SYSCALL, "testregion", (void *)mshare_info[0],
mshare_info[1], O_RDWR, 600);
Makes sense?
Thanks,
Khalid
Powered by blists - more mailing lists