Onde o PageWriteback é definido na fonte do kernel 4.9 do Linux?

2

Uma pesquisa por PageWriteback em 4.9 resulta em: "identificador indefinido", ainda uma pesquisa por PageWriteback em 2.6.25 mostra que está definida lá.

Por que PageWriteback está em uso em 4.9, mas não consigo encontrar uma definição para ele?

    
por illiterate 26.07.2017 / 20:22

2 respostas

4

É (juntamente com muitas outras coisas do PageXXX) definidas em include/linux/page-flags.h , mas a definição é obscurecida pelo uso de macros. Veja a macro TESTPAGEFLAG no arquivo acima.

Em particular, esta definição da macro TESTPAGEFLAG :

#define TESTPAGEFLAG(uname, lname, policy)              \
static __always_inline int Page##uname(struct page *page)       \
    { return test_bit(PG_##lname, &policy(page, 0)->flags); }

combinado com esta chamada para TESTPAGEFLAG com o Writeback parâmetros :

TESTPAGEFLAG(Writeback, writeback, PF_NO_COMPOUND)
    
por 26.07.2017 / 20:59
1

A questão geral ficou comigo, então pensei em adicionar uma resposta sobre como eu poderia encontrar um identificador arbitrário no kernel do Linux.

Faça o download de uma versão do código fonte do kernel (ou instale o pacote fonte do kernel linux-distribution) e extraia:

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.39.tar.xz
tar xf linux-4.9.39.tar.xz
cd linux-4.9.39

Crie um arquivo .config mínimo, apenas para criar um kernel compilável:

make menuconfig # just exit and save

Passo-chave: compile o kernel com o sinalizador -save-temps gcc para que ele salve os arquivos intermediários do pré-processador:

make KCFLAGS=-save-temps

O processo de compilação descartará *.i arquivos no diretório atual. Encontre qualquer arquivo onde o identificador é definido; Eu escolhi o mesmo identificador aqui, para facilitar a comparação, mas o processo funcionaria para qualquer outro identificador; Eu escolhi zbud.i apenas porque gostei do nome do arquivo:

grep PageWriteback *.i
...
zbud.i:static inline __attribute__((no_instrument_function)) __attribute__((always_inline)) int PageWriteback(struct page *page) { return (__builtin_constant_p((PG_writeback)) ? constant_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags)) : variable_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags))); }
...

Abra o arquivo para visualização, role até o identificador em questão e pesquise para cima / para trás no arquivo de uma linha que começa com # para ver de onde veio a definição:

# 255 "./include/linux/page-flags.h"

que nos aponta para o mesmo arquivo de origem que Nick encontrou antes .

Como alternativa, você pode pesquisar as linhas de inclusão e / ou o identificador e excluir todas as linhas à direita; a última linha de saída será o arquivo onde o identificador foi definido:

grep -E '^# |PageWriteback' zbud.i | sed '/PageWriteback/,$d' | tail -n 1
...
# 74 "./include/linux/page-flags.h"
# 108 "./include/linux/page-flags.h"
# 255 "./include/linux/page-flags.h"
    
por 27.07.2017 / 03:37