tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

DRMKMS: bug in pseudo linux si_meminfo



When initializing drmkms, the kernel prints bogus things like:

[     4.193896] Zone  kernel: Available graphics memory: 9007199254113272 KiB
[     4.193896] Zone   dma32: Available graphics memory: 2097152 KiB

The reason is to be found in

sys/external/bsd/drm2/include/linux/mm.h

which fills a pseudo Linux sysinfo struct (limited to members used).

But:
	- Linux sysinfo(2) specifies that totalram is in bytes, while
	totalhigh is in pages. In mm.h, totalram is initialized in
	pages (not bytes) and totalhigh is defined with kernel_map->size,
	that is a virtual address (?), converted in pages;

	- then in:

sys/external/bsd/drm2/dist/drm/ttm/ttm_memory.c:320
	
	mem = si->totalram - si->totalhigh;

	The problem is that this is substracting oranges to apples. On
	my node I have these (added aprint_*):

[     4.224447] si_meminfo: totalram: 1756268; totalhigh: 8479211520;
memunit: 4096

	it's clear that totalram (pages) - totalhigh (changed to pages
	but virtual memory) leads to a negative result then casted
	to unsigned long long yielding the bogus number seen.

Furthermore, when setting zone->max_mem, the memory is divided by
two (>> 1)? But why? Is it to force reserving at most only half of
what is available to graphics? A comment would be welcome explaining the
reason why.

This explains the number found for dma32: since the available memory
exceeds 2^32, 2^32 is taken as the max but, once more, divided by 2.

Do somebody know the Linux guts enough to clarify what totalhigh
refers to? (certainly not a virtual address)

Isn't it dangerous to change the "units" of totalram (bytes in Linux,
but here pages) since (I have not traced the use of the pseudo structure
in the remaining code) if values are used elsewhere in the drivers,
it is likely to wreak havoc the linux code.
-- 
        Thierry Laronde <tlaronde +AT+ kergis +dot+ com>
                     http://www.kergis.com/
                    http://kertex.kergis.com/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89  250D 52B1 AE95 6006 F40C


Home | Main Index | Thread Index | Old Index