Hi, > >> least cg3.c is doing > >> > >> read dirty bitmap > >> read VRAM > >> clear dirty bitmap > >> > >> which has a race.
> It's much simpler than that, just clear the dirty bitmap bit before > reading the memory. 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 ... Looping twice over all scanlines, with the first loop just figuring which scanlines are modified, then clear dirty bits, then update in a second loop should work I think. It'll duplicate a bunch of code though, because in reality the loop isn't just three lines because of doublescan, interlave and other funky stuff coming from CGA compatibility. Given that probably pretty much every display adapter is affected I'd tend to take Alex patch for 2.9, then sort the mess in the 2.10 devel cycle and revert the patch when done. cheers, Gerd