GIFT를 통해 vmsplice로 전송된 페이지를 언제 수정할 수 있나요?

GIFT를 통해 vmsplice로 전송된 페이지를 언제 수정할 수 있나요?

vmsplice(4)this 와 함께 사용 하면 SPLICE_F_GIFT내 프로세스가 내가 제공하는 기본 페이지를 수정하지 않을 것이라고 약속합니다. 내가 아는 한 일반적인 작업 흐름은 다음과 같습니다.

/*pseudo code don't kill me*/
void* page = memmap();
vmsplice(page, SPLICE_F_GIFT);
free(page);

하지만 이렇게 하려면 페이지를 제공할 때마다 TLB를 무효화해야 합니다. 이는 데이터를 복사하지 않음으로써 얻을 수 있는 성능상의 이점을 무효화합니다.

그렇다면 커널이 다음과 같은지 어떻게 알 수 있나요?완벽한내 페이지로? 나는 간단하게 할 수 있다아니요페이지를 공개하시겠습니까?

다음과 같은 사용 사례가 있다고 가정합니다.

vmsplice -> pipe -> splice -> tcpsocket

SEND커널이 버퍼를 비우고 내 페이지가 다시 내 페이지가 되는 응답을 기다릴까요 ?

답변1

그러면 커널이 내 페이지를 완료했는지 어떻게 알 수 있나요? 왜냐하면 페이지를 전혀 해제할 수 없기 때문입니다. 그렇죠?

핵심을 위한 선물. 애플리케이션은 이 메모리를 수정하면 안 됩니다.한 번그렇지 않으면 페이지 캐시와 디스크의 데이터가 다를 수 있습니다.

vmsplice -> 파이프 -> 접합 -> tcpsocket

커널이 전송 버퍼를 플러시하고 내 페이지가 다시 내 페이지가 되는 응답을 기다릴까요?

아니요

답장을 기다리다사용 중인 계약에서 모든 무료 페이지 수신을 확인하세요.. 그러면 커널을 알게 될 것입니다.가지다모든 선물 페이지의 전송 버퍼를 플러시합니다.

(그런데 페이지 내용이 보존될 것이라고는 생각하지 않습니다. 내부에서 IPSec 암호화가 가능하다고 생각합니다.)

분명히 "소켓 전송 큐에 있는 전송되지 않은 데이터의 양"을 검색하는 것도 가능하므로 이는 또 다른 접근 방식입니다. https://stackoverflow.com/questions/6421771/vmsplice-and-tcp (물론 이 링크를 따라가서 0이 될 때까지 기다릴 필요는 없습니다. 각 페이지가 안전해지면 다시 사용할 수 있습니다.) 커널 전송 대기열을 채우지 않는 경우 폴링해야 합니다. (그렇다면 두 가지를 모두 다시 확인하면 됩니다.선택하다()epoll()은 데이터를 쓸 공간이 더 있음을 알려줍니다.

답변2

의도된 용도는 vmsplice가 mmap된 페이지를 제공한다는 것입니다. vmsplice 이후에는 이러한 페이지를 변경할 수 없지만 munmap할 수는 있습니다.

관련 정보