Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=71c6efd9930bd87249d007120425341d1293303d
Commit:     71c6efd9930bd87249d007120425341d1293303d
Parent:     33a9f640a2511155517d316e696654b84dd48654
Author:     Orczykowski, Juergen <[EMAIL PROTECTED]>
AuthorDate: Tue May 8 00:37:25 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue May 8 11:15:26 2007 -0700

    intelfb: fix ring space calculation
    
    If there is less than RING_MIN_FREE available in the ring buffer,
    dinfo->ring_space is set to a big value forcing wait_ring to return.
    
    Fix by making ring space = 0 if ring space < RING_MIN_FREE.
    
    Signed-off-by: Dave Airlie <[EMAIL PROTECTED]>
    Signed-off-by: Antonino Daplas <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/video/intelfb/intelfbhw.c |   34 +++++++++++++++++++++-------------
 1 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/drivers/video/intelfb/intelfbhw.c 
b/drivers/video/intelfb/intelfbhw.c
index c1eb18b..16bc8d7 100644
--- a/drivers/video/intelfb/intelfbhw.c
+++ b/drivers/video/intelfb/intelfbhw.c
@@ -1428,6 +1428,24 @@ static void refresh_ring(struct intelfb_info *dinfo);
 static void reset_state(struct intelfb_info *dinfo);
 static void do_flush(struct intelfb_info *dinfo);
 
+static  u32 get_ring_space(struct intelfb_info *dinfo)
+{
+       u32 ring_space;
+
+       if (dinfo->ring_tail >= dinfo->ring_head)
+               ring_space = dinfo->ring.size -
+                       (dinfo->ring_tail - dinfo->ring_head);
+       else
+               ring_space = dinfo->ring_head - dinfo->ring_tail;
+
+       if (ring_space > RING_MIN_FREE)
+               ring_space -= RING_MIN_FREE;
+       else
+               ring_space = 0;
+
+       return ring_space;
+}
+
 static int
 wait_ring(struct intelfb_info *dinfo, int n)
 {
@@ -1442,13 +1460,8 @@ wait_ring(struct intelfb_info *dinfo, int n)
        end = jiffies + (HZ * 3);
        while (dinfo->ring_space < n) {
                dinfo->ring_head = INREG(PRI_RING_HEAD) & RING_HEAD_MASK;
-               if (dinfo->ring_tail + RING_MIN_FREE < dinfo->ring_head)
-                       dinfo->ring_space = dinfo->ring_head
-                               - (dinfo->ring_tail + RING_MIN_FREE);
-               else
-                       dinfo->ring_space = (dinfo->ring.size +
-                                            dinfo->ring_head)
-                               - (dinfo->ring_tail + RING_MIN_FREE);
+               dinfo->ring_space = get_ring_space(dinfo);
+
                if (dinfo->ring_head != last_head) {
                        end = jiffies + (HZ * 3);
                        last_head = dinfo->ring_head;
@@ -1513,12 +1526,7 @@ refresh_ring(struct intelfb_info *dinfo)
 
        dinfo->ring_head = INREG(PRI_RING_HEAD) & RING_HEAD_MASK;
        dinfo->ring_tail = INREG(PRI_RING_TAIL) & RING_TAIL_MASK;
-       if (dinfo->ring_tail + RING_MIN_FREE < dinfo->ring_head)
-               dinfo->ring_space = dinfo->ring_head
-                       - (dinfo->ring_tail + RING_MIN_FREE);
-       else
-               dinfo->ring_space = (dinfo->ring.size + dinfo->ring_head)
-                       - (dinfo->ring_tail + RING_MIN_FREE);
+       dinfo->ring_space = get_ring_space(dinfo);
 }
 
 static void
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to