Skip to content

Commit ee873fd

Browse files
claudiu-mdavem330
authored andcommitted
gianfar: Pack struct gfar_priv_grp into three cachelines
* remove unused members(!): imask, ievent * move space consuming interrupt name strings (int_name_* members) to external structures, unessential for the driver's hot path * keep high priority hot path data within the first 2 cache lines This reduces struct gfar_priv_grp from 6 to 3 cache lines. (Also fixed checkpatch warnings for the old code, in the process.) Signed-off-by: Claudiu Manoil <claudiu.manoil@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 5fedcc1 commit ee873fd

File tree

2 files changed

+87
-51
lines changed

2 files changed

+87
-51
lines changed

drivers/net/ethernet/freescale/gianfar.c

Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,19 @@ static void unmap_group_regs(struct gfar_private *priv)
544544
iounmap(priv->gfargrp[i].regs);
545545
}
546546

547+
static void free_gfar_dev(struct gfar_private *priv)
548+
{
549+
int i, j;
550+
551+
for (i = 0; i < priv->num_grps; i++)
552+
for (j = 0; j < GFAR_NUM_IRQS; j++) {
553+
kfree(priv->gfargrp[i].irqinfo[j]);
554+
priv->gfargrp[i].irqinfo[j] = NULL;
555+
}
556+
557+
free_netdev(priv->ndev);
558+
}
559+
547560
static void disable_napi(struct gfar_private *priv)
548561
{
549562
int i;
@@ -565,20 +578,36 @@ static int gfar_parse_group(struct device_node *np,
565578
{
566579
struct gfar_priv_grp *grp = &priv->gfargrp[priv->num_grps];
567580
u32 *queue_mask;
581+
int i;
582+
583+
if (priv->mode == MQ_MG_MODE) {
584+
for (i = 0; i < GFAR_NUM_IRQS; i++) {
585+
grp->irqinfo[i] = kzalloc(sizeof(struct gfar_irqinfo),
586+
GFP_KERNEL);
587+
if (!grp->irqinfo[i])
588+
return -ENOMEM;
589+
}
590+
} else {
591+
grp->irqinfo[GFAR_TX] = kzalloc(sizeof(struct gfar_irqinfo),
592+
GFP_KERNEL);
593+
if (!grp->irqinfo[GFAR_TX])
594+
return -ENOMEM;
595+
grp->irqinfo[GFAR_RX] = grp->irqinfo[GFAR_ER] = NULL;
596+
}
568597

569598
grp->regs = of_iomap(np, 0);
570599
if (!grp->regs)
571600
return -ENOMEM;
572601

573-
grp->interruptTransmit = irq_of_parse_and_map(np, 0);
602+
gfar_irq(grp, TX)->irq = irq_of_parse_and_map(np, 0);
574603

575604
/* If we aren't the FEC we have multiple interrupts */
576605
if (model && strcasecmp(model, "FEC")) {
577-
grp->interruptReceive = irq_of_parse_and_map(np, 1);
578-
grp->interruptError = irq_of_parse_and_map(np, 2);
579-
if (grp->interruptTransmit == NO_IRQ ||
580-
grp->interruptReceive == NO_IRQ ||
581-
grp->interruptError == NO_IRQ)
606+
gfar_irq(grp, RX)->irq = irq_of_parse_and_map(np, 1);
607+
gfar_irq(grp, ER)->irq = irq_of_parse_and_map(np, 2);
608+
if (gfar_irq(grp, TX)->irq == NO_IRQ ||
609+
gfar_irq(grp, RX)->irq == NO_IRQ ||
610+
gfar_irq(grp, ER)->irq == NO_IRQ)
582611
return -EINVAL;
583612
}
584613

@@ -779,7 +808,7 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
779808
free_tx_pointers(priv);
780809
err_grp_init:
781810
unmap_group_regs(priv);
782-
free_netdev(dev);
811+
free_gfar_dev(priv);
783812
return err;
784813
}
785814

@@ -1184,15 +1213,16 @@ static int gfar_probe(struct platform_device *ofdev)
11841213

11851214
/* fill out IRQ number and name fields */
11861215
for (i = 0; i < priv->num_grps; i++) {
1216+
struct gfar_priv_grp *grp = &priv->gfargrp[i];
11871217
if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
1188-
sprintf(priv->gfargrp[i].int_name_tx, "%s%s%c%s",
1218+
sprintf(gfar_irq(grp, TX)->name, "%s%s%c%s",
11891219
dev->name, "_g", '0' + i, "_tx");
1190-
sprintf(priv->gfargrp[i].int_name_rx, "%s%s%c%s",
1220+
sprintf(gfar_irq(grp, RX)->name, "%s%s%c%s",
11911221
dev->name, "_g", '0' + i, "_rx");
1192-
sprintf(priv->gfargrp[i].int_name_er, "%s%s%c%s",
1222+
sprintf(gfar_irq(grp, ER)->name, "%s%s%c%s",
11931223
dev->name, "_g", '0' + i, "_er");
11941224
} else
1195-
strcpy(priv->gfargrp[i].int_name_tx, dev->name);
1225+
strcpy(gfar_irq(grp, TX)->name, dev->name);
11961226
}
11971227

11981228
/* Initialize the filer table */
@@ -1225,7 +1255,7 @@ static int gfar_probe(struct platform_device *ofdev)
12251255
of_node_put(priv->phy_node);
12261256
if (priv->tbi_node)
12271257
of_node_put(priv->tbi_node);
1228-
free_netdev(dev);
1258+
free_gfar_dev(priv);
12291259
return err;
12301260
}
12311261

@@ -1242,7 +1272,7 @@ static int gfar_remove(struct platform_device *ofdev)
12421272

12431273
unregister_netdev(priv->ndev);
12441274
unmap_group_regs(priv);
1245-
free_netdev(priv->ndev);
1275+
free_gfar_dev(priv);
12461276

12471277
return 0;
12481278
}
@@ -1650,9 +1680,9 @@ void gfar_halt(struct net_device *dev)
16501680

16511681
static void free_grp_irqs(struct gfar_priv_grp *grp)
16521682
{
1653-
free_irq(grp->interruptError, grp);
1654-
free_irq(grp->interruptTransmit, grp);
1655-
free_irq(grp->interruptReceive, grp);
1683+
free_irq(gfar_irq(grp, TX)->irq, grp);
1684+
free_irq(gfar_irq(grp, RX)->irq, grp);
1685+
free_irq(gfar_irq(grp, ER)->irq, grp);
16561686
}
16571687

16581688
void stop_gfar(struct net_device *dev)
@@ -1681,7 +1711,7 @@ void stop_gfar(struct net_device *dev)
16811711
free_grp_irqs(&priv->gfargrp[i]);
16821712
} else {
16831713
for (i = 0; i < priv->num_grps; i++)
1684-
free_irq(priv->gfargrp[i].interruptTransmit,
1714+
free_irq(gfar_irq(&priv->gfargrp[i], TX)->irq,
16851715
&priv->gfargrp[i]);
16861716
}
16871717

@@ -1856,42 +1886,44 @@ static int register_grp_irqs(struct gfar_priv_grp *grp)
18561886
/* Install our interrupt handlers for Error,
18571887
* Transmit, and Receive
18581888
*/
1859-
if ((err = request_irq(grp->interruptError, gfar_error,
1860-
0, grp->int_name_er, grp)) < 0) {
1889+
err = request_irq(gfar_irq(grp, ER)->irq, gfar_error, 0,
1890+
gfar_irq(grp, ER)->name, grp);
1891+
if (err < 0) {
18611892
netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1862-
grp->interruptError);
1893+
gfar_irq(grp, ER)->irq);
18631894

18641895
goto err_irq_fail;
18651896
}
1866-
1867-
if ((err = request_irq(grp->interruptTransmit, gfar_transmit,
1868-
0, grp->int_name_tx, grp)) < 0) {
1897+
err = request_irq(gfar_irq(grp, TX)->irq, gfar_transmit, 0,
1898+
gfar_irq(grp, TX)->name, grp);
1899+
if (err < 0) {
18691900
netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1870-
grp->interruptTransmit);
1901+
gfar_irq(grp, TX)->irq);
18711902
goto tx_irq_fail;
18721903
}
1873-
1874-
if ((err = request_irq(grp->interruptReceive, gfar_receive,
1875-
0, grp->int_name_rx, grp)) < 0) {
1904+
err = request_irq(gfar_irq(grp, RX)->irq, gfar_receive, 0,
1905+
gfar_irq(grp, RX)->name, grp);
1906+
if (err < 0) {
18761907
netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1877-
grp->interruptReceive);
1908+
gfar_irq(grp, RX)->irq);
18781909
goto rx_irq_fail;
18791910
}
18801911
} else {
1881-
if ((err = request_irq(grp->interruptTransmit, gfar_interrupt,
1882-
0, grp->int_name_tx, grp)) < 0) {
1912+
err = request_irq(gfar_irq(grp, TX)->irq, gfar_interrupt, 0,
1913+
gfar_irq(grp, TX)->name, grp);
1914+
if (err < 0) {
18831915
netif_err(priv, intr, dev, "Can't get IRQ %d\n",
1884-
grp->interruptTransmit);
1916+
gfar_irq(grp, TX)->irq);
18851917
goto err_irq_fail;
18861918
}
18871919
}
18881920

18891921
return 0;
18901922

18911923
rx_irq_fail:
1892-
free_irq(grp->interruptTransmit, grp);
1924+
free_irq(gfar_irq(grp, TX)->irq, grp);
18931925
tx_irq_fail:
1894-
free_irq(grp->interruptError, grp);
1926+
free_irq(gfar_irq(grp, ER)->irq, grp);
18951927
err_irq_fail:
18961928
return err;
18971929

drivers/net/ethernet/freescale/gianfar.h

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -996,18 +996,25 @@ struct gfar_priv_rx_q {
996996
unsigned long rxic;
997997
};
998998

999+
enum gfar_irqinfo_id {
1000+
GFAR_TX = 0,
1001+
GFAR_RX = 1,
1002+
GFAR_ER = 2,
1003+
GFAR_NUM_IRQS = 3
1004+
};
1005+
1006+
struct gfar_irqinfo {
1007+
unsigned int irq;
1008+
char name[GFAR_INT_NAME_MAX];
1009+
};
1010+
9991011
/**
10001012
* struct gfar_priv_grp - per group structure
10011013
* @napi: the napi poll function
10021014
* @priv: back pointer to the priv structure
10031015
* @regs: the ioremapped register space for this group
10041016
* @grp_id: group id for this group
1005-
* @interruptTransmit: The TX interrupt number for this group
1006-
* @interruptReceive: The RX interrupt number for this group
1007-
* @interruptError: The ERROR interrupt number for this group
1008-
* @int_name_tx: tx interrupt name for this group
1009-
* @int_name_rx: rx interrupt name for this group
1010-
* @int_name_er: er interrupt name for this group
1017+
* @irqinfo: TX/RX/ER irq data for this group
10111018
*/
10121019

10131020
struct gfar_priv_grp {
@@ -1016,23 +1023,20 @@ struct gfar_priv_grp {
10161023
struct gfar_private *priv;
10171024
struct gfar __iomem *regs;
10181025
unsigned int grp_id;
1019-
unsigned long rx_bit_map;
1020-
unsigned long tx_bit_map;
1021-
unsigned long num_tx_queues;
10221026
unsigned long num_rx_queues;
1027+
unsigned long rx_bit_map;
1028+
/* cacheline 3 */
10231029
unsigned int rstat;
10241030
unsigned int tstat;
1025-
unsigned int imask;
1026-
unsigned int ievent;
1027-
unsigned int interruptTransmit;
1028-
unsigned int interruptReceive;
1029-
unsigned int interruptError;
1030-
1031-
char int_name_tx[GFAR_INT_NAME_MAX];
1032-
char int_name_rx[GFAR_INT_NAME_MAX];
1033-
char int_name_er[GFAR_INT_NAME_MAX];
1031+
unsigned long num_tx_queues;
1032+
unsigned long tx_bit_map;
1033+
1034+
struct gfar_irqinfo *irqinfo[GFAR_NUM_IRQS];
10341035
};
10351036

1037+
#define gfar_irq(grp, ID) \
1038+
((grp)->irqinfo[GFAR_##ID])
1039+
10361040
enum gfar_errata {
10371041
GFAR_ERRATA_74 = 0x01,
10381042
GFAR_ERRATA_76 = 0x02,

0 commit comments

Comments
 (0)