On 28/03/2017 15:40, Gerd Hoffmann wrote: > Hi, > >>> Well, not *that* simple. vga checks the dirty bitmap with scanline >>> granularity, like that: >>> >>> foreach (scanline) { >>> if (get_dirty(scanline)) >>> update_scanline() >>> } >>> reset_dirty(framebuffer) >>> >>> I suspect simply transforming that to >>> >>> foreach (scanline) { >>> if (test_and_clear_dirty(scanline)) >>> update_scanline() >>> } >>> >>> is not going to fly due to page tracking working with page granularity. >>> With two subsequent scanlines within one page the second scanline will >>> never be updated because updating first clears the dirty bit of the >>> page ... > >> You're right; an alternative is to copy the dirty bitmap to a local one >> and clear the global one (the dirty bitmap for an 8 MB full HD frame >> buffer is just 256 bytes). With the right API to abstract the job, it >> should be relatively easy to fix all adapters. > > Started looking into this. So I guess you are thinking about a variant > of memory_region_test_and_clear_dirty and/or > cpu_physical_memory_test_and_clear_dirty > which returns a bitmap instead of a bool? Plus some helper function > which use the returned bitmap to figure whenever a specific scanline has > been touched or not?
Yes, exactly. Paolo