Changeset e2650d3 in mainline for kernel/generic/src/mm/frame.c


Ignore:
Timestamp:
2010-07-20T13:53:36Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4738d84
Parents:
4d0f97d
Message:

rename PA_overlaps to PA_OVERLAPS
be more tolerant about some cases of overlapping zones (when it is actually not an issue)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/frame.c

    r4d0f97d re2650d3  
    121121 *
    122122 */
    123 NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count)
     123NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count,
     124    zone_flags_t flags)
    124125{
    125126        if (zones.count + 1 == ZONES_MAX) {
     
    131132        for (i = 0; i < zones.count; i++) {
    132133                /* Check for overlap */
    133                 if (overlaps(base, count,
    134                     zones.info[i].base, zones.info[i].count)) {
    135                         printf("Zone (%p, %p) overlaps with zone (%p, %p)!\n",
    136                             PFN2ADDR(base), PFN2ADDR(base + count),
    137                             PFN2ADDR(zones.info[i].base),
    138                             PFN2ADDR(zones.info[i].base + zones.info[i].count));
     134                if (overlaps(zones.info[i].base, zones.info[i].count,
     135                    base, count)) {
     136                       
     137                        /*
     138                         * If the overlaping zones are of the same type
     139                         * and the new zone is completely within the previous
     140                         * one, then quietly ignore the new zone.
     141                         *
     142                         */
     143                       
     144                        if ((zones.info[i].flags != flags) ||
     145                            (!iswithin(zones.info[i].base, zones.info[i].count,
     146                            base, count))) {
     147                                printf("Zone (%p, %p) overlaps with previous zone (%p, %p)!\n",
     148                                    PFN2ADDR(base), PFN2ADDR(count),
     149                                    PFN2ADDR(zones.info[i].base),
     150                                    PFN2ADDR(zones.info[i].count));
     151                        }
     152                       
    139153                        return (size_t) -1;
    140154                }
     
    898912                }
    899913               
    900                 size_t znum = zones_insert_zone(start, count);
     914                size_t znum = zones_insert_zone(start, count, flags);
    901915                if (znum == (size_t) -1) {
    902916                        irq_spinlock_unlock(&zones.lock, true);
     
    921935       
    922936        /* Non-available zone */
    923         size_t znum = zones_insert_zone(start, count);
     937        size_t znum = zones_insert_zone(start, count, flags);
    924938        if (znum == (size_t) -1) {
    925939                irq_spinlock_unlock(&zones.lock, true);
Note: See TracChangeset for help on using the changeset viewer.