diff options
| -rw-r--r-- | MAINTAINERS | 5 | ||||
| -rw-r--r-- | drivers/net/ariadne.c | 5 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x.h | 5 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_cmn.c | 22 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_cmn.h | 9 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_ethtool.c | 18 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_main.c | 19 | ||||
| -rw-r--r-- | drivers/net/bonding/bond_3ad.c | 32 | ||||
| -rw-r--r-- | drivers/net/bonding/bond_3ad.h | 3 | ||||
| -rw-r--r-- | drivers/net/macvtap.c | 3 | ||||
| -rw-r--r-- | drivers/net/r6040.c | 115 | ||||
| -rw-r--r-- | drivers/net/smsc911x.c | 5 | ||||
| -rw-r--r-- | net/Makefile | 4 | ||||
| -rw-r--r-- | net/bridge/Kconfig | 1 | ||||
| -rw-r--r-- | net/core/pktgen.c | 2 | ||||
| -rw-r--r-- | net/ipv4/devinet.c | 6 | ||||
| -rw-r--r-- | net/ipv6/ip6_tunnel.c | 1 | ||||
| -rw-r--r-- | net/ipv6/route.c | 4 | ||||
| -rw-r--r-- | net/rds/ib_send.c | 5 | ||||
| -rw-r--r-- | net/rds/loop.c | 11 | ||||
| -rw-r--r-- | net/unix/af_unix.c | 17 |
21 files changed, 182 insertions, 110 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 560ecce38ff..f1bc3dc6b36 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -4292,10 +4292,7 @@ S: Maintained | |||
| 4292 | F: net/sched/sch_netem.c | 4292 | F: net/sched/sch_netem.c |
| 4293 | 4293 | ||
| 4294 | NETERION 10GbE DRIVERS (s2io/vxge) | 4294 | NETERION 10GbE DRIVERS (s2io/vxge) |
| 4295 | M: Ramkrishna Vepa <ramkrishna.vepa@exar.com> | 4295 | M: Jon Mason <jdmason@kudzu.us> |
| 4296 | M: Sivakumar Subramani <sivakumar.subramani@exar.com> | ||
| 4297 | M: Sreenivasa Honnur <sreenivasa.honnur@exar.com> | ||
| 4298 | M: Jon Mason <jon.mason@exar.com> | ||
| 4299 | L: netdev@vger.kernel.org | 4296 | L: netdev@vger.kernel.org |
| 4300 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous | 4297 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous |
| 4301 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous | 4298 | W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous |
diff --git a/drivers/net/ariadne.c b/drivers/net/ariadne.c index 39214e51245..7ca0eded256 100644 --- a/drivers/net/ariadne.c +++ b/drivers/net/ariadne.c | |||
| @@ -425,11 +425,6 @@ static irqreturn_t ariadne_interrupt(int irq, void *data) | |||
| 425 | int csr0, boguscnt; | 425 | int csr0, boguscnt; |
| 426 | int handled = 0; | 426 | int handled = 0; |
| 427 | 427 | ||
| 428 | if (dev == NULL) { | ||
| 429 | printk(KERN_WARNING "ariadne_interrupt(): irq for unknown device.\n"); | ||
| 430 | return IRQ_NONE; | ||
| 431 | } | ||
| 432 | |||
| 433 | lance->RAP = CSR0; /* PCnet-ISA Controller Status */ | 428 | lance->RAP = CSR0; /* PCnet-ISA Controller Status */ |
| 434 | 429 | ||
| 435 | if (!(lance->RDP & INTR)) /* Check if any interrupt has been */ | 430 | if (!(lance->RDP & INTR)) /* Check if any interrupt has been */ |
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h index 7897d114b29..8849699c66c 100644 --- a/drivers/net/bnx2x/bnx2x.h +++ b/drivers/net/bnx2x/bnx2x.h | |||
| @@ -1211,6 +1211,7 @@ struct bnx2x { | |||
| 1211 | /* DCBX Negotation results */ | 1211 | /* DCBX Negotation results */ |
| 1212 | struct dcbx_features dcbx_local_feat; | 1212 | struct dcbx_features dcbx_local_feat; |
| 1213 | u32 dcbx_error; | 1213 | u32 dcbx_error; |
| 1214 | u32 pending_max; | ||
| 1214 | }; | 1215 | }; |
| 1215 | 1216 | ||
| 1216 | /** | 1217 | /** |
| @@ -1616,8 +1617,8 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms, | |||
| 1616 | /* CMNG constants, as derived from system spec calculations */ | 1617 | /* CMNG constants, as derived from system spec calculations */ |
| 1617 | /* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */ | 1618 | /* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */ |
| 1618 | #define DEF_MIN_RATE 100 | 1619 | #define DEF_MIN_RATE 100 |
| 1619 | /* resolution of the rate shaping timer - 100 usec */ | 1620 | /* resolution of the rate shaping timer - 400 usec */ |
| 1620 | #define RS_PERIODIC_TIMEOUT_USEC 100 | 1621 | #define RS_PERIODIC_TIMEOUT_USEC 400 |
| 1621 | /* number of bytes in single QM arbitration cycle - | 1622 | /* number of bytes in single QM arbitration cycle - |
| 1622 | * coefficient for calculating the fairness timer */ | 1623 | * coefficient for calculating the fairness timer */ |
| 1623 | #define QM_ARB_BYTES 160000 | 1624 | #define QM_ARB_BYTES 160000 |
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c index 93798129061..a71b3294053 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.c +++ b/drivers/net/bnx2x/bnx2x_cmn.c | |||
| @@ -996,6 +996,23 @@ void bnx2x_free_skbs(struct bnx2x *bp) | |||
| 996 | bnx2x_free_rx_skbs(bp); | 996 | bnx2x_free_rx_skbs(bp); |
| 997 | } | 997 | } |
| 998 | 998 | ||
| 999 | void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value) | ||
| 1000 | { | ||
| 1001 | /* load old values */ | ||
| 1002 | u32 mf_cfg = bp->mf_config[BP_VN(bp)]; | ||
| 1003 | |||
| 1004 | if (value != bnx2x_extract_max_cfg(bp, mf_cfg)) { | ||
| 1005 | /* leave all but MAX value */ | ||
| 1006 | mf_cfg &= ~FUNC_MF_CFG_MAX_BW_MASK; | ||
| 1007 | |||
| 1008 | /* set new MAX value */ | ||
| 1009 | mf_cfg |= (value << FUNC_MF_CFG_MAX_BW_SHIFT) | ||
| 1010 | & FUNC_MF_CFG_MAX_BW_MASK; | ||
| 1011 | |||
| 1012 | bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, mf_cfg); | ||
| 1013 | } | ||
| 1014 | } | ||
| 1015 | |||
| 999 | static void bnx2x_free_msix_irqs(struct bnx2x *bp) | 1016 | static void bnx2x_free_msix_irqs(struct bnx2x *bp) |
| 1000 | { | 1017 | { |
| 1001 | int i, offset = 1; | 1018 | int i, offset = 1; |
| @@ -1464,6 +1481,11 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
| 1464 | 1481 | ||
| 1465 | bnx2x_set_eth_mac(bp, 1); | 1482 | bnx2x_set_eth_mac(bp, 1); |
| 1466 | 1483 | ||
| 1484 | if (bp->pending_max) { | ||
| 1485 | bnx2x_update_max_mf_config(bp, bp->pending_max); | ||
| 1486 | bp->pending_max = 0; | ||
| 1487 | } | ||
| 1488 | |||
| 1467 | if (bp->port.pmf) | 1489 | if (bp->port.pmf) |
| 1468 | bnx2x_initial_phy_init(bp, load_mode); | 1490 | bnx2x_initial_phy_init(bp, load_mode); |
| 1469 | 1491 | ||
diff --git a/drivers/net/bnx2x/bnx2x_cmn.h b/drivers/net/bnx2x/bnx2x_cmn.h index 326ba44b3de..85ea7f26b51 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.h +++ b/drivers/net/bnx2x/bnx2x_cmn.h | |||
| @@ -341,6 +341,15 @@ void bnx2x_dcbx_init(struct bnx2x *bp); | |||
| 341 | */ | 341 | */ |
| 342 | int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state); | 342 | int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state); |
| 343 | 343 | ||
| 344 | /** | ||
| 345 | * Updates MAX part of MF configuration in HW | ||
| 346 | * (if required) | ||
| 347 | * | ||
| 348 | * @param bp | ||
| 349 | * @param value | ||
| 350 | */ | ||
| 351 | void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value); | ||
| 352 | |||
| 344 | /* dev_close main block */ | 353 | /* dev_close main block */ |
| 345 | int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode); | 354 | int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode); |
| 346 | 355 | ||
diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c index ef2919987a1..7e92f9d0dcf 100644 --- a/drivers/net/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/bnx2x/bnx2x_ethtool.c | |||
| @@ -238,7 +238,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 238 | speed |= (cmd->speed_hi << 16); | 238 | speed |= (cmd->speed_hi << 16); |
| 239 | 239 | ||
| 240 | if (IS_MF_SI(bp)) { | 240 | if (IS_MF_SI(bp)) { |
| 241 | u32 param = 0, part; | 241 | u32 part; |
| 242 | u32 line_speed = bp->link_vars.line_speed; | 242 | u32 line_speed = bp->link_vars.line_speed; |
| 243 | 243 | ||
| 244 | /* use 10G if no link detected */ | 244 | /* use 10G if no link detected */ |
| @@ -251,24 +251,22 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 251 | REQ_BC_VER_4_SET_MF_BW); | 251 | REQ_BC_VER_4_SET_MF_BW); |
| 252 | return -EINVAL; | 252 | return -EINVAL; |
| 253 | } | 253 | } |
| 254 | |||
| 254 | part = (speed * 100) / line_speed; | 255 | part = (speed * 100) / line_speed; |
| 256 | |||
| 255 | if (line_speed < speed || !part) { | 257 | if (line_speed < speed || !part) { |
| 256 | BNX2X_DEV_INFO("Speed setting should be in a range " | 258 | BNX2X_DEV_INFO("Speed setting should be in a range " |
| 257 | "from 1%% to 100%% " | 259 | "from 1%% to 100%% " |
| 258 | "of actual line speed\n"); | 260 | "of actual line speed\n"); |
| 259 | return -EINVAL; | 261 | return -EINVAL; |
| 260 | } | 262 | } |
| 261 | /* load old values */ | ||
| 262 | param = bp->mf_config[BP_VN(bp)]; | ||
| 263 | 263 | ||
| 264 | /* leave only MIN value */ | 264 | if (bp->state != BNX2X_STATE_OPEN) |
| 265 | param &= FUNC_MF_CFG_MIN_BW_MASK; | 265 | /* store value for following "load" */ |
| 266 | 266 | bp->pending_max = part; | |
| 267 | /* set new MAX value */ | 267 | else |
| 268 | param |= (part << FUNC_MF_CFG_MAX_BW_SHIFT) | 268 | bnx2x_update_max_mf_config(bp, part); |
| 269 | & FUNC_MF_CFG_MAX_BW_MASK; | ||
| 270 | 269 | ||
| 271 | bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param); | ||
| 272 | return 0; | 270 | return 0; |
| 273 | } | 271 | } |
| 274 | 272 | ||
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index 032ae184b60..aa032339e32 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
| @@ -2092,8 +2092,9 @@ static void bnx2x_cmng_fns_init(struct bnx2x *bp, u8 read_cfg, u8 cmng_type) | |||
| 2092 | bnx2x_calc_vn_weight_sum(bp); | 2092 | bnx2x_calc_vn_weight_sum(bp); |
| 2093 | 2093 | ||
| 2094 | /* calculate and set min-max rate for each vn */ | 2094 | /* calculate and set min-max rate for each vn */ |
| 2095 | for (vn = VN_0; vn < E1HVN_MAX; vn++) | 2095 | if (bp->port.pmf) |
| 2096 | bnx2x_init_vn_minmax(bp, vn); | 2096 | for (vn = VN_0; vn < E1HVN_MAX; vn++) |
| 2097 | bnx2x_init_vn_minmax(bp, vn); | ||
| 2097 | 2098 | ||
| 2098 | /* always enable rate shaping and fairness */ | 2099 | /* always enable rate shaping and fairness */ |
| 2099 | bp->cmng.flags.cmng_enables |= | 2100 | bp->cmng.flags.cmng_enables |= |
| @@ -2162,13 +2163,6 @@ static void bnx2x_link_attn(struct bnx2x *bp) | |||
| 2162 | bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP); | 2163 | bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP); |
| 2163 | } | 2164 | } |
| 2164 | 2165 | ||
| 2165 | /* indicate link status only if link status actually changed */ | ||
| 2166 | if (prev_link_status != bp->link_vars.link_status) | ||
| 2167 | bnx2x_link_report(bp); | ||
| 2168 | |||
| 2169 | if (IS_MF(bp)) | ||
| 2170 | bnx2x_link_sync_notify(bp); | ||
| 2171 | |||
| 2172 | if (bp->link_vars.link_up && bp->link_vars.line_speed) { | 2166 | if (bp->link_vars.link_up && bp->link_vars.line_speed) { |
| 2173 | int cmng_fns = bnx2x_get_cmng_fns_mode(bp); | 2167 | int cmng_fns = bnx2x_get_cmng_fns_mode(bp); |
| 2174 | 2168 | ||
| @@ -2180,6 +2174,13 @@ static void bnx2x_link_attn(struct bnx2x *bp) | |||
| 2180 | DP(NETIF_MSG_IFUP, | 2174 | DP(NETIF_MSG_IFUP, |
| 2181 | "single function mode without fairness\n"); | 2175 | "single function mode without fairness\n"); |
| 2182 | } | 2176 | } |
| 2177 | |||
| 2178 | if (IS_MF(bp)) | ||
| 2179 | bnx2x_link_sync_notify(bp); | ||
| 2180 | |||
| 2181 | /* indicate link status only if link status actually changed */ | ||
| 2182 | if (prev_link_status != bp->link_vars.link_status) | ||
| 2183 | bnx2x_link_report(bp); | ||
| 2183 | } | 2184 | } |
| 2184 | 2185 | ||
| 2185 | void bnx2x__link_status_update(struct bnx2x *bp) | 2186 | void bnx2x__link_status_update(struct bnx2x *bp) |
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 1024ae15822..a5d5d0b5b15 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
| @@ -281,23 +281,23 @@ static inline int __check_agg_selection_timer(struct port *port) | |||
| 281 | } | 281 | } |
| 282 | 282 | ||
| 283 | /** | 283 | /** |
| 284 | * __get_rx_machine_lock - lock the port's RX machine | 284 | * __get_state_machine_lock - lock the port's state machines |
| 285 | * @port: the port we're looking at | 285 | * @port: the port we're looking at |
| 286 | * | 286 | * |
| 287 | */ | 287 | */ |
| 288 | static inline void __get_rx_machine_lock(struct port *port) | 288 | static inline void __get_state_machine_lock(struct port *port) |
| 289 | { | 289 | { |
| 290 | spin_lock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock)); | 290 | spin_lock_bh(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | /** | 293 | /** |
| 294 | * __release_rx_machine_lock - unlock the port's RX machine | 294 | * __release_state_machine_lock - unlock the port's state machines |
| 295 | * @port: the port we're looking at | 295 | * @port: the port we're looking at |
| 296 | * | 296 | * |
| 297 | */ | 297 | */ |
| 298 | static inline void __release_rx_machine_lock(struct port *port) | 298 | static inline void __release_state_machine_lock(struct port *port) |
| 299 | { | 299 | { |
| 300 | spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock)); | 300 | spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); |
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | /** | 303 | /** |
| @@ -388,14 +388,14 @@ static u8 __get_duplex(struct port *port) | |||
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | /** | 390 | /** |
| 391 | * __initialize_port_locks - initialize a port's RX machine spinlock | 391 | * __initialize_port_locks - initialize a port's STATE machine spinlock |
| 392 | * @port: the port we're looking at | 392 | * @port: the port we're looking at |
| 393 | * | 393 | * |
| 394 | */ | 394 | */ |
| 395 | static inline void __initialize_port_locks(struct port *port) | 395 | static inline void __initialize_port_locks(struct port *port) |
| 396 | { | 396 | { |
| 397 | // make sure it isn't called twice | 397 | // make sure it isn't called twice |
| 398 | spin_lock_init(&(SLAVE_AD_INFO(port->slave).rx_machine_lock)); | 398 | spin_lock_init(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | //conversions | 401 | //conversions |
| @@ -1025,9 +1025,6 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) | |||
| 1025 | { | 1025 | { |
| 1026 | rx_states_t last_state; | 1026 | rx_states_t last_state; |
| 1027 | 1027 | ||
| 1028 | // Lock to prevent 2 instances of this function to run simultaneously(rx interrupt and periodic machine callback) | ||
| 1029 | __get_rx_machine_lock(port); | ||
| 1030 | |||
| 1031 | // keep current State Machine state to compare later if it was changed | 1028 | // keep current State Machine state to compare later if it was changed |
| 1032 | last_state = port->sm_rx_state; | 1029 | last_state = port->sm_rx_state; |
| 1033 | 1030 | ||
| @@ -1133,7 +1130,6 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) | |||
| 1133 | pr_err("%s: An illegal loopback occurred on adapter (%s).\n" | 1130 | pr_err("%s: An illegal loopback occurred on adapter (%s).\n" |
| 1134 | "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n", | 1131 | "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n", |
| 1135 | port->slave->dev->master->name, port->slave->dev->name); | 1132 | port->slave->dev->master->name, port->slave->dev->name); |
| 1136 | __release_rx_machine_lock(port); | ||
| 1137 | return; | 1133 | return; |
| 1138 | } | 1134 | } |
| 1139 | __update_selected(lacpdu, port); | 1135 | __update_selected(lacpdu, port); |
| @@ -1153,7 +1149,6 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) | |||
| 1153 | break; | 1149 | break; |
| 1154 | } | 1150 | } |
| 1155 | } | 1151 | } |
| 1156 | __release_rx_machine_lock(port); | ||
| 1157 | } | 1152 | } |
| 1158 | 1153 | ||
| 1159 | /** | 1154 | /** |
| @@ -2155,6 +2150,12 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
| 2155 | goto re_arm; | 2150 | goto re_arm; |
| 2156 | } | 2151 | } |
| 2157 | 2152 | ||
| 2153 | /* Lock around state machines to protect data accessed | ||
| 2154 | * by all (e.g., port->sm_vars). ad_rx_machine may run | ||
| 2155 | * concurrently due to incoming LACPDU. | ||
| 2156 | */ | ||
| 2157 | __get_state_machine_lock(port); | ||
| 2158 | |||
| 2158 | ad_rx_machine(NULL, port); | 2159 | ad_rx_machine(NULL, port); |
| 2159 | ad_periodic_machine(port); | 2160 | ad_periodic_machine(port); |
| 2160 | ad_port_selection_logic(port); | 2161 | ad_port_selection_logic(port); |
| @@ -2164,6 +2165,8 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
| 2164 | // turn off the BEGIN bit, since we already handled it | 2165 | // turn off the BEGIN bit, since we already handled it |
| 2165 | if (port->sm_vars & AD_PORT_BEGIN) | 2166 | if (port->sm_vars & AD_PORT_BEGIN) |
| 2166 | port->sm_vars &= ~AD_PORT_BEGIN; | 2167 | port->sm_vars &= ~AD_PORT_BEGIN; |
| 2168 | |||
| 2169 | __release_state_machine_lock(port); | ||
| 2167 | } | 2170 | } |
| 2168 | 2171 | ||
| 2169 | re_arm: | 2172 | re_arm: |
| @@ -2200,7 +2203,10 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u | |||
| 2200 | case AD_TYPE_LACPDU: | 2203 | case AD_TYPE_LACPDU: |
| 2201 | pr_debug("Received LACPDU on port %d\n", | 2204 | pr_debug("Received LACPDU on port %d\n", |
| 2202 | port->actor_port_number); | 2205 | port->actor_port_number); |
| 2206 | /* Protect against concurrent state machines */ | ||
| 2207 | __get_state_machine_lock(port); | ||
| 2203 | ad_rx_machine(lacpdu, port); | 2208 | ad_rx_machine(lacpdu, port); |
| 2209 | __release_state_machine_lock(port); | ||
| 2204 | break; | 2210 | break; |
| 2205 | 2211 | ||
| 2206 | case AD_TYPE_MARKER: | 2212 | case AD_TYPE_MARKER: |
diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index 2c46a154f2c..b28baff7086 100644 --- a/drivers/net/bonding/bond_3ad.h +++ b/drivers/net/bonding/bond_3ad.h | |||
| @@ -264,7 +264,8 @@ struct ad_bond_info { | |||
| 264 | struct ad_slave_info { | 264 | struct ad_slave_info { |
| 265 | struct aggregator aggregator; // 802.3ad aggregator structure | 265 | struct aggregator aggregator; // 802.3ad aggregator structure |
| 266 | struct port port; // 802.3ad port structure | 266 | struct port port; // 802.3ad port structure |
| 267 | spinlock_t rx_machine_lock; // To avoid race condition between callback and receive interrupt | 267 | spinlock_t state_machine_lock; /* mutex state machines vs. |
| 268 | incoming LACPDU */ | ||
| 268 | u16 id; | 269 | u16 id; |
| 269 | }; | 270 | }; |
| 270 | 271 | ||
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 5933621ac3f..fc27a9926d9 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
| @@ -528,8 +528,9 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, | |||
| 528 | vnet_hdr_len = q->vnet_hdr_sz; | 528 | vnet_hdr_len = q->vnet_hdr_sz; |
| 529 | 529 | ||
| 530 | err = -EINVAL; | 530 | err = -EINVAL; |
| 531 | if ((len -= vnet_hdr_len) < 0) | 531 | if (len < vnet_hdr_len) |
| 532 | goto err; | 532 | goto err; |
| 533 | len -= vnet_hdr_len; | ||
| 533 | 534 | ||
| 534 | err = memcpy_fromiovecend((void *)&vnet_hdr, iv, 0, | 535 | err = memcpy_fromiovecend((void *)&vnet_hdr, iv, 0, |
| 535 | sizeof(vnet_hdr)); | 536 | sizeof(vnet_hdr)); |
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 27e6f6d43ca..e3ebd90ae65 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c | |||
| @@ -49,8 +49,8 @@ | |||
| 49 | #include <asm/processor.h> | 49 | #include <asm/processor.h> |
| 50 | 50 | ||
| 51 | #define DRV_NAME "r6040" | 51 | #define DRV_NAME "r6040" |
| 52 | #define DRV_VERSION "0.26" | 52 | #define DRV_VERSION "0.27" |
| 53 | #define DRV_RELDATE "30May2010" | 53 | #define DRV_RELDATE "23Feb2011" |
| 54 | 54 | ||
| 55 | /* PHY CHIP Address */ | 55 | /* PHY CHIP Address */ |
| 56 | #define PHY1_ADDR 1 /* For MAC1 */ | 56 | #define PHY1_ADDR 1 /* For MAC1 */ |
| @@ -69,6 +69,8 @@ | |||
| 69 | 69 | ||
| 70 | /* MAC registers */ | 70 | /* MAC registers */ |
| 71 | #define MCR0 0x00 /* Control register 0 */ | 71 | #define MCR0 0x00 /* Control register 0 */ |
| 72 | #define MCR0_PROMISC 0x0020 /* Promiscuous mode */ | ||
| 73 | #define MCR0_HASH_EN 0x0100 /* Enable multicast hash table function */ | ||
| 72 | #define MCR1 0x04 /* Control register 1 */ | 74 | #define MCR1 0x04 /* Control register 1 */ |
| 73 | #define MAC_RST 0x0001 /* Reset the MAC */ | 75 | #define MAC_RST 0x0001 /* Reset the MAC */ |
| 74 | #define MBCR 0x08 /* Bus control */ | 76 | #define MBCR 0x08 /* Bus control */ |
| @@ -851,77 +853,92 @@ static void r6040_multicast_list(struct net_device *dev) | |||
| 851 | { | 853 | { |
| 852 | struct r6040_private *lp = netdev_priv(dev); | 854 | struct r6040_private *lp = netdev_priv(dev); |
| 853 | void __iomem *ioaddr = lp->base; | 855 | void __iomem *ioaddr = lp->base; |
| 854 | u16 *adrp; | ||
| 855 | u16 reg; | ||
| 856 | unsigned long flags; | 856 | unsigned long flags; |
| 857 | struct netdev_hw_addr *ha; | 857 | struct netdev_hw_addr *ha; |
| 858 | int i; | 858 | int i; |
| 859 | u16 *adrp; | ||
| 860 | u16 hash_table[4] = { 0 }; | ||
| 861 | |||
| 862 | spin_lock_irqsave(&lp->lock, flags); | ||
| 859 | 863 | ||
| 860 | /* MAC Address */ | 864 | /* Keep our MAC Address */ |
| 861 | adrp = (u16 *)dev->dev_addr; | 865 | adrp = (u16 *)dev->dev_addr; |
| 862 | iowrite16(adrp[0], ioaddr + MID_0L); | 866 | iowrite16(adrp[0], ioaddr + MID_0L); |
| 863 | iowrite16(adrp[1], ioaddr + MID_0M); | 867 | iowrite16(adrp[1], ioaddr + MID_0M); |
| 864 | iowrite16(adrp[2], ioaddr + MID_0H); | 868 | iowrite16(adrp[2], ioaddr + MID_0H); |
| 865 | 869 | ||
| 866 | /* Promiscous Mode */ | ||
| 867 | spin_lock_irqsave(&lp->lock, flags); | ||
| 868 | |||
| 869 | /* Clear AMCP & PROM bits */ | 870 | /* Clear AMCP & PROM bits */ |
| 870 | reg = ioread16(ioaddr) & ~0x0120; | 871 | lp->mcr0 = ioread16(ioaddr + MCR0) & ~(MCR0_PROMISC | MCR0_HASH_EN); |
| 871 | if (dev->flags & IFF_PROMISC) { | ||
| 872 | reg |= 0x0020; | ||
| 873 | lp->mcr0 |= 0x0020; | ||
| 874 | } | ||
| 875 | /* Too many multicast addresses | ||
| 876 | * accept all traffic */ | ||
| 877 | else if ((netdev_mc_count(dev) > MCAST_MAX) || | ||
| 878 | (dev->flags & IFF_ALLMULTI)) | ||
| 879 | reg |= 0x0020; | ||
| 880 | 872 | ||
| 881 | iowrite16(reg, ioaddr); | 873 | /* Promiscuous mode */ |
| 882 | spin_unlock_irqrestore(&lp->lock, flags); | 874 | if (dev->flags & IFF_PROMISC) |
| 875 | lp->mcr0 |= MCR0_PROMISC; | ||
| 883 | 876 | ||
| 884 | /* Build the hash table */ | 877 | /* Enable multicast hash table function to |
| 885 | if (netdev_mc_count(dev) > MCAST_MAX) { | 878 | * receive all multicast packets. */ |
| 886 | u16 hash_table[4]; | 879 | else if (dev->flags & IFF_ALLMULTI) { |
| 887 | u32 crc; | 880 | lp->mcr0 |= MCR0_HASH_EN; |
| 888 | 881 | ||
| 889 | for (i = 0; i < 4; i++) | 882 | for (i = 0; i < MCAST_MAX ; i++) { |
| 890 | hash_table[i] = 0; | 883 | iowrite16(0, ioaddr + MID_1L + 8 * i); |
| 884 | iowrite16(0, ioaddr + MID_1M + 8 * i); | ||
| 885 | iowrite16(0, ioaddr + MID_1H + 8 * i); | ||
| 886 | } | ||
| 891 | 887 | ||
| 888 | for (i = 0; i < 4; i++) | ||
| 889 | hash_table[i] = 0xffff; | ||
| 890 | } | ||
| 891 | /* Use internal multicast address registers if the number of | ||
| 892 | * multicast addresses is not greater than MCAST_MAX. */ | ||
| 893 | else if (netdev_mc_count(dev) <= MCAST_MAX) { | ||
| 894 | i = 0; | ||
| 892 | netdev_for_each_mc_addr(ha, dev) { | 895 | netdev_for_each_mc_addr(ha, dev) { |
| 893 | char *addrs = ha->addr; | 896 | u16 *adrp = (u16 *) ha->addr; |
| 897 | iowrite16(adrp[0], ioaddr + MID_1L + 8 * i); | ||
| 898 | iowrite16(adrp[1], ioaddr + MID_1M + 8 * i); | ||
| 899 | iowrite16(adrp[2], ioaddr + MID_1H + 8 * i); | ||
| 900 | i++; | ||
| 901 | } | ||
| 902 | while (i < MCAST_MAX) { | ||
| 903 | iowrite16(0, ioaddr + MID_1L + 8 * i); | ||
| 904 | iowrite16(0, ioaddr + MID_1M + 8 * i); | ||
| 905 | iowrite16(0, ioaddr + MID_1H + 8 * i); | ||
| 906 | i++; | ||
| 907 | } | ||
| 908 | } | ||
| 909 | /* Otherwise, Enable multicast hash table function. */ | ||
| 910 | else { | ||
| 911 | u32 crc; | ||
| 894 | 912 | ||
| 895 | if (!(*addrs & 1)) | 913 | lp->mcr0 |= MCR0_HASH_EN; |
| 896 | continue; | 914 | |
| 915 | for (i = 0; i < MCAST_MAX ; i++) { | ||
| 916 | iowrite16(0, ioaddr + MID_1L + 8 * i); | ||
| 917 | iowrite16(0, ioaddr + MID_1M + 8 * i); | ||
| 918 | iowrite16(0, ioaddr + MID_1H + 8 * i); | ||
| 919 | } | ||
| 897 | 920 | ||
| 898 | crc = ether_crc_le(6, addrs); | 921 | /* Build multicast hash table */ |
| 922 | netdev_for_each_mc_addr(ha, dev) { | ||
| 923 | u8 *addrs = ha->addr; | ||
| 924 | |||
| 925 | crc = ether_crc(ETH_ALEN, addrs); | ||
| 899 | crc >>= 26; | 926 | crc >>= 26; |
| 900 | hash_table[crc >> 4] |= 1 << (15 - (crc & 0xf)); | 927 | hash_table[crc >> 4] |= 1 << (crc & 0xf); |
| 901 | } | 928 | } |
| 902 | /* Fill the MAC hash tables with their values */ | 929 | } |
| 930 | |||
| 931 | iowrite16(lp->mcr0, ioaddr + MCR0); | ||
| 932 | |||
| 933 | /* Fill the MAC hash tables with their values */ | ||
| 934 | if (lp->mcr0 && MCR0_HASH_EN) { | ||
| 903 | iowrite16(hash_table[0], ioaddr + MAR0); | 935 | iowrite16(hash_table[0], ioaddr + MAR0); |
| 904 | iowrite16(hash_table[1], ioaddr + MAR1); | 936 | iowrite16(hash_table[1], ioaddr + MAR1); |
| 905 | iowrite16(hash_table[2], ioaddr + MAR2); | 937 | iowrite16(hash_table[2], ioaddr + MAR2); |
| 906 | iowrite16(hash_table[3], ioaddr + MAR3); | 938 | iowrite16(hash_table[3], ioaddr + MAR3); |
| 907 | } | 939 | } |
| 908 | /* Multicast Address 1~4 case */ | 940 | |
| 909 | i = 0; | 941 | spin_unlock_irqrestore(&lp->lock, flags); |
| 910 | netdev_for_each_mc_addr(ha, dev) { | ||
| 911 | if (i >= MCAST_MAX) | ||
| 912 | break; | ||
| 913 | adrp = (u16 *) ha->addr; | ||
| 914 | iowrite16(adrp[0], ioaddr + MID_1L + 8 * i); | ||
| 915 | iowrite16(adrp[1], ioaddr + MID_1M + 8 * i); | ||
| 916 | iowrite16(adrp[2], ioaddr + MID_1H + 8 * i); | ||
| 917 | i++; | ||
| 918 | } | ||
| 919 | while (i < MCAST_MAX) { | ||
| 920 | iowrite16(0xffff, ioaddr + MID_1L + 8 * i); | ||
| 921 | iowrite16(0xffff, ioaddr + MID_1M + 8 * i); | ||
| 922 | iowrite16(0xffff, ioaddr + MID_1H + 8 * i); | ||
| 923 | i++; | ||
| 924 | } | ||
| 925 | } | 942 | } |
| 926 | 943 | ||
| 927 | static void netdev_get_drvinfo(struct net_device *dev, | 944 | static void netdev_get_drvinfo(struct net_device *dev, |
diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c index 64bfdae5956..d70bde95460 100644 --- a/drivers/net/smsc911x.c +++ b/drivers/net/smsc911x.c | |||
| @@ -1178,6 +1178,11 @@ static int smsc911x_open(struct net_device *dev) | |||
| 1178 | smsc911x_reg_write(pdata, HW_CFG, 0x00050000); | 1178 | smsc911x_reg_write(pdata, HW_CFG, 0x00050000); |
| 1179 | smsc911x_reg_write(pdata, AFC_CFG, 0x006E3740); | 1179 | smsc911x_reg_write(pdata, AFC_CFG, 0x006E3740); |
| 1180 | 1180 | ||
| 1181 | /* Increase the legal frame size of VLAN tagged frames to 1522 bytes */ | ||
| 1182 | spin_lock_irq(&pdata->mac_lock); | ||
| 1183 | smsc911x_mac_write(pdata, VLAN1, ETH_P_8021Q); | ||
| 1184 | spin_unlock_irq(&pdata->mac_lock); | ||
| 1185 | |||
| 1181 | /* Make sure EEPROM has finished loading before setting GPIO_CFG */ | 1186 | /* Make sure EEPROM has finished loading before setting GPIO_CFG */ |
| 1182 | timeout = 50; | 1187 | timeout = 50; |
| 1183 | while ((smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) && | 1188 | while ((smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) && |
diff --git a/net/Makefile b/net/Makefile index a3330ebe2c5..a51d9465e62 100644 --- a/net/Makefile +++ b/net/Makefile | |||
| @@ -19,9 +19,7 @@ obj-$(CONFIG_NETFILTER) += netfilter/ | |||
| 19 | obj-$(CONFIG_INET) += ipv4/ | 19 | obj-$(CONFIG_INET) += ipv4/ |
| 20 | obj-$(CONFIG_XFRM) += xfrm/ | 20 | obj-$(CONFIG_XFRM) += xfrm/ |
| 21 | obj-$(CONFIG_UNIX) += unix/ | 21 | obj-$(CONFIG_UNIX) += unix/ |
| 22 | ifneq ($(CONFIG_IPV6),) | 22 | obj-$(CONFIG_NET) += ipv6/ |
| 23 | obj-y += ipv6/ | ||
| 24 | endif | ||
| 25 | obj-$(CONFIG_PACKET) += packet/ | 23 | obj-$(CONFIG_PACKET) += packet/ |
| 26 | obj-$(CONFIG_NET_KEY) += key/ | 24 | obj-$(CONFIG_NET_KEY) += key/ |
| 27 | obj-$(CONFIG_BRIDGE) += bridge/ | 25 | obj-$(CONFIG_BRIDGE) += bridge/ |
diff --git a/net/bridge/Kconfig b/net/bridge/Kconfig index 9190ae462cb..6dee7bf648a 100644 --- a/net/bridge/Kconfig +++ b/net/bridge/Kconfig | |||
| @@ -6,6 +6,7 @@ config BRIDGE | |||
| 6 | tristate "802.1d Ethernet Bridging" | 6 | tristate "802.1d Ethernet Bridging" |
| 7 | select LLC | 7 | select LLC |
| 8 | select STP | 8 | select STP |
| 9 | depends on IPV6 || IPV6=n | ||
| 9 | ---help--- | 10 | ---help--- |
| 10 | If you say Y here, then your Linux box will be able to act as an | 11 | If you say Y here, then your Linux box will be able to act as an |
| 11 | Ethernet bridge, which means that the different Ethernet segments it | 12 | Ethernet bridge, which means that the different Ethernet segments it |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index a9e7fc4c461..b5bada92f63 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -3321,7 +3321,7 @@ static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) | |||
| 3321 | pkt_dev->started_at); | 3321 | pkt_dev->started_at); |
| 3322 | ktime_t idle = ns_to_ktime(pkt_dev->idle_acc); | 3322 | ktime_t idle = ns_to_ktime(pkt_dev->idle_acc); |
| 3323 | 3323 | ||
| 3324 | p += sprintf(p, "OK: %llu(c%llu+d%llu) nsec, %llu (%dbyte,%dfrags)\n", | 3324 | p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags)\n", |
| 3325 | (unsigned long long)ktime_to_us(elapsed), | 3325 | (unsigned long long)ktime_to_us(elapsed), |
| 3326 | (unsigned long long)ktime_to_us(ktime_sub(elapsed, idle)), | 3326 | (unsigned long long)ktime_to_us(ktime_sub(elapsed, idle)), |
| 3327 | (unsigned long long)ktime_to_us(idle), | 3327 | (unsigned long long)ktime_to_us(idle), |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index df4616fce92..036652c8166 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -670,7 +670,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
| 670 | ifap = &ifa->ifa_next) { | 670 | ifap = &ifa->ifa_next) { |
| 671 | if (!strcmp(ifr.ifr_name, ifa->ifa_label) && | 671 | if (!strcmp(ifr.ifr_name, ifa->ifa_label) && |
| 672 | sin_orig.sin_addr.s_addr == | 672 | sin_orig.sin_addr.s_addr == |
| 673 | ifa->ifa_address) { | 673 | ifa->ifa_local) { |
| 674 | break; /* found */ | 674 | break; /* found */ |
| 675 | } | 675 | } |
| 676 | } | 676 | } |
| @@ -1040,8 +1040,8 @@ static void inetdev_send_gratuitous_arp(struct net_device *dev, | |||
| 1040 | return; | 1040 | return; |
| 1041 | 1041 | ||
| 1042 | arp_send(ARPOP_REQUEST, ETH_P_ARP, | 1042 | arp_send(ARPOP_REQUEST, ETH_P_ARP, |
| 1043 | ifa->ifa_address, dev, | 1043 | ifa->ifa_local, dev, |
| 1044 | ifa->ifa_address, NULL, | 1044 | ifa->ifa_local, NULL, |
| 1045 | dev->dev_addr, NULL); | 1045 | dev->dev_addr, NULL); |
| 1046 | } | 1046 | } |
| 1047 | 1047 | ||
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 4f4483e697b..e528a42a52b 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -57,6 +57,7 @@ | |||
| 57 | MODULE_AUTHOR("Ville Nuorvala"); | 57 | MODULE_AUTHOR("Ville Nuorvala"); |
| 58 | MODULE_DESCRIPTION("IPv6 tunneling device"); | 58 | MODULE_DESCRIPTION("IPv6 tunneling device"); |
| 59 | MODULE_LICENSE("GPL"); | 59 | MODULE_LICENSE("GPL"); |
| 60 | MODULE_ALIAS_NETDEV("ip6tnl0"); | ||
| 60 | 61 | ||
| 61 | #ifdef IP6_TNL_DEBUG | 62 | #ifdef IP6_TNL_DEBUG |
| 62 | #define IP6_TNL_TRACE(x...) printk(KERN_DEBUG "%s:" x "\n", __func__) | 63 | #define IP6_TNL_TRACE(x...) printk(KERN_DEBUG "%s:" x "\n", __func__) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 904312e25a3..e7db7014e89 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -739,8 +739,10 @@ restart: | |||
| 739 | 739 | ||
| 740 | if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) | 740 | if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
| 741 | nrt = rt6_alloc_cow(rt, &fl->fl6_dst, &fl->fl6_src); | 741 | nrt = rt6_alloc_cow(rt, &fl->fl6_dst, &fl->fl6_src); |
| 742 | else | 742 | else if (!(rt->dst.flags & DST_HOST)) |
| 743 | nrt = rt6_alloc_clone(rt, &fl->fl6_dst); | 743 | nrt = rt6_alloc_clone(rt, &fl->fl6_dst); |
| 744 | else | ||
| 745 | goto out2; | ||
| 744 | 746 | ||
| 745 | dst_release(&rt->dst); | 747 | dst_release(&rt->dst); |
| 746 | rt = nrt ? : net->ipv6.ip6_null_entry; | 748 | rt = nrt ? : net->ipv6.ip6_null_entry; |
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index 71f373c421b..c47a511f203 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c | |||
| @@ -551,7 +551,10 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 551 | if (conn->c_loopback | 551 | if (conn->c_loopback |
| 552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
| 553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
| 554 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 554 | scat = &rm->data.op_sg[sg]; |
| 555 | ret = sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | ||
| 556 | ret = min_t(int, ret, scat->length - conn->c_xmit_data_off); | ||
| 557 | return ret; | ||
| 555 | } | 558 | } |
| 556 | 559 | ||
| 557 | /* FIXME we may overallocate here */ | 560 | /* FIXME we may overallocate here */ |
diff --git a/net/rds/loop.c b/net/rds/loop.c index aeec1d483b1..bca6761a3ca 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c | |||
| @@ -61,10 +61,15 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 61 | unsigned int hdr_off, unsigned int sg, | 61 | unsigned int hdr_off, unsigned int sg, |
| 62 | unsigned int off) | 62 | unsigned int off) |
| 63 | { | 63 | { |
| 64 | struct scatterlist *sgp = &rm->data.op_sg[sg]; | ||
| 65 | int ret = sizeof(struct rds_header) + | ||
| 66 | be32_to_cpu(rm->m_inc.i_hdr.h_len); | ||
| 67 | |||
| 64 | /* Do not send cong updates to loopback */ | 68 | /* Do not send cong updates to loopback */ |
| 65 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 69 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
| 66 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 70 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
| 67 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 71 | ret = min_t(int, ret, sgp->length - conn->c_xmit_data_off); |
| 72 | goto out; | ||
| 68 | } | 73 | } |
| 69 | 74 | ||
| 70 | BUG_ON(hdr_off || sg || off); | 75 | BUG_ON(hdr_off || sg || off); |
| @@ -80,8 +85,8 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 80 | NULL); | 85 | NULL); |
| 81 | 86 | ||
| 82 | rds_inc_put(&rm->m_inc); | 87 | rds_inc_put(&rm->m_inc); |
| 83 | 88 | out: | |
| 84 | return sizeof(struct rds_header) + be32_to_cpu(rm->m_inc.i_hdr.h_len); | 89 | return ret; |
| 85 | } | 90 | } |
| 86 | 91 | ||
| 87 | /* | 92 | /* |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index dd419d28620..437a99e560e 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -1724,7 +1724,11 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1724 | 1724 | ||
| 1725 | msg->msg_namelen = 0; | 1725 | msg->msg_namelen = 0; |
| 1726 | 1726 | ||
| 1727 | mutex_lock(&u->readlock); | 1727 | err = mutex_lock_interruptible(&u->readlock); |
| 1728 | if (err) { | ||
| 1729 | err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); | ||
| 1730 | goto out; | ||
| 1731 | } | ||
| 1728 | 1732 | ||
| 1729 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 1733 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
| 1730 | if (!skb) { | 1734 | if (!skb) { |
| @@ -1864,7 +1868,11 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1864 | memset(&tmp_scm, 0, sizeof(tmp_scm)); | 1868 | memset(&tmp_scm, 0, sizeof(tmp_scm)); |
| 1865 | } | 1869 | } |
| 1866 | 1870 | ||
| 1867 | mutex_lock(&u->readlock); | 1871 | err = mutex_lock_interruptible(&u->readlock); |
| 1872 | if (err) { | ||
| 1873 | err = sock_intr_errno(timeo); | ||
| 1874 | goto out; | ||
| 1875 | } | ||
| 1868 | 1876 | ||
| 1869 | do { | 1877 | do { |
| 1870 | int chunk; | 1878 | int chunk; |
| @@ -1895,11 +1903,12 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1895 | 1903 | ||
| 1896 | timeo = unix_stream_data_wait(sk, timeo); | 1904 | timeo = unix_stream_data_wait(sk, timeo); |
| 1897 | 1905 | ||
| 1898 | if (signal_pending(current)) { | 1906 | if (signal_pending(current) |
| 1907 | || mutex_lock_interruptible(&u->readlock)) { | ||
| 1899 | err = sock_intr_errno(timeo); | 1908 | err = sock_intr_errno(timeo); |
| 1900 | goto out; | 1909 | goto out; |
| 1901 | } | 1910 | } |
| 1902 | mutex_lock(&u->readlock); | 1911 | |
| 1903 | continue; | 1912 | continue; |
| 1904 | unlock: | 1913 | unlock: |
| 1905 | unix_state_unlock(sk); | 1914 | unix_state_unlock(sk); |
