[X-tt-list:104] Re: (patch seq: 5752) A patch for preventing XAA crash

Zurück zum Archiv-Index

David Dawes dawes****@XFree*****
2003年 8月 15日 (金) 11:23:53 JST


On Thu, Aug 14, 2003 at 09:55:37PM -0400, David Dawes wrote:
>On Thu, Aug 14, 2003 at 04:17:41PM -0700, Mark Vojkovich wrote:
>>On Thu, 14 Aug 2003, David Dawes wrote:
>>
>>> >
>>> >   XAACacheTile() should have never been called if no slots existed.
>>> >MaxCacheableTileWidth and MaxCacheableTileHeight should have been
>>> >consulted at some point.
>>> 
>>> OK, we need to see what those values are at this point.  XAAPaintWindow(),
>>> where the crash is apparently happening, does have a test for them, so
>>> maybe there's getting set incorrectly somewhere.
>>> 
>>>         if(infoRec->UsingPixmapCache &&
>>>             infoRec->FillCacheBltRects && !NoCache &&
>>>             ((what == PW_BORDER) ||
>>>                 (pPix->drawable.height != pWin->drawable.height) ||
>>>                 (pPix->drawable.width != pWin->drawable.width)) &&
>>>             (pPix->drawable.height <= infoRec->MaxCacheableTileHeight) &&
>>>             (pPix->drawable.width <= infoRec->MaxCacheableTileWidth)) {
>>> 
>>>              XAACacheInfoPtr pCache =
>>>                         (*infoRec->CacheTile)(infoRec->pScrn, pPix);
>>>              (*infoRec->FillCacheBltRects)(infoRec->pScrn, GXcopy, ~0,
>>>                                         nBox, pBox, xorg, yorg, pCache);
>>>              return;
>>>         }
>>> 
>>> This check assumes that if there are no 256x256 slots there won't
>>> be any 512x512 slots.  I'm not 100% sure if it can ever happen that
>>> there are 512x512 slots but no 256x256 slots.  If the debugging
>>> could be extended to print both infoRec->MaxCacheableTileHeight
>>> and Num512, it should clarify if this is the problem or not.
>>
>>   It's expected that if there are 512x512 slots there will be
>>smaller slots.  The logic that sets up the slots in XAAInitPixmapCache
>>is supposed to ensure that.
>
>I played around a little with some unusual cases.  If the memory is very
>fragmented, I can find a case where there are 4 512x512 slots and no
>256x256 slots.  The trick here is to have enough boxes for 4 512 slots
>and lots of 128 slots, but none for any 256 slots to get allocated in
>the first round.  If there are enough 128x128 slots, the target for
>512x512 slots will remain at 4 and none of them get split into 256x256
>slots.
>
>A case that gives this result is 4 512x512 boxes and 70 250x250 boxes:
>
>128: 32, 256: 0, 512: 4, partial: 288
>max cacheable: 512x512

Here's a patch that should catch this type of case.  Let us know if this
is enough to fix the crash.

David
-------------- next part --------------
Index: xaaPCache.c
===================================================================
RCS file: /home/x-cvs/xc/programs/Xserver/hw/xfree86/xaa/xaaPCache.c,v
retrieving revision 1.30
diff -u -r1.30 xaaPCache.c
--- xaaPCache.c	25 Sep 2000 23:56:14 -0000	1.30
+++ xaaPCache.c	15 Aug 2003 02:18:24 -0000
@@ -763,6 +763,7 @@
 	1) Don't take up more than half the memory.
 	2) Don't bother if you can't get at least four.
 	3) Don't make more than MAX_512.
+	4) Don't have any of there are no 256x256s.
 
      256x256 -
 	1) Don't take up more than a quarter of the memory enless there
@@ -785,6 +786,13 @@
     if(!Target512) Target256 = ntotal >> 3;
     else Target256 = ntotal >> 4;
     if(Target256 < 4) Target256 = 0;
+
+    if(Num512 && !Num256) {
+	while(Num512 && Num256 < Target256) {
+	   SubdivideList(&List512, &List256);
+	   Num256 += 4; Num512--;
+	}
+    }
 
     if(!Num512) { /* no room */
     } else if((Num512 < 4) || (!Target512)) {


X-tt-list メーリングリストの案内
Zurück zum Archiv-Index