Interesting. I cannot reproduce the malloc() problem. I have no issues 
running your example with uncommented malloc:

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

int main()
{
size_t size = 512 * 1024 * 1024;
printf("Hello from main\n");
printf("allocation %lx start\n", size);
int *p = (int *)malloc(size); // FAIL
//int *p = (int *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | 
MAP_ANONYMOUS, -1, 0); // OK
printf("allocation %lx = %p\n", size, p);
*(p) = 512;
printf("access done\n");

return 0;
}

OSv v0.53.0-107-g4f59f284

eth0: 192.168.122.15

Booted up in 135.90 ms

Cmdline: /test_large --help

Hello from main

allocation 20000000 start

allocation 20000000 = 0xffff800001b0d040

access done

As you can see the address returned is a virtual one. Can you email your 
thread stack trace when it crashes in your case?

As far as why we commit the memory for all malloc I can not answer this and 
others might be able to address why it was designed like this. 

This might be a relevant issue - 
https://github.com/cloudius-systems/osv/issues/854. I guess we might change 
implementation of malloc_large() and for large sizes create a VMA like for 
mmap. But then malloc is used all over the place in kernel code so I wonder 
if we would not have issues like nested faults - see this - 
https://github.com/cloudius-systems/osv/issues/143 - it has some background 
between malloc() and mmap() handling in OSv.

Waldek

On Monday, September 9, 2019 at 7:41:31 AM UTC-4, pusno...@gmail.com wrote:
>
> Hi, 
> I found malloc returns physical address in mempool area and does not 
> perform demand paging (only mmap does).
> Is there any reason for the design choice?
> OSv fails, even if it only uses small portion of allocated memory.
>
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/mman.h>
>
> int main()
> {
> size_t size = 512 * 1024 * 1024;
> printf("Hello from main\n");
> printf("allocation %x start\n", size);
> //int *p = (int *)malloc(size); // FAIL
> int *p = (int *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | 
> MAP_ANONYMOUS, -1, 0); // OK
> printf("allocation %x = %p\n", size, p);
> *(p) = 512;
> printf("access done\n");
>
> return 0;
> }
>
>
> Thanks.
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/e43978ce-23a0-4023-ae7e-17dba12ef379%40googlegroups.com.

Reply via email to