mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Enhance moving PHP code pages into huge pages (#12806)
The former implementation of huge pages for PHP code segments may fail to map in certain scenarios. For instance, if the initial 'r-x-' segment is not PHP, it will result in a failure to map into huge pages. Consequently, the optimization for huge pages with PHP code will no longer be effective. This patch improves the implementation by accurately matching all 'r-x-' segments until it locates the PHP code segment. Subsequently, it performs the necessary huge page mapping. Reviewed-by: chen-hu-97 <hu1.chen@intel.com> Signed-off-by: PeterYang12 <yuhan.yang@intel.com>
This commit is contained in:
@@ -3019,11 +3019,16 @@ static void accel_move_code_to_huge_pages(void)
|
||||
long unsigned int start, end, offset, inode;
|
||||
char perm[5], dev[10], name[MAXPATHLEN];
|
||||
int ret;
|
||||
extern char *__progname;
|
||||
char buffer[MAXPATHLEN];
|
||||
|
||||
while (1) {
|
||||
ret = fscanf(f, "%lx-%lx %4s %lx %9s %lu %s\n", &start, &end, perm, &offset, dev, &inode, name);
|
||||
if (ret == 7) {
|
||||
if (perm[0] == 'r' && perm[1] == '-' && perm[2] == 'x' && name[0] == '/') {
|
||||
while (fgets(buffer, MAXPATHLEN, f)) {
|
||||
ret = sscanf(buffer, "%lx-%lx %4s %lx %9s %lu %s\n", &start, &end, perm, &offset, dev, &inode, name);
|
||||
if (ret >= 6) {
|
||||
/* try to find the php text segment and map it into huge pages
|
||||
Lines without 'name' are going to be skipped */
|
||||
if (ret > 6 && perm[0] == 'r' && perm[1] == '-' && perm[2] == 'x' && name[0] == '/' \
|
||||
&& strstr(name, __progname)) {
|
||||
long unsigned int seg_start = ZEND_MM_ALIGNED_SIZE_EX(start, huge_page_size);
|
||||
long unsigned int seg_end = (end & ~(huge_page_size-1L));
|
||||
long unsigned int real_end;
|
||||
@@ -3042,8 +3047,6 @@ static void accel_move_code_to_huge_pages(void)
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
Reference in New Issue
Block a user