[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: load_region() patch



Hi there!

I'm currently in the process of putting together mh-mint 1.12h3.

Did anyone actually try the following patch?  I'm unsure about whether
I should include it in the release.  (For now, I've just applied
Torsten's quick fix from
<9412271723.AB05363@kassandra.techfak.uni-bielefeld.de>).

Thanks,
Michael

Juergen Lock wrote:
> 
> In article <9412271723.AB05363@kassandra.techfak.uni-bielefeld.de> you write:
> > Ok, looks like I've got it. Puuuuhhhh... :)
> 
> hmm looks like my test-patch mail hung again...  did you get it now?
> >
> > To describe what's going on: At the beginning of create_base() in mem.c the
> >maximum available memory size `len' is determined plus the map where to find
> >it. If this does not fit to the program wanting to be loaded into alternate
> >ram it is set to core memory immediately.
> >
> > Now comes a thing which I don't unterstand: When actually allocating memory
> >from this map later `normal' programs always allocate `len' bytes, but shared
> >text programs allocate `len + fh->ftext + KERNEL_MEM'.
> 
>  shared text programs whose text is not yet loaded actually...  and
> KERNEL_MEM is only spare in case the text loading etc. needs a new
> nalloc arena.
> 
> > Don't whow where the
> >point of making is that difficult is, but normally it works because some
> >lines earlier `len' is decremented by exactly `fh->ftext + KERNEL_MEM' bytes
> >for all shared text programs.
> >
> > This decrementing is bound to some conditions dealing with alternate memory,
> 
>  yep, that the text cannot go in the other map...  (think of gcc-cc1...)
> 
> >and here comes the crack: None of this condition must necessary be true if
> >the program is too large to fit into alternate memory and therefore all
> >lengths and maps are set up to deal with core memory already. Thus this
> >decrementation will never happen and thus when allocating the memory `fh->
> >ftext + KERNEL_MEM' will be be added again, resulting in a request bigger
> >than the largest block and thus fail. :(
> 
>  and this was missing: to actually try placing the text in the other
> map later... :/  (and another sanity check.)
> 
> Index: mem.c
> @@ -1170,6 +1170,13 @@
>  /* make sure that a little bit of memory is left over */
>  	if (len > 2*KEEP_MEM) {
>  		len -= KEEP_MEM;
> +	} else if (s && !s->text &&
> +	    (!(flags & F_ALTLOAD) || map == alt || altsize < fh->ftext)) {
> +		len = 0;
> +		if (!ismax) {
> +			ismax = -1;
> +			goto again1;
> +		}
>  	}
>  
>  	if (s && !s->text &&
> @@ -1252,14 +1259,21 @@
>  	if (s && !s->f) {
>  		if (!s->text) {
>  			m = addr2mem(alloc_region(map, len + fh->ftext + KERNEL_MEM, protmode));
> -			if (!m ||
> -			    (((len > minalt &&
> -				((flags & F_MINALT) < F_MINALT) &&
> -				max_rsize (map, -1) < fh->ftext) ||
> -			      0 == (s->text = addr2mem(alloc_region(map, fh->ftext, PROT_P))) ||
> -			      (m->next == s->text &&
> -				!(detach_region (curproc, s->text), s->text = 0))) &&
> -			     shrink_region(m, fh->ftext))) {
> +			if (!m && (flags & F_ALTLOAD)) {
> +				if (map == core && altsize >= fh->ftext)
> +				      s->text = addr2mem(alloc_region(alt, fh->ftext, PROT_P));
> +				else if (map == alt && coresize >= fh->ftext)
> +				      s->text = addr2mem(alloc_region(core, fh->ftext, PROT_P));
> +			}
> +			if (!s->text &&
> +			    (!m ||
> +			      (((len > minalt &&
> +				 ((flags & F_MINALT) < F_MINALT) &&
> +				 max_rsize (map, -1) < fh->ftext) ||
> +				0 == (s->text = addr2mem(alloc_region(map, fh->ftext, PROT_P))) ||
> +				(m->next == s->text &&
> +				 !(detach_region (curproc, s->text), s->text = 0))) &&
> +			       shrink_region(m, fh->ftext)))) {
>  				if (m)
>  					detach_region(curproc, m);
>  				kfree (s);
> 
>  (warning i cannot test this, which is why i sent it to you first :)
> >
> > I'm a bit worried why things look so strange and much more difficult than I
> >would have expected them to be, which is why I don't really want to judge
> >about all this decrementing and adding and why these conditions dealing with
> >alternate memory ...
> 
>  well thats what you pay when you have to cram all processes in one
> address space, a 1000 kludges...
> 
>  anyway have fun,
> 	Juergen
> 
> 


-- 
Email: hohmuth@inf.tu-dresden.de
WWW:   http://www.inf.tu-dresden.de/~mh1/