Changeset fbcdeb8 in mainline for uspace/app/tester


Ignore:
Timestamp:
2011-12-19T17:30:39Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
58f6229
Parents:
24cf31f1
Message:

Remove the two-phase way of creating virtual memory areas (first asking for a mappable address and then mapping it) which was prone to race conditions when two or more calls to as_get_mappable_page() and as_area_create() were interleaved. This for example caused the e1k driver to randomly fail.

The memory area related syscalls and IPC calls have all been altered to accept a special value (void *) -1, representing a demand to atomically search for a mappable address space "hole" and map to it.

Individual changes:

  • IPC_M_SHARE_OUT: the destination address space area is supplied by the kernel, the callee only specifies the lower bound

(the address is returned to the callee via a pointer in an IPC reply argument)

  • IPC_M_SHARE_IN: the destination address space ares is supplied by the kernel, the callee only specifies the lower bound

(the address is returned to the caller as usual via an IPC argument)

  • SYS_AS_GET_UNMAPPED_AREA was removed
  • dummy implementations of SYS_PHYSMEM_UNMAP and SYS_IOSPACE_DISABLE were added for the sake of symmetry (they do nothing yet)
  • SYS_PHYSMEM_MAP and SYS_DMAMEM_MAP were altered to accept (void *) -1 as address space area base and a lower bound
  • kernel as_area_create() and as_area_share() were altered to accept (void *) -1 as address space area base and a lower bound
  • uspace libraries and programs were altered to reflect the new API
Location:
uspace/app/tester/mm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/tester/mm/common.c

    r24cf31f1 rfbcdeb8  
    342342        link_initialize(&area->link);
    343343       
    344         /* Map the memory area */
    345         void *addr = as_get_mappable_page(size);
    346         if (addr == NULL) {
     344        area->addr = as_area_create((void *) -1, size,
     345            AS_AREA_WRITE | AS_AREA_READ);
     346        if (area->addr == (void *) -1) {
    347347                free(area);
    348348                check_consistency("map_area (a)");
    349                 return NULL;
    350         }
    351        
    352         area->addr = as_area_create(addr, size, AS_AREA_WRITE | AS_AREA_READ);
    353         if (area->addr == (void *) -1) {
    354                 free(area);
    355                 check_consistency("map_area (b)");
    356349                return NULL;
    357350        }
  • uspace/app/tester/mm/mapping1.c

    r24cf31f1 rfbcdeb8  
    3535#include "../tester.h"
    3636
    37 #define BUFFER1_PAGES 4
    38 #define BUFFER2_PAGES 2
     37#define BUFFER1_PAGES  4
     38#define BUFFER2_PAGES  2
    3939
    4040static void *create_as_area(size_t size)
    4141{
    42         void *result = as_get_mappable_page(size);
    4342        TPRINTF("Creating AS area...\n");
    44         if (as_area_create(result, size,
    45             AS_AREA_READ | AS_AREA_WRITE) != result) {
     43       
     44        void *result = as_area_create((void *) -1, size,
     45            AS_AREA_READ | AS_AREA_WRITE);
     46        if (result == (void *) -1)
    4647                return NULL;
    47         }
     48       
    4849        return result;
    4950}
Note: See TracChangeset for help on using the changeset viewer.