Subversion Repositories HelenOS-historic

Rev

Rev 1434 | Rev 1437 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1434 Rev 1436
Line 270... Line 270...
270
         * Shrinking the area.
270
         * Shrinking the area.
271
         * No need to check for overlaps.
271
         * No need to check for overlaps.
272
         */
272
         */
273
 
273
 
274
        /*
274
        /*
-
 
275
         * Start TLB shootdown sequence.
-
 
276
         */
-
 
277
        tlb_shootdown_start(TLB_INVL_PAGES, AS->asid, area->base + pages*PAGE_SIZE, area->pages - pages);
-
 
278
 
-
 
279
        /*
275
         * Remove frames belonging to used space starting from
280
         * Remove frames belonging to used space starting from
276
         * the highest addresses downwards until an overlap with
281
         * the highest addresses downwards until an overlap with
277
         * the resized address space area is found. Note that this
282
         * the resized address space area is found. Note that this
278
         * is also the right way to remove part of the used_space
283
         * is also the right way to remove part of the used_space
279
         * B+tree leaf list.
284
         * B+tree leaf list.
Line 328... Line 333...
328
                    page_mapping_remove(as, b + i*PAGE_SIZE);
333
                    page_mapping_remove(as, b + i*PAGE_SIZE);
329
                    page_table_unlock(as, false);
334
                    page_table_unlock(as, false);
330
                }
335
                }
331
            }
336
            }
332
        }
337
        }
-
 
338
 
333
        /*
339
        /*
334
         * Invalidate TLB's.
340
         * Finish TLB shootdown sequence.
335
         */
341
         */
336
        tlb_shootdown_start(TLB_INVL_PAGES, AS->asid, area->base + pages*PAGE_SIZE, area->pages - pages);
-
 
337
        tlb_invalidate_pages(AS->asid, area->base + pages*PAGE_SIZE, area->pages - pages);
342
        tlb_invalidate_pages(AS->asid, area->base + pages*PAGE_SIZE, area->pages - pages);
338
        tlb_shootdown_finalize();
343
        tlb_shootdown_finalize();
339
    } else {
344
    } else {
340
        /*
345
        /*
341
         * Growing the area.
346
         * Growing the area.
Line 383... Line 388...
383
    }
388
    }
384
 
389
 
385
    base = area->base;
390
    base = area->base;
386
 
391
 
387
    /*
392
    /*
-
 
393
     * Start TLB shootdown sequence.
-
 
394
     */
-
 
395
    tlb_shootdown_start(TLB_INVL_PAGES, AS->asid, area->base, area->pages);
-
 
396
 
-
 
397
    /*
388
     * Visit only the pages mapped by used_space B+tree.
398
     * Visit only the pages mapped by used_space B+tree.
389
     * Note that we must be very careful when walking the tree
399
     * Note that we must be very careful when walking the tree
390
     * leaf list and removing used space as the leaf list changes
400
     * leaf list and removing used space as the leaf list changes
391
     * unpredictibly after each remove. The solution is to actually
401
     * unpredictibly after each remove. The solution is to actually
392
     * not walk the tree at all, but to remove items from the head
402
     * not walk the tree at all, but to remove items from the head
Line 415... Line 425...
415
            }
425
            }
416
            if (!used_space_remove(area, b, i))
426
            if (!used_space_remove(area, b, i))
417
                panic("Could not remove used space.\n");
427
                panic("Could not remove used space.\n");
418
        }
428
        }
419
    }
429
    }
420
    btree_destroy(&area->used_space);
-
 
421
 
430
 
422
    /*
431
    /*
423
     * Invalidate TLB's.
432
     * Finish TLB shootdown sequence.
424
     */
433
     */
425
    tlb_shootdown_start(TLB_INVL_PAGES, AS->asid, area->base, area->pages);
-
 
426
    tlb_invalidate_pages(AS->asid, area->base, area->pages);
434
    tlb_invalidate_pages(AS->asid, area->base, area->pages);
427
    tlb_shootdown_finalize();
435
    tlb_shootdown_finalize();
-
 
436
   
-
 
437
    btree_destroy(&area->used_space);
428
 
438
 
429
    area->attributes |= AS_AREA_ATTR_PARTIAL;
439
    area->attributes |= AS_AREA_ATTR_PARTIAL;
430
   
440
   
431
    if (area->sh_info)
441
    if (area->sh_info)
432
        sh_info_remove_reference(area->sh_info);
442
        sh_info_remove_reference(area->sh_info);