Week -1: Modify JMicron driver, RX offloading
May 2nd to May 12th
Chanloading with undionly image
Stefanha pointed out that I should try if JMicron driver can be chanloaded like: gPXE(jme driver)→gPXE(UNDI driver). Due to the UNDI interface would trigger .irq() function of net_device_operations.
First I spend a lot of time trying to figure out why chainloading with: syslinux→jme.lkrm→undionly.kpxe keeps crash(reboot) after some actions.
After a few tests, I found out that:
- syslinux→gPXE(jme.lkrm)→undionly.kkpxe
- Vendor PXE→gPXE(jme.pxe)→undionly.kkpxe
- Vendor PXE→gPXE(jme.kpxe)→undionly.kkpxe
All worked fine. So I guess that it's an issue with the chainloading processes, instead of in-correct driver implement.
Implement RX checksum offloading
Testing results can be found in this note: TCP Window Size and RX Csum Offload Benchmark
Modify JMicron driver according to stefanha suggestions
- jme_process_receive() isn't using a read memory barrier.
- Allocate/Free Ring buffers on open/close.
- Using jme_free_?x_resources() for allocation fail recover.
- Simply use struct io_buffer, instead of jme_buffer_info.
- There is no need to discard pending TX buffers.
- extra memset in probe.
- Ring size tune, performance test.
Detailed modifications can reference the jme_driver_bak branch of my git tree.