源码定位
https://elixir.bootlin.com/linux/v5.10/source/fs/pipe.c#L624
首先可以看到pipe的ioctl接口,如果cmd是IOC_WATCH_QUEUE_SET_SIZE的话,会走到watch_queue_set_size这个函数:
可以看到限制页数为512,然后有如下计算:
一个page有0x20个note,所以总的page要有新的加上watch_queue的再-1;
然后为什么还要除以0x20?
然后user_bufs是计算一共有多少个pipe_buffer项?
之后看一下pipe_resize_ring:
就是重新分配pipe_buffer然后把原来的数据拷贝进去:
之后分配大量的page结构体: