lkml.org 
[lkml]   [1998]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: 2.1.76, nfs client, and memory fragmentation
Date
From
This copy of the patch might work; I hope I caught the previous
last-patch-was-broken message before it escaped...

Once I mail this, I'll even try it myself...

Keith


*** mm/page_alloc.c.old Thu Jan 1 17:30:55 1998
--- mm/page_alloc.c Sun Jan 4 00:29:49 1998
***************
*** 62,75 ****
head->prev = memory_head(head);
}

static inline void add_mem_queue(struct free_area_struct * head, struct page * entry)
{
! struct page * next = head->next;

! entry->prev = memory_head(head);
! entry->next = next;
! next->prev = entry;
! head->next = entry;
}

static inline void remove_mem_queue(struct page * entry)
--- 62,87 ----
head->prev = memory_head(head);
}

+
+ /* NOTE: this should be #ifdefed to make sense on all architectures */
+ #define KeepTogether(entry) PageDMA(entry)
static inline void add_mem_queue(struct free_area_struct * head, struct page * entry)
{
! if (!KeepTogether(entry)) {
! struct page * next = head->next;

! entry->prev = memory_head(head);
! entry->next = next;
! next->prev = entry;
! head->next = entry;
! } else {
! struct page * prev = head->prev;
!
! entry->next = memory_head(head);
! entry->prev = prev;
! prev->next = entry;
! head->prev = entry;
! }
}

static inline void remove_mem_queue(struct page * entry)
***************
*** 161,176 ****
change_bit((index) >> (1+(order)), (area)->map)
#define CAN_DMA(x) (PageDMA(x))
#define ADDRESS(x) (PAGE_OFFSET + ((x) << PAGE_SHIFT))
! #define RMQUEUE(order, maxorder, dma) \
! do { struct free_area_struct * area = free_area+order; \
! unsigned long new_order = order; \
do { struct page *prev = memory_head(area), *ret = prev->next; \
while (memory_head(area) != ret) { \
if (new_order >= maxorder && ret->next == prev) \
break; \
if (!dma || CAN_DMA(ret)) { \
unsigned long map_nr = ret->map_nr; \
! (prev->next = ret->next)->prev = prev; \
MARK_USED(map_nr, new_order, area); \
nr_free_pages -= 1 << order; \
EXPAND(ret, map_nr, order, new_order, area); \
--- 173,206 ----
change_bit((index) >> (1+(order)), (area)->map)
#define CAN_DMA(x) (PageDMA(x))
#define ADDRESS(x) (PAGE_OFFSET + ((x) << PAGE_SHIFT))
! #define RMQUEUE(order, maxorder, dma) { \
! if (order<2 && !dma) { \
! struct free_area_struct * area = free_area+order; \
! unsigned long new_order = order; \
do { struct page *prev = memory_head(area), *ret = prev->next; \
while (memory_head(area) != ret) { \
+ unsigned long map_nr = ret->map_nr; \
if (new_order >= maxorder && ret->next == prev) \
break; \
+ (prev->next = ret->next)->prev = prev; \
+ MARK_USED(map_nr, new_order, area); \
+ nr_free_pages -= 1 << order; \
+ EXPAND(ret, map_nr, order, new_order, area); \
+ spin_unlock_irqrestore(&page_alloc_lock, flags); \
+ return ADDRESS(map_nr); \
+ } \
+ new_order++; area++; \
+ } while (new_order < NR_MEM_LISTS); \
+ } else { \
+ struct free_area_struct * area = free_area+order; \
+ unsigned long new_order = order; \
+ do { struct page *prev = memory_head(area), *ret = prev->prev; \
+ while (memory_head(area) != ret) { \
+ if (new_order >= maxorder && ret->prev == prev) \
+ break; \
if (!dma || CAN_DMA(ret)) { \
unsigned long map_nr = ret->map_nr; \
! (prev->prev = ret->prev)->next = prev; \
MARK_USED(map_nr, new_order, area); \
nr_free_pages -= 1 << order; \
EXPAND(ret, map_nr, order, new_order, area); \
***************
*** 178,188 ****
return ADDRESS(map_nr); \
} \
prev = ret; \
! ret = ret->next; \
} \
new_order++; area++; \
} while (new_order < NR_MEM_LISTS); \
! } while (0)

#define EXPAND(map,index,low,high,area) \
do { unsigned long size = 1 << high; \
--- 208,219 ----
return ADDRESS(map_nr); \
} \
prev = ret; \
! ret = ret->prev; \
} \
new_order++; area++; \
} while (new_order < NR_MEM_LISTS); \
! } }
!

#define EXPAND(map,index,low,high,area) \
do { unsigned long size = 1 << high; \

\
 
 \ /
  Last update: 2005-03-22 13:41    [W:0.311 / U:0.240 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site