On 06/25/2013 10:17 PM, [email protected] wrote:
> Hi!
>> +static int page_check(void)
>> +{
>> + int pid;
>> + int ret;
>> + int pm;
>> + int num_pages;
>> + long index;
>> + off_t offset;
>> + size_t page_sz;
>> + char maps_dev[PATHLEN];
>> + char pagemap_dev[PATHLEN];
>> + char line[LINELEN];
>> + FILE *maps;
>> + unsigned long vm_start;
>> + unsigned long vm_end;
>> + unsigned long long pagemap;
>> +
>> + page_sz = getpagesize();
>> +
>> + pid = getpid();
>> + sprintf(maps_dev, "/proc/%d/maps", pid);
>> + sprintf(pagemap_dev, "/proc/%d/pagemap", pid);
>
> Just use "/proc/self/maps" and "/proc/self/pagemap" instead.
Get it.
>
>> + maps = fopen(maps_dev, "r");
>> + if (maps == NULL)
>> + tst_brkm(TFAIL | TERRNO, NULL, "Open dev maps failed");
>> +
>> + while (fgets(line, LINELEN, maps) != NULL)
>> + if (strstr(line, TEMPFILE) != NULL)
>> + break;
>> +
>> + ret = sscanf(line, "%lX-%lX", &vm_start, &vm_end);
>> + if (ret != 2)
>> + tst_brkm(TFAIL | TERRNO, NULL, "Get address space failed");
>
> This part of the code does not cope with unlikely condition that
> TEMPFILE is missing from /proc/self/maps we should fail the test in this
> case with proper error message.
>
Get it.
>> + num_pages = (vm_end - vm_start) / page_sz;
>> + index = (vm_start / page_sz) * sizeof(unsigned long long);
>> +
>> + pm = open(pagemap_dev, O_RDONLY);
>> + if (pm == -1)
>> + tst_brkm(TFAIL | TERRNO, NULL, "Open dev pagemap failed");
>> +
>> + offset = lseek(pm, index, SEEK_SET);
>> + if (offset != index)
>> + tst_brkm(TFAIL | TERRNO, NULL, "Reposition offset failed");
>> +
>> + while (num_pages > 0) {
>> + ret = read(pm, &pagemap, sizeof(unsigned long long));
>> + if (ret < 0)
>> + tst_brkm(TFAIL | TERRNO, NULL, "Read pagemap failed");
>> + /*
>> + * Check if the page is present.
>> + */
>> + if (!(pagemap & (1ULL<<63))) {
>> + close(pm);
>> + fclose(maps);
>> + return 1;
>
> I would perpahs be more verbose here and go over all of the pages and
> list these that are not mapped, but that is a minor nitpick.
>
You mean listing every page which is not present?
Thank you for reviewing.
Regards,
DAN LI
>> + }
>> + num_pages--;
>> + }
>> +
>> + close(pm);
>> + fclose(maps);
>> +
>> + return 0;
>> +}
>
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list