Ejemplo n.º 1
0
void
uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item)
{
	uma_keg_t keg;
	uma_slabrefcnt_t slabref;
	int freei;

	if (slab == NULL) {
		slab = uma_dbg_getslab(zone, item);
		if (slab == NULL) 
			panic("uma: Freed item %p did not belong to zone %s\n",
			    item, zone->uz_name);
	}
	keg = slab->us_keg;

	freei = ((unsigned long)item - (unsigned long)slab->us_data)
	    / keg->uk_rsize;

	if (freei >= keg->uk_ipers)
		panic("zone: %s(%p) slab %p freelist %d out of range 0-%d\n",
		    zone->uz_name, zone, slab, freei, keg->uk_ipers-1);

	if (((freei * keg->uk_rsize) + slab->us_data) != item) {
		printf("zone: %s(%p) slab %p freed address %p unaligned.\n",
		    zone->uz_name, zone, slab, item);
		panic("should be %p\n",
		    (freei * keg->uk_rsize) + slab->us_data);
	}

	if (keg->uk_flags & UMA_ZONE_REFCNT) {
		slabref = (uma_slabrefcnt_t)slab;
		if (slabref->us_freelist[freei].us_item != 255) {
			printf("Slab at %p, freei %d = %d.\n",
			    slab, freei, slabref->us_freelist[freei].us_item);
			panic("Duplicate free of item %p from zone %p(%s)\n",
			    item, zone, zone->uz_name);
		}

		/*
		 * When this is actually linked into the slab this will change.
		 * Until then the count of valid slabs will make sure we don't
		 * accidentally follow this and assume it's a valid index.
		 */
		slabref->us_freelist[freei].us_item = 0;
	} else {
		if (slab->us_freelist[freei].us_item != 255) {
			printf("Slab at %p, freei %d = %d.\n",
			    slab, freei, slab->us_freelist[freei].us_item);
			panic("Duplicate free of item %p from zone %p(%s)\n",
			    item, zone, zone->uz_name);
		}

		/*
		 * When this is actually linked into the slab this will change.
		 * Until then the count of valid slabs will make sure we don't
		 * accidentally follow this and assume it's a valid index.
		 */
		slab->us_freelist[freei].us_item = 0;
	}
}
Ejemplo n.º 2
0
/*
 * Verifies freed addresses.  Checks for alignment, valid slab membership
 * and duplicate frees.
 *
 */
void
uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item)
{
	uma_keg_t keg;
	int freei;

	if (zone_first_keg(zone) == NULL)
		return;
	if (slab == NULL) {
		slab = uma_dbg_getslab(zone, item);
		if (slab == NULL) 
			panic("uma: Freed item %p did not belong to zone %s\n",
			    item, zone->uz_name);
	}
	keg = slab->us_keg;
	freei = ((uintptr_t)item - (uintptr_t)slab->us_data) / keg->uk_rsize;

	if (freei >= keg->uk_ipers)
		panic("Invalid free of %p from zone %p(%s) slab %p(%d)\n",
		    item, zone, zone->uz_name, slab, freei);

	if (((freei * keg->uk_rsize) + slab->us_data) != item) 
		panic("Unaligned free of %p from zone %p(%s) slab %p(%d)\n",
		    item, zone, zone->uz_name, slab, freei);

	if (!BIT_ISSET(SLAB_SETSIZE, freei, &slab->us_debugfree))
		panic("Duplicate free of %p from zone %p(%s) slab %p(%d)\n",
		    item, zone, zone->uz_name, slab, freei);

	BIT_CLR_ATOMIC(SLAB_SETSIZE, freei, &slab->us_debugfree);
}
Ejemplo n.º 3
0
void
uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item)
{
	uma_keg_t keg;
	uma_slabrefcnt_t slabref;
	int freei;

	if (slab == NULL) {
		slab = uma_dbg_getslab(zone, item);
		if (slab == NULL) 
			panic("uma: item %p did not belong to zone %s\n",
			    item, zone->uz_name);
	}
	keg = slab->us_keg;

	freei = ((unsigned long)item - (unsigned long)slab->us_data)
	    / keg->uk_rsize;

	if (keg->uk_flags & UMA_ZONE_REFCNT) {
		slabref = (uma_slabrefcnt_t)slab;
		slabref->us_freelist[freei].us_item = 255;
	} else {
		slab->us_freelist[freei].us_item = 255;
	}

	return;
}
Ejemplo n.º 4
0
/*
 * Set up the slab's freei data such that uma_dbg_free can function.
 *
 */
void
uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item)
{
	uma_keg_t keg;
	int freei;

	if (zone_first_keg(zone) == NULL)
		return;
	if (slab == NULL) {
		slab = uma_dbg_getslab(zone, item);
		if (slab == NULL) 
			panic("uma: item %p did not belong to zone %s\n",
			    item, zone->uz_name);
	}
	keg = slab->us_keg;
	freei = ((uintptr_t)item - (uintptr_t)slab->us_data) / keg->uk_rsize;

	if (BIT_ISSET(SLAB_SETSIZE, freei, &slab->us_debugfree))
		panic("Duplicate alloc of %p from zone %p(%s) slab %p(%d)\n",
		    item, zone, zone->uz_name, slab, freei);
	BIT_SET_ATOMIC(SLAB_SETSIZE, freei, &slab->us_debugfree);

	return;
}