- 论坛徽章:
- 0
|
本帖最后由 gaoping561 于 2010-09-03 14:58 编辑
- int
- pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
- resource_size_t size, resource_size_t align,
- resource_size_t min, unsigned int type_mask,
- void (*alignf)(void *, struct resource *, resource_size_t,
- resource_size_t),
- void *alignf_data)
- {
- int i, ret = -ENOMEM;
- resource_size_t max = -1;
- type_mask |= IORESOURCE_IO | IORESOURCE_MEM;
- /* don't allocate too high if the pref mem doesn't support 64bit*/
- if (!(res->flags & IORESOURCE_MEM_64))
- max = PCIBIOS_MAX_MEM_32;
复制代码 找到resource分配的证据了,在2.6.31内核中,如果32bit的BAR,不会分配超过4G的resource,max=PCIBIOS_MAX_MEM_32=0xffffffff,但是在2.6.18中没有这个判断,max=-1=0xffffffffffffffff; 2.6.18中不支持intel的iommu, DMA靠swiotlb性能就打折扣了。所以可以说32bit的PCI设备在64bit的2.6.18也就是rhel5.3中使用都是危险的。
另外pci_mem_start = 0xaeedbabe,这个是怎么来的,在e820.c 这个文件中,这个文件又是个什么东西呢,哪位高人指点下。
最后还有一个问题要确认,MSI-X 中断里的address也只有32bit,这个MSI-X包会发给x86的中断控制器,这个中断控制器的地址不会大于4G吧? |
|