[haiku-commits] haiku: hrev44773 - src/system/kernel/vm

  • From: korli@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 6 Nov 2012 00:42:50 +0100 (CET)

hrev44773 adds 1 changeset to branch 'master'
old head: 3704c0f8b1bad6ab6cbc6b21d2e33c8bb0dda38e
new head: f5a14b17df1d1d13251f4d86a7ed024b516960ed

----------------------------------------------------------------------------

f5a14b1: vm_page_allocate_page_run: fix for aligned page allocations
  
  * don't enforce a zero boundary or a zero alignment
  * when going to the next range, takes alignment into account.
    It could previously just be enforced again through alignment and loop 
infinite.
  * it should help with some FreeBSD based drivers

                                   [ JÃrÃme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev44773
Commit:      f5a14b17df1d1d13251f4d86a7ed024b516960ed
URL:         http://cgit.haiku-os.org/haiku/commit/?id=f5a14b1
Author:      JÃrÃme Duval <jerome.duval@xxxxxxxxx>
Date:        Mon Nov  5 23:29:57 2012 UTC

----------------------------------------------------------------------------

1 file changed, 7 insertions(+), 4 deletions(-)
src/system/kernel/vm/vm_page.cpp | 11 +++++++----

----------------------------------------------------------------------------

diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp
index 9e4c591..29df4e1 100644
--- a/src/system/kernel/vm/vm_page.cpp
+++ b/src/system/kernel/vm/vm_page.cpp
@@ -3862,13 +3862,13 @@ vm_page_allocate_page_run(uint32 flags, page_num_t 
length,
                        page_num_t offsetStart = start + sPhysicalPageOffset;
 
                        // enforce alignment
-                       if ((offsetStart & alignmentMask) != 0) {
+                       if (alignmentMask != 0 && (offsetStart & alignmentMask) 
!= 0) {
                                offsetStart = ((offsetStart + alignmentMask) & 
~alignmentMask)
                                        - sPhysicalPageOffset;
                        }
 
                        // enforce boundary
-                       if (offsetStart << boundaryShift
+                       if (boundaryShift != 0 && offsetStart << boundaryShift
                                        != (offsetStart + length - 1) << 
boundaryShift) {
                                offsetStart = (offsetStart + length - 1) << 
boundaryShift
                                        >> boundaryShift;
@@ -3887,7 +3887,10 @@ vm_page_allocate_page_run(uint32 flags, page_num_t 
length,
                        }
 
                        dprintf("vm_page_allocate_page_run(): Failed to 
allocate run of "
-                               "length %" B_PRIuPHYSADDR " in second 
iteration!", length);
+                               "length %" B_PRIuPHYSADDR " (%" B_PRIuPHYSADDR 
" %"
+                               B_PRIuPHYSADDR ") in second iteration (align: 
%" B_PRIuPHYSADDR
+                               " boundary: %" B_PRIuPHYSADDR ") !", length, 
requestedStart,
+                               end, restrictions->alignment, 
restrictions->boundary);
 
                        freeClearQueueLocker.Unlock();
                        vm_page_unreserve_pages(&reservation);
@@ -3916,7 +3919,7 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length,
                        freeClearQueueLocker.Lock();
                }
 
-               start += i + 1;
+               start += max_c(i, alignmentMask) + 1;
        }
 }
 


Other related posts: