Tu również nie znajdziemy niczego zaskakującego.
void vfree(void * addr)
{
struct vm_struct **p, *tmp;
if (!addr) // pusty adres ?
return;
if ((PAGE_SIZE-1) & (unsigned long) addr) {
// adres nie zaczyna się na początku strony !
printk(KERN_ERR "Trying to vfree() bad address (%p)\n", addr);
return;
}
write_lock(&vmlist_lock); // blokada
// przeszukujemy listę obszarów w poszukiwaniu `pasującego'
for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
if (tmp->addr == addr) {
*p = tmp->next;
// zwolnienie zaalokowanych stron i zmienia globalne tablice stron
vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size);
write_unlock(&vmlist_lock);
kfree(tmp); // zwolnienie deskryptora obszaru
return;
}
}
write_unlock(&vmlist_lock);
// ooops... brak pasującego obszaru ? - coś nie tak
printk(KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n", addr);
}