perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

perf: skip unnecessary main data read in _lx_nand_flash_sector_read - #65

Merged
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue
Feb 17, 2026
Merged

perf: skip unnecessary main data read in _lx_nand_flash_sector_read#65
fdesbiens merged 2 commits into
eclipse-threadx:devfrom
borlandong:fix-performance-issue

Conversation

@borlandong

Copy link
Copy Markdown
Contributor

Related Issue

Fixes#64

Problem Description

The _lx_nand_flash_sector_read function currently reads both main data area and spare data area when matching logical sector numbers. This is unnecessary since only spare area data is needed for sector matching, resulting in severe performance degradation.

Solution

This PR optimizes the sector read logic to:

  • Read only spare area data during logical sector number matching
  • Skip main data area read when the pointer is NULL
  • Read main data area only when actually needed (after successful sector match)

Implementation Details

Modified function:_lx_nand_flash_sector_read

Key changes:

  • Separated spare area read
  • Added NULL pointer check for main data area buffer
  • Read main data area only after confirming sector match

Driver requirement:
NAND flash drivers must check if the main data area pointer is NULL and skip reading the main data area in that case.

Performance Results

Tested on W25N01GV NAND Flash with LevelX + FileX stack:

OperationBeforeAfterImprovement
Write 680KB2258 ms1757 ms22.2% faster
Read 680KB10954 ms3113 ms251.6% faster (3.5x)

Summary:

  • Write performance improved by ~22%
  • Read performance improved by ~252% (3.5x faster)
  • Particularly significant improvement in read operations

Testing

  • Tested on W25N01GV NAND Flash
  • Write operations verified
  • Read operations verified
  • Performance benchmarks completed

Breaking Changes

None. This is a pure performance optimization that maintains backward compatibility.

Additional Notes

This optimization is especially important for read-intensive applications. The 3.5x read performance improvement significantly enhances user experience.

Merge changes ahead of the 202504 release
@rahmanih
rahmanih self-requested a review January 22, 2026 09:17
@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong ,
thanks for this PR, I'll have a look at it and get back to you.

@rahmanih

Copy link
Copy Markdown
Contributor

just one point,
could you please change the "merging branch" to dev

@borlandong
borlandong changed the base branch from master to devJanuary 22, 2026 12:37
@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih,

Done! I've changed the base branch to dev.

Thank you for reviewing!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih
I noticed the regression test failed. I'd like to clarify an important implementation detail about this optimization.

Driver Implementation Requirement:

This performance improvement depends on the LevelX NAND driver properly handling NULL pointers in the lx_nand_flash_driver_pages_read interface.

Specifically, the driver must:

  • Check if main_buffer is NULL before reading the main data area
  • Check if spare_buffer is NULL before reading the spare data area
  • Skip reading the corresponding area if the pointer is NULL

Example implementation pattern:

UINTlx_nand_flash_driver_pages_read(/* parameters */)
{
// Only read main data area if buffer is providedif (main_buffer!=NULL)
{
// Read main data area
}
// Only read spare data area if buffer is providedif (spare_buffer!=NULL)
{
// Read spare data area
}
returnLX_SUCCESS;
}

Why this matters:

The optimization works by passing NULL for main_buffer during the logical sector matching phase, since only spare area data is needed at that stage. If the driver doesn't check for NULL pointers and attempts to read/write to a NULL buffer, it will cause failures.

Testing:

My implementation has been tested on W25N01GV with a driver that properly handles NULL pointers, which is why I achieved the 3.5x read performance improvement.

Could you please verify if the reference NAND driver implementation in the test environment handles NULL pointers correctly? If not, I can help update the driver implementation or provide additional documentation on this requirement.

Thank you!

@rahmanih

Copy link
Copy Markdown
Contributor

Hi @borlandong,
the PR has been tested and looks good on STM32 + W25N01GV, remains to update the simulator driver to support the PR before merging it.

working on it!

@borlandong

Copy link
Copy Markdown
ContributorAuthor

Hi @rahmanih

That's great news! Thank you for testing on STM32 + W25N01GV and confirming it works correctly.

I appreciate you taking the time to update the simulator driver to support this change. Please let me know if you need any assistance or clarification during the implementation.

Looking forward to seeing this merged!

rahmanih added a commit to rahmanih/levelx that referenced this pull request Feb 10, 2026
align the nand flash simulator against the PR eclipse-threadx#65
Tests:
Total Test time (real) = 6.33 sec
~/work/git_repos/github/eclipse/levelx_rahmanih/test/cmake
3/3 Test eclipse-threadx#1: default_build_coverage::levelx_nand_flash_test ........ Passed 44.06 sec
100% tests passed, 0 tests failed out of 3
@rahmanihrahmanih mentioned this pull request Feb 10, 2026
@fdesbiens
fdesbiens merged commit fa1a8e5 into eclipse-threadx:devFeb 17, 2026
2 of 3 checks passed
@github-project-automationgithub-project-automationBot moved this from In review to Done in ThreadX RoadmapFeb 17, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Performance Issue: Unnecessary main data area read in _lx_nand_flash_sector_read

3 participants

@borlandong@rahmanih@fdesbiens