I haven't followed this thread closely, but I don't understand this response.

  Nate

> Yes, because if you're mmapping a file, it's likely that the file is
> slightly smaller than the size of memory allocated.
>
> Ali
> On Jan 11, 2011, at 5:50 PM, Lisa Hsu wrote:
>
> I just had this break a few checkpoints myself - and it's not a big deal
> really because it's easily fixup-able...but I wonder whether you really want
> to serialize the size of the physmem - let's say you run a checkpointing run
> with physmem N gigs and then you restore with physmem M gigs...I don't see
> why the size of the physmem needs to be serialized or unserialized at all
> and overwrite the simulation-configured size.  Is there a compelling reason
> to do so?
> Lisa
>
> On Thu, Dec 9, 2010 at 8:51 PM, Beckmann, Brad <brad.beckm...@amd.com>
> wrote:
>>
>> Hi Ali,
>>
>> This is changset 7730 which also breaks all previous checkpoints because
>> it requires phsymem to serialize and unserialize the variable "_size".
>>
>> Brad
>>
>> > -----Original Message-----
>> > From: m5-dev-boun...@m5sim.org [mailto:m5-dev-boun...@m5sim.org] On
>> > Behalf Of Ali Saidi
>> > Sent: Monday, November 08, 2010 11:59 AM
>> > To: m5-dev@m5sim.org
>> > Subject: [m5-dev] changeset in m5: Mem: Finish half-baked support for
>> > mmaping file...
>> >
>> > changeset 982b4c6c1470 in /z/repo/m5
>> > details: http://repo.m5sim.org/m5?cmd=changeset;node=982b4c6c1470
>> > description:
>> >       Mem: Finish half-baked support for mmaping file in physmem.
>> >
>> >       Physmem has a parameter to be able to mem map a file, however
>> >       it isn't actually used. This changeset utilizes the parameter
>> >       so a file can be mmapped.
>> >
>> > diffstat:
>> >
>> >  configs/common/FSConfig.py |   8 ++++++-
>> >  src/mem/physical.cc        |  48 +++++++++++++++++++++++++++++++------
>> > --------
>> >  src/mem/physical.hh        |   8 +++---
>> >  3 files changed, 44 insertions(+), 20 deletions(-)
>> >
>> > diffs (176 lines):
>> >
>> > diff -r d3c006ecccd3 -r 982b4c6c1470 configs/common/FSConfig.py
>> > --- a/configs/common/FSConfig.py      Mon Nov 08 13:58:24 2010 -0600
>> > +++ b/configs/common/FSConfig.py      Mon Nov 08 13:58:24 2010 -0600
>> > @@ -200,9 +200,12 @@
>> >      self.membus.badaddr_responder.warn_access = "warn"
>> >      self.bridge = Bridge(delay='50ns', nack_delay='4ns')
>> >      self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()), zero
>> > = True)
>> > +    self.diskmem = PhysicalMemory(range = AddrRange(Addr('128MB'),
>> > size = '128MB'),
>> > +                                  file = disk('ael-arm.ext2'))
>> >      self.bridge.side_a = self.iobus.port
>> >      self.bridge.side_b = self.membus.port
>> >      self.physmem.port = self.membus.port
>> > +    self.diskmem.port = self.membus.port
>> >
>> >      self.mem_mode = mem_mode
>> >
>> > @@ -224,7 +227,10 @@
>> >
>> >      self.intrctrl = IntrControl()
>> >      self.terminal = Terminal()
>> > -    self.boot_osflags = 'earlyprintk mem=128MB console=ttyAMA0
>> > lpj=19988480 norandmaps'
>> > +    self.kernel = binary('vmlinux.arm')
>> > +    self.boot_osflags = 'earlyprintk mem=128MB console=ttyAMA0
>> > lpj=19988480' + \
>> > +                        ' norandmaps
>> > slram=slram0,0x8000000,+0x8000000' +      \
>> > +                        ' mtdparts=slram0:- rw loglevel=8
>> > root=/dev/mtdblock0'
>> >
>> >      return self
>> >
>> > diff -r d3c006ecccd3 -r 982b4c6c1470 src/mem/physical.cc
>> > --- a/src/mem/physical.cc     Mon Nov 08 13:58:24 2010 -0600
>> > +++ b/src/mem/physical.cc     Mon Nov 08 13:58:24 2010 -0600
>> > @@ -31,6 +31,7 @@
>> >
>> >  #include <sys/types.h>
>> >  #include <sys/mman.h>
>> > +#include <sys/user.h>
>> >  #include <errno.h>
>> >  #include <fcntl.h>
>> >  #include <unistd.h>
>> > @@ -41,6 +42,7 @@
>> >  #include <string>
>> >
>> >  #include "arch/registers.hh"
>> > +#include "base/intmath.hh"
>> >  #include "base/misc.hh"
>> >  #include "base/random.hh"
>> >  #include "base/types.hh"
>> > @@ -56,26 +58,39 @@
>> >  PhysicalMemory::PhysicalMemory(const Params *p)
>> >      : MemObject(p), pmemAddr(NULL), pagePtr(0),
>> >        lat(p->latency), lat_var(p->latency_var),
>> > -      cachedSize(params()->range.size()), cachedStart(params()-
>> > >range.start)
>> > +      _size(params()->range.size()), _start(params()->range.start)
>> >  {
>> > -    if (params()->range.size() % TheISA::PageBytes != 0)
>> > +    if (size() % TheISA::PageBytes != 0)
>> >          panic("Memory Size not divisible by page size\n");
>> >
>> >      if (params()->null)
>> >          return;
>> >
>> > -    int map_flags = MAP_ANON | MAP_PRIVATE;
>> > -    pmemAddr = (uint8_t *)mmap(NULL, params()->range.size(),
>> > -                               PROT_READ | PROT_WRITE, map_flags, -1,
>> > 0);
>> > +
>> > +    if (params()->file == "") {
>> > +        int map_flags = MAP_ANON | MAP_PRIVATE;
>> > +        pmemAddr = (uint8_t *)mmap(NULL, size(),
>> > +                                   PROT_READ | PROT_WRITE, map_flags,
>> > -1, 0);
>> > +    } else {
>> > +        int map_flags = MAP_PRIVATE;
>> > +        int fd = open(params()->file.c_str(), O_RDONLY);
>> > +        _size = lseek(fd, 0, SEEK_END);
>> > +        lseek(fd, 0, SEEK_SET);
>> > +        pmemAddr = (uint8_t *)mmap(NULL, roundUp(size(), PAGE_SIZE),
>> > +                                   PROT_READ | PROT_WRITE, map_flags,
>> > fd, 0);
>> > +    }
>> >
>> >      if (pmemAddr == (void *)MAP_FAILED) {
>> >          perror("mmap");
>> > -        fatal("Could not mmap!\n");
>> > +        if (params()->file == "")
>> > +            fatal("Could not mmap!\n");
>> > +        else
>> > +            fatal("Could not find file: %s\n", params()->file);
>> >      }
>> >
>> >      //If requested, initialize all the memory to 0
>> >      if (p->zero)
>> > -        memset(pmemAddr, 0, p->range.size());
>> > +        memset(pmemAddr, 0, size());
>> >  }
>> >
>> >  void
>> > @@ -94,8 +109,7 @@
>> >  PhysicalMemory::~PhysicalMemory()
>> >  {
>> >      if (pmemAddr)
>> > -        munmap((char*)pmemAddr, params()->range.size());
>> > -    //Remove memPorts?
>> > +        munmap((char*)pmemAddr, size());
>> >  }
>> >
>> >  Addr
>> > @@ -408,7 +422,7 @@
>> >  {
>> >      snoop = false;
>> >      resp.clear();
>> > -    resp.push_back(RangeSize(start(), params()->range.size()));
>> > +    resp.push_back(RangeSize(start(), size()));
>> >  }
>> >
>> >  unsigned
>> > @@ -463,6 +477,7 @@
>> >      string filename = name() + ".physmem";
>> >
>> >      SERIALIZE_SCALAR(filename);
>> > +    SERIALIZE_SCALAR(_size);
>> >
>> >      // write memory file
>> >      string thefile = Checkpoint::dir() + "/" + filename.c_str();
>> > @@ -477,8 +492,7 @@
>> >          fatal("Insufficient memory to allocate compression state for
>> > %s\n",
>> >                  filename);
>> >
>> > -    if (gzwrite(compressedMem, pmemAddr, params()->range.size()) !=
>> > -        (int)params()->range.size()) {
>> > +    if (gzwrite(compressedMem, pmemAddr, size()) != (int)size()) {
>> >          fatal("Write failed on physical memory checkpoint file
>> > '%s'\n",
>> >                filename);
>> >      }
>> > @@ -522,9 +536,13 @@
>> >      // unmap file that was mmaped in the constructor
>> >      // This is done here to make sure that gzip and open don't muck
>> > with our
>> >      // nice large space of memory before we reallocate it
>> > -    munmap((char*)pmemAddr, params()->range.size());
>> > +    munmap((char*)pmemAddr, size());
>> >
>> > -    pmemAddr = (uint8_t *)mmap(NULL, params()->range.size(),
>> > +    UNSERIALIZE_SCALAR(_size);
>> > +    if (size() > params()->range.size())
>> > +        fatal("Memory size has changed!\n");
>> > +
>> > +    pmemAddr = (uint8_t *)mmap(NULL, size(),
>> >          PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
>> >
>> >      if (pmemAddr == (void *)MAP_FAILED) {
>> > @@ -538,7 +556,7 @@
>> >          fatal("Unable to malloc memory to read file %s\n", filename);
>> >
>> >      /* Only copy bytes that are non-zero, so we don't give the VM
>> > system hell */
>> > -    while (curSize < params()->range.size()) {
>> > +    while (curSize < size()) {
>> >          bytesRead = gzread(compressedMem, tempPage, chunkSize);
>> >          if (bytesRead == 0)
>> >              break;
>> > diff -r d3c006ecccd3 -r 982b4c6c1470 src/mem/physical.hh
>> > --- a/src/mem/physical.hh     Mon Nov 08 13:58:24 2010 -0600
>> > +++ b/src/mem/physical.hh     Mon Nov 08 13:58:24 2010 -0600
>> > @@ -149,12 +149,12 @@
>> >      std::vector<MemoryPort*> ports;
>> >      typedef std::vector<MemoryPort*>::iterator PortIterator;
>> >
>> > -    uint64_t cachedSize;
>> > -    uint64_t cachedStart;
>> > +    uint64_t _size;
>> > +    uint64_t _start;
>> >    public:
>> >      Addr new_page();
>> > -    uint64_t size() { return cachedSize; }
>> > -    uint64_t start() { return cachedStart; }
>> > +    uint64_t size() { return _size; }
>> > +    uint64_t start() { return _start; }
>> >
>> >    public:
>> >      typedef PhysicalMemoryParams Params;
>> > _______________________________________________
>> > m5-dev mailing list
>> > m5-dev@m5sim.org
>> > http://m5sim.org/mailman/listinfo/m5-dev
>>
>>
>> _______________________________________________
>> m5-dev mailing list
>> m5-dev@m5sim.org
>> http://m5sim.org/mailman/listinfo/m5-dev
>>
>
> _______________________________________________
> m5-dev mailing list
> m5-dev@m5sim.org
> http://m5sim.org/mailman/listinfo/m5-dev
>
>
> _______________________________________________
> m5-dev mailing list
> m5-dev@m5sim.org
> http://m5sim.org/mailman/listinfo/m5-dev
>
>
_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to