If your modem and your host machine really have 1Gbit ports both, then 90Mbps is still sort of low. But if your modem has MII1 (WAN port) it could be incompatibility of my betaversion of the ethernet driver which doesn't support it (currently working on it so my driver can fully replace the old one).
Note my tests were done with a minimal openwrt configuration (no WIFI enabled, no DSL, only the cable to the host, no NAT, no web configuration). Any of these can impact the speed negatively. Also does your modem use both VPEs for the openwrt or is one VPE reserved for the voice firmware? There still may be bugs for a single VPE configurations. A single VPE system will impact the speed too.
Please try to run the iperf on a vanilla kernel so we can exclude vanilla oriented speed impacts (there were some vanilla slowdowns around 4.14.100, so if it goes up 10Mbps it was either fixed or it was improved by my patches ). Also run the iperf on the different LAN ports of your modem (to see if it really works and if your modem uses WAN port we will know).
BTW if you run iperf on localhost of your modem (both iperf server and client on the modem), you should observe speeds around 300-400Mbps. It would be nice to know how fast does your openwrt configuration works, localhost is just memcopy oriented test, so my patches should not impact it and it basicaly benchmarks the raw kernel network stack. Only thing from my patches which could impact the performace that way would be probably a high IRQ load. But if there is no other LAN/VDSL/WIFI traffic, it should not matter that much. For my setup the TX speed from xrx200 never crossed the maximal localhost speed.
The IRQ driver needs to be tested (thats why it is not in the vanilla patch queue yet). There is a define:
#define AUTO_AFFINITY_ROTATION
Which basically route every odd IRQ to the first VPE and every even IRQ to the second VPE. This will assure that IRQ are autobalanced. For low frequency interrupts it doesn't impact the speed, probably even RX DMA fifo for ethernet is fine. But TX DMA fifo is impacted by it (altought only about 33% in my setup, the TX speed is much higher than 90Mbps). You can disable this function by commenting out the macro and recompiling the kernel (but all interrupts will be on VPE0, which will again impact the TX speed) ... or you can disable the rotation in the running kernel by limiting the VPEs on which it can rotate the affinity:
echo 1 > /proc/irq/73/smp_affinity #TX FIFO for VPE0
echo 2 > /proc/irq/75/smp_affinity #TX FIFO for VPE1
You can set this thing even with AUTO_AFFINITY_ROTATION commented out. And you can set it for every interrupt from ICU. Possible interrupts can be seen in:
cat /proc/interrupts
Also, enabling/disabling software flow offloading does not do anything at all.
What command did you use? My ethernet driver has only added the support of fragmented packets (parts of the packet may be in a different location in the vanilla driver it must be first copied to a linear buffer, my driver just skip this step).