* Matthew Dillon <[EMAIL PROTECTED]> [000415 11:32] wrote:
>
> :On Thu, 13 Apr 2000, Michael Reifenberger wrote:
> :
> :> Hi,
> :> when using a linux java app (SAP PlatinGUI 46Cb2) I get the above panic.
> :> FreeBSD -current. Kernel+mods in sync.
> :> Linux from ports. Linux-Java-JDK 1.2.2 from blackdown as of yesterday.
> :> Backtrace see crash.txt. Kernelconfig see nihil.
> :> Any thoughts anyone?
> :
> :Yes, I've gotten these too. I really believe the assumptions the code
> :there makes are wrong, and I've got a patch to correct them to what I
> :think they are supposed to be. You've got the standard disclaimer on
> :the patch, though I assure you it has shown no ill effects to me, and I
> :noticed this bug through WINE.
> :
> :I've asked Poul-Henning Kamp, who seems to also think that the code makes
> :wrong assumptions. I've asked Matt Dillon and gotten no reply (a month
> :now, at least). I've asked Alan Cox, and he'd help if we could get him
> :a test case so he can watch it happen himself and debug it himself.
> :
> :Do you think you can find a specific set of steps for Alan to reproduce
> :it?
> :
> :> Bye!
> :> ----
> :> Michael Reifenberger
> :> ^.*Plaut.*$, IT, R/3 Basis, GPS
> :
> :--
> : Brian Fundakowski Feldman \ FreeBSD: The Power to Serve! /
> : [EMAIL PROTECTED] `------------------------------'
>
> Oh, sorry about that. I've run out of time and I have to take a
> chopper to my email. Sometimes I chop out too much.
>
> vm_object_shadow() is used to shadow VM objects when a write fault
> occurs, and when forking (to avoid early copying of the vm_object's).
>
> Hmm. Lets see. Well, I'd say the original code is obviously wrong.
> You CAN have a ref_count > 1 and still have OBJ_ONEMAPPING set. I
> remember Alan and I discovering that case last year as we were fixing
> up the vm_object stuff. Basically, the ref_count can be temporarily
> bumped with OBJ_ONEMAPPING still set.
>
> Here's an associated piece of code to look at. Line 2133 of
> vm_map.c (in vmspace_fork()). Here the vmspace_fork() code is
> trying to force the creation of a shadow object which it then
> intends to close. It is bumping the ref_count to 'ensure' this.
> So your change will break this piece of code.
>
> /*
> * Add the reference before calling vm_object_shadow
> * to insure that a shadow object is created.
> */
> vm_object_reference(object);
> if (old_entry->eflags & MAP_ENTRY_NEEDS_COPY) {
> vm_object_shadow(&old_entry->object.vm_object,
> &old_entry->offset,
> atop(old_entry->end - old_entry->start))
> ;
> old_entry->eflags &= ~MAP_ENTRY_NEEDS_COPY;
> object = old_entry->object.vm_object;
> }
> vm_object_clear_flag(object, OBJ_ONEMAPPING);
>
> I think the solution is to cear OBJ_ONEMAPPING before calling
> vm_object_shadow() in vm_map.c, PLUS do your patch. I've included
> my version below (untested).
I really don't like this, what's the point of having a "helper"
function vm_object_reference(), if it doesn't do all the required
work (vm_object_clear_flag())? This adds unneeded complexity to the
caller.
Is there a good reason for not having the vm_object_clear_flag() in
vm_object_reference()?
>
> Re: The other person's comment about a possible reference count leak.
> I do not believe there is any reference count leak, the reference count
> was being bumped due to the forks and the shadows causing fragmentation
> of the original object.
A reference count leak did occur, ref_count was bumped without other
sanity flags being cleared, the code makes it easy to shoot yourself
in the foot.
-Alfred
> Index: vm_map.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/vm/vm_map.c,v
> retrieving revision 1.187
> diff -u -r1.187 vm_map.c
> --- vm_map.c 2000/02/28 04:10:35 1.187
> +++ vm_map.c 2000/04/15 18:02:06
> @@ -2119,10 +2119,14 @@
> }
>
> /*
> - * Add the reference before calling vm_object_shadow
> - * to insure that a shadow object is created.
> + * Clear OBJ_ONEMAPPING before calling vm_object_shadow
> + * to ensure that a shadow object is created. Add a
> + * reference to cover the new vm_map_entry being
> + * associated with the object.
> */
> vm_object_reference(object);
> + vm_object_clear_flag(object, OBJ_ONEMAPPING);
> +
> if (old_entry->eflags & MAP_ENTRY_NEEDS_COPY) {
> vm_object_shadow(&old_entry->object.vm_object,
> &old_entry->offset,
> @@ -2130,7 +2134,6 @@
> old_entry->eflags &= ~MAP_ENTRY_NEEDS_COPY;
> object = old_entry->object.vm_object;
> }
> - vm_object_clear_flag(object, OBJ_ONEMAPPING);
>
> /*
> * Clone the entry, referencing the shared object.
> Index: vm_object.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/vm/vm_object.c,v
> retrieving revision 1.171.2.1
> diff -u -r1.171.2.1 vm_object.c
> --- vm_object.c 2000/03/17 10:47:35 1.171.2.1
> +++ vm_object.c 2000/04/15 18:00:29
> @@ -900,10 +900,17 @@
> source = *object;
>
> /*
> - * Don't create the new object if the old object isn't shared.
> + * If the old object is not shared we may be able to simply use it
> + * as the shadow rather then have to create a new object. Only
> + * objects that we can guarentee this case can be optimized - that is,
> + * only objects with no handles that other processes can get a hold
> + * of which are otherwise unassociated, have only one mapping, and
> + * only one reference count. XXX do we need the reference count check
> + * any more? XXX
> */
>
> if (source != NULL &&
> + (source->flags & OBJ_ONEMAPPING) != 0 &&
> source->ref_count == 1 &&
> source->handle == NULL &&
> (source->type == OBJT_DEFAULT ||
>
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message