Quando posso modificar uma página GIFT'd para vmsplice?

3

Quando vmsplice(4) é usado com SPLICE_F_GIFT , é prometido que meu processo não modifica as páginas subjacentes que eu presenteio. O fluxo normal de trabalho que eu estou informado é:

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

Mas isso exige que eu invalide meu TLB toda vez que dou uma página para presente. Que nega agradavelmente qualquer ganho de desempenho que recebo ao não copiar os dados.

Então, como posso saber se o kernel está pronto com a minha página? Como eu posso simplesmente não liberar a página certo?

Estou assumindo um caso de uso como:

vmsplice -> pipe -> splice -> tcpsocket

Eu esperaria por uma resposta, quando o kernel irá liberar seu buffer SEND e minha página será minha novamente?

    
por Valarauca 17.02.2017 / 19:22

1 resposta

0

So how can I know the kernel is done with my page? As I can simply not free the page right?

um presente para o kernel. O aplicativo não pode modificar essa memória ever , caso contrário, o cache da página e os dados no disco podem ser diferentes.

vmsplice -> pipe -> splice -> tcpsocket

I would wait for a response, at which point the kernel will flush its SEND buffer and my page will be mine again?

não

Aguarde até que uma resposta que no protocolo que você usa, reconheça que todas as páginas de talentos foram recebidas . Então você saberá que o kernel tem liberado o buffer de envio, de todas as páginas de talentos.

(Por acaso, eu não diria que o conteúdo das páginas sobrevive. Eu imagino que possa ser criptografado no local para o IPSec).

Aparentemente, também é possível recuperar "a quantidade de dados não enviados na fila de envio de soquete", então é outra maneira de fazer isso. link (é claro que você não precisa esperar até que ele caia para 0 conforme este link, você poderia reutilizar cada página à medida que ela se tornasse segura). Isso requer pesquisa no caso em que você não está preenchendo a fila de envio do kernel. (Quando você está, você apenas verifica novamente ao mesmo tempo select () epoll () diz que há mais espaço para gravar dados.

    
por 17.02.2017 / 19:59