Hello,
I noticed that the ntdll WRITECOPY changes got mostly dropped from staging in commit https://github.com/wine-staging/wine-staging/commit/ 16dce521242b3f4a52cd2c8799ce6fe464fac83c
The current state even after multiple iterations, the whole WRITECOPY implemenet needs differently. Upstream will need to do this.
As I understand it, the implementation marks WRITECOPY pages as read-only on the unix side, handling the access violation and marking it as read-write afterwards. (Correct me if I'm wrong)
What is wrong with the underlying concept, how should it be implemented properly?
Regards, Fabian Maurer
Hi Fabian,
It should be done with userfaultfd. I have a WIP branch at https://gitlab.winehq.org/zhiyi/wine/-/tree/bug-23670-implement-write-copy-w.... The writecopy part is working. However, the performance impact is a concern. Some games call |VirtualQuery() tens of thousands of times and any slowdown makes these games stutter. Also, Paul mentioned that we should implement making shared pages private and make it work alongside PAGE_WRITECOPY so that it's both correct feature wise and performance wise. It needs more work.
As for why not using signals to track page faults for implementing WRITECOPY. There are a few issues with that approach. First, it's too slow. Second, signals may be blocked. | Best Regards, Zhiyi
On 9/29/24 01:55, Fabian Maurer wrote:
Hello,
I noticed that the ntdll WRITECOPY changes got mostly dropped from staging in commit https://github.com/wine-staging/wine-staging/commit/ 16dce521242b3f4a52cd2c8799ce6fe464fac83c
The current state even after multiple iterations, the whole WRITECOPY implemenet needs differently. Upstream will need to do this.
As I understand it, the implementation marks WRITECOPY pages as read-only on the unix side, handling the access violation and marking it as read-write afterwards. (Correct me if I'm wrong)
What is wrong with the underlying concept, how should it be implemented properly?
Regards, Fabian Maurer