Ignore:
Timestamp:
Apr 21, 2017, 4:28:29 AM (2 months ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/drivers/nvdimm/dimm_devs.c

    r31574 r31885  
    389389int alias_dpa_busy(struct device *dev, void *data)
    390390{
    391         resource_size_t map_end, blk_start, new, busy;
     391        resource_size_t map_end, blk_start, new;
    392392        struct blk_alloc_info *info = data;
    393393        struct nd_mapping *nd_mapping;
     
    430430        /*
    431431         * Find the free dpa from the end of the last pmem allocation to
    432          * the end of the interleave-set mapping that is not already
    433          * covered by a blk allocation.
     432         * the end of the interleave-set mapping.
    434433         */
    435         busy = 0;
    436434        for_each_dpa_resource(ndd, res) {
     435                if (strncmp(res->name, "pmem", 4) != 0)
     436                        continue;
    437437                if ((res->start >= blk_start && res->start < map_end)
    438438                                || (res->end >= blk_start
    439439                                        && res->end <= map_end)) {
    440                         if (strncmp(res->name, "pmem", 4) == 0) {
    441                                 new = max(blk_start, min(map_end + 1,
    442                                                         res->end + 1));
    443                                 if (new != blk_start) {
    444                                         blk_start = new;
    445                                         goto retry;
    446                                 }
    447                         } else
    448                                 busy += min(map_end, res->end)
    449                                         - max(nd_mapping->start, res->start) + 1;
    450                 } else if (nd_mapping->start > res->start
    451                                 && map_end < res->end) {
    452                         /* total eclipse of the PMEM region mapping */
    453                         busy += nd_mapping->size;
    454                         break;
     440                        new = max(blk_start, min(map_end + 1, res->end + 1));
     441                        if (new != blk_start) {
     442                                blk_start = new;
     443                                goto retry;
     444                        }
    455445                }
    456446        }
     
    464454        }
    465455
    466         info->available -= blk_start - nd_mapping->start + busy;
     456        info->available -= blk_start - nd_mapping->start;
    467457
    468458        return 0;
    469 }
    470 
    471 static int blk_dpa_busy(struct device *dev, void *data)
    472 {
    473         struct blk_alloc_info *info = data;
    474         struct nd_mapping *nd_mapping;
    475         struct nd_region *nd_region;
    476         resource_size_t map_end;
    477         int i;
    478 
    479         if (!is_nd_pmem(dev))
    480                 return 0;
    481 
    482         nd_region = to_nd_region(dev);
    483         for (i = 0; i < nd_region->ndr_mappings; i++) {
    484                 nd_mapping  = &nd_region->mapping[i];
    485                 if (nd_mapping->nvdimm == info->nd_mapping->nvdimm)
    486                         break;
    487         }
    488 
    489         if (i >= nd_region->ndr_mappings)
    490                 return 0;
    491 
    492         map_end = nd_mapping->start + nd_mapping->size - 1;
    493         if (info->res->start >= nd_mapping->start
    494                         && info->res->start < map_end) {
    495                 if (info->res->end <= map_end) {
    496                         info->busy = 0;
    497                         return 1;
    498                 } else {
    499                         info->busy -= info->res->end - map_end;
    500                         return 0;
    501                 }
    502         } else if (info->res->end >= nd_mapping->start
    503                         && info->res->end <= map_end) {
    504                 info->busy -= nd_mapping->start - info->res->start;
    505                 return 0;
    506         } else {
    507                 info->busy -= nd_mapping->size;
    508                 return 0;
    509         }
    510459}
    511460
     
    539488                if (strncmp(res->name, "blk", 3) != 0)
    540489                        continue;
    541 
    542                 info.res = res;
    543                 info.busy = resource_size(res);
    544                 device_for_each_child(&nvdimm_bus->dev, &info, blk_dpa_busy);
    545                 info.available -= info.busy;
     490                info.available -= resource_size(res);
    546491        }
    547492
Note: See TracChangeset for help on using the changeset viewer.