Changeset ae6021d in mainline for kernel/generic/src


Ignore:
Timestamp:
2016-09-02T15:44:09Z (9 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e755b3f
Parents:
c1f7a315
Message:

Associate each paged as_area with its memory object upon creation

This will allow us to have one pager fibril per task rather than one
per paged area.

Location:
kernel/generic/src/mm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/as.c

    rc1f7a315 rae6021d  
    21872187
    21882188sysarg_t sys_as_area_create(uintptr_t base, size_t size, unsigned int flags,
    2189     uintptr_t bound, int pager)
     2189    uintptr_t bound, as_area_pager_info_t *pager_info)
    21902190{
    21912191        uintptr_t virt = base;
     
    21932193        mem_backend_data_t backend_data;
    21942194
    2195         if (pager == AS_AREA_UNPAGED)
     2195        if (pager_info == AS_AREA_UNPAGED)
    21962196                backend = &anon_backend;
    21972197        else {
    21982198                backend = &user_backend;
    2199                 backend_data.pager = pager;
     2199                if (copy_from_uspace(&backend_data.pager_info, pager_info,
     2200                        sizeof(as_area_pager_info_t)) != EOK) {
     2201                        return (sysarg_t) AS_MAP_FAILED;
     2202                }
    22002203        }
    22012204        as_area_t *area = as_area_create(AS, flags, size,
  • kernel/generic/src/mm/backend_user.c

    rc1f7a315 rae6021d  
    3939#include <mm/as.h>
    4040#include <mm/page.h>
     41#include <abi/mm/as.h>
    4142#include <abi/ipc/methods.h>
    4243#include <ipc/sysipc.h>
     
    132133                return AS_PF_FAULT;
    133134
     135        as_area_pager_info_t *pager_info = &area->backend_data.pager_info;
     136
    134137        ipc_data_t data = {};
    135138        IPC_SET_IMETHOD(data, IPC_M_PAGE_IN);
    136139        IPC_SET_ARG1(data, upage - area->base);
    137140        IPC_SET_ARG2(data, PAGE_SIZE);
     141        IPC_SET_ARG3(data, pager_info->id1);
     142        IPC_SET_ARG4(data, pager_info->id2);
     143        IPC_SET_ARG5(data, pager_info->id3);
    138144
    139         int rc = ipc_req_internal(area->backend_data.pager, &data);
     145        int rc = ipc_req_internal(pager_info->pager, &data);
    140146
    141147        if (rc != EOK) {
     
    143149                    "Page-in request for page %#" PRIxn
    144150                    " at pager %d failed with error %d.",
    145                     upage, area->backend_data.pager, rc);
     151                    upage, pager_info->pager, rc);
    146152                return AS_PF_FAULT;
    147153        }
Note: See TracChangeset for help on using the changeset viewer.