forked from Minki/linux
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
821781a9f4
@ -643,9 +643,8 @@
|
||||
reg = <0x30730000 0x10000>;
|
||||
interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>,
|
||||
<&clks IMX7D_CLK_DUMMY>,
|
||||
<&clks IMX7D_CLK_DUMMY>;
|
||||
clock-names = "pix", "axi", "disp_axi";
|
||||
<&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>;
|
||||
clock-names = "pix", "axi";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
@ -82,6 +82,10 @@
|
||||
gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&sata {
|
||||
nr-ports = <2>;
|
||||
};
|
||||
|
||||
&ehci1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -410,7 +410,7 @@
|
||||
};
|
||||
|
||||
uart3_pins: uart3 {
|
||||
allwinner,pins = "PG13", "PG14";
|
||||
allwinner,pins = "PA13", "PA14";
|
||||
allwinner,function = "uart3";
|
||||
allwinner,drive = <SUN4I_PINCTRL_10_MA>;
|
||||
allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
|
||||
|
@ -95,9 +95,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -105,8 +106,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -366,6 +369,7 @@ CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_A2065=y
|
||||
CONFIG_ARIADNE=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
|
@ -93,9 +93,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -103,8 +104,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -347,6 +350,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
|
@ -93,9 +93,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -103,8 +104,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -356,6 +359,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_ATARILANCE=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
|
@ -91,9 +91,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -101,8 +102,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -346,6 +349,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
|
@ -93,9 +93,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -103,8 +104,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -347,6 +350,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_HPLANCE=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
|
@ -92,9 +92,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -102,8 +103,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -363,6 +366,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_MACMACE=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
|
@ -102,9 +102,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -112,8 +113,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -397,6 +400,7 @@ CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_A2065=y
|
||||
CONFIG_ARIADNE=y
|
||||
CONFIG_ATARILANCE=y
|
||||
|
@ -90,9 +90,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -100,8 +101,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -345,6 +348,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_MVME147_NET=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
|
@ -91,9 +91,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -101,8 +102,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -346,6 +349,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
|
@ -91,9 +91,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -101,8 +102,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -353,6 +356,7 @@ CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
# CONFIG_NET_VENDOR_AMD is not set
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
|
@ -88,9 +88,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -98,8 +99,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -343,6 +346,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_SUN3LANCE=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
|
@ -88,9 +88,10 @@ CONFIG_NF_TABLES_INET=m
|
||||
CONFIG_NF_TABLES_NETDEV=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_RBTREE=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_SET_RBTREE=m
|
||||
CONFIG_NFT_SET_HASH=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@ -98,8 +99,10 @@ CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_QUOTA=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_HASH=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
@ -343,6 +346,7 @@ CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
CONFIG_SUN3LANCE=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
|
@ -114,6 +114,6 @@ static inline void __udelay(unsigned long usecs)
|
||||
*/
|
||||
#define HZSCALE (268435456 / (1000000 / HZ))
|
||||
|
||||
#define ndelay(n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000));
|
||||
#define ndelay(n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000))
|
||||
|
||||
#endif /* defined(_M68K_DELAY_H) */
|
||||
|
@ -65,9 +65,9 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
||||
unsigned long flags; \
|
||||
spin_lock_irqsave(&pa_tlb_lock, flags); \
|
||||
old_pte = *ptep; \
|
||||
set_pte(ptep, pteval); \
|
||||
if (pte_inserted(old_pte)) \
|
||||
purge_tlb_entries(mm, addr); \
|
||||
set_pte(ptep, pteval); \
|
||||
spin_unlock_irqrestore(&pa_tlb_lock, flags); \
|
||||
} while (0)
|
||||
|
||||
@ -478,8 +478,8 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned
|
||||
spin_unlock_irqrestore(&pa_tlb_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
set_pte(ptep, pte_mkold(pte));
|
||||
purge_tlb_entries(vma->vm_mm, addr);
|
||||
set_pte(ptep, pte_mkold(pte));
|
||||
spin_unlock_irqrestore(&pa_tlb_lock, flags);
|
||||
return 1;
|
||||
}
|
||||
@ -492,9 +492,9 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
|
||||
|
||||
spin_lock_irqsave(&pa_tlb_lock, flags);
|
||||
old_pte = *ptep;
|
||||
set_pte(ptep, __pte(0));
|
||||
if (pte_inserted(old_pte))
|
||||
purge_tlb_entries(mm, addr);
|
||||
set_pte(ptep, __pte(0));
|
||||
spin_unlock_irqrestore(&pa_tlb_lock, flags);
|
||||
|
||||
return old_pte;
|
||||
@ -504,8 +504,8 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&pa_tlb_lock, flags);
|
||||
set_pte(ptep, pte_wrprotect(*ptep));
|
||||
purge_tlb_entries(mm, addr);
|
||||
set_pte(ptep, pte_wrprotect(*ptep));
|
||||
spin_unlock_irqrestore(&pa_tlb_lock, flags);
|
||||
}
|
||||
|
||||
|
@ -393,6 +393,15 @@ void __init parisc_setup_cache_timing(void)
|
||||
|
||||
/* calculate TLB flush threshold */
|
||||
|
||||
/* On SMP machines, skip the TLB measure of kernel text which
|
||||
* has been mapped as huge pages. */
|
||||
if (num_online_cpus() > 1 && !parisc_requires_coherency()) {
|
||||
threshold = max(cache_info.it_size, cache_info.dt_size);
|
||||
threshold *= PAGE_SIZE;
|
||||
threshold /= num_online_cpus();
|
||||
goto set_tlb_threshold;
|
||||
}
|
||||
|
||||
alltime = mfctl(16);
|
||||
flush_tlb_all();
|
||||
alltime = mfctl(16) - alltime;
|
||||
@ -411,6 +420,8 @@ void __init parisc_setup_cache_timing(void)
|
||||
alltime, size, rangetime);
|
||||
|
||||
threshold = PAGE_ALIGN(num_online_cpus() * size * alltime / rangetime);
|
||||
|
||||
set_tlb_threshold:
|
||||
if (threshold)
|
||||
parisc_tlb_flush_threshold = threshold;
|
||||
printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
|
||||
|
@ -892,19 +892,10 @@ ENTRY_CFI(flush_dcache_page_asm)
|
||||
fdc,m r31(%r28)
|
||||
fdc,m r31(%r28)
|
||||
fdc,m r31(%r28)
|
||||
cmpb,COND(<<) %r28, %r25,1b
|
||||
cmpb,COND(<<) %r28, %r25,1b
|
||||
fdc,m r31(%r28)
|
||||
|
||||
sync
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l %r0(%r25)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pdtlb %r0(%r25)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
bv %r0(%r2)
|
||||
nop
|
||||
.exit
|
||||
@ -979,17 +970,6 @@ ENTRY_CFI(flush_icache_page_asm)
|
||||
fic,m %r31(%sr4,%r28)
|
||||
|
||||
sync
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l %r0(%r28)
|
||||
pitlb,l %r0(%sr4,%r25)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pdtlb %r0(%r28)
|
||||
pitlb %r0(%sr4,%r25)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
bv %r0(%r2)
|
||||
nop
|
||||
.exit
|
||||
|
@ -69,7 +69,7 @@ u64 x86_perf_event_update(struct perf_event *event)
|
||||
int shift = 64 - x86_pmu.cntval_bits;
|
||||
u64 prev_raw_count, new_raw_count;
|
||||
int idx = hwc->idx;
|
||||
s64 delta;
|
||||
u64 delta;
|
||||
|
||||
if (idx == INTEL_PMC_IDX_FIXED_BTS)
|
||||
return 0;
|
||||
|
@ -4034,7 +4034,7 @@ __init int intel_pmu_init(void)
|
||||
|
||||
/* Support full width counters using alternative MSR range */
|
||||
if (x86_pmu.intel_cap.full_width_write) {
|
||||
x86_pmu.max_period = x86_pmu.cntval_mask;
|
||||
x86_pmu.max_period = x86_pmu.cntval_mask >> 1;
|
||||
x86_pmu.perfctr = MSR_IA32_PMC0;
|
||||
pr_cont("full-width counters, ");
|
||||
}
|
||||
|
@ -540,6 +540,7 @@ static const struct x86_cpu_id intel_cstates_match[] __initconst = {
|
||||
X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_DESKTOP, snb_cstates),
|
||||
|
||||
X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNL, knl_cstates),
|
||||
X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNM, knl_cstates),
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(x86cpu, intel_cstates_match);
|
||||
|
@ -272,7 +272,6 @@ struct compat_shmid64_ds {
|
||||
/*
|
||||
* The type of struct elf_prstatus.pr_reg in compatible core dumps.
|
||||
*/
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
typedef struct user_regs_struct compat_elf_gregset_t;
|
||||
|
||||
/* Full regset -- prstatus on x32, otherwise on ia32 */
|
||||
@ -281,10 +280,9 @@ typedef struct user_regs_struct compat_elf_gregset_t;
|
||||
do { *(int *) (((void *) &((S)->pr_reg)) + R) = (V); } \
|
||||
while (0)
|
||||
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
#define COMPAT_USE_64BIT_TIME \
|
||||
(!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT))
|
||||
#else
|
||||
typedef struct user_regs_struct32 compat_elf_gregset_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -815,9 +815,9 @@ static __init void map_mmioh_high_uv3(int index, int min_pnode, int max_pnode)
|
||||
l = li;
|
||||
}
|
||||
addr1 = (base << shift) +
|
||||
f * (unsigned long)(1 << m_io);
|
||||
f * (1ULL << m_io);
|
||||
addr2 = (base << shift) +
|
||||
(l + 1) * (unsigned long)(1 << m_io);
|
||||
(l + 1) * (1ULL << m_io);
|
||||
pr_info("UV: %s[%03d..%03d] NASID 0x%04x ADDR 0x%016lx - 0x%016lx\n",
|
||||
id, fi, li, lnasid, addr1, addr2);
|
||||
if (max_io < l)
|
||||
|
@ -7,11 +7,13 @@
|
||||
|
||||
unsigned long unwind_get_return_address(struct unwind_state *state)
|
||||
{
|
||||
unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
|
||||
unsigned long addr;
|
||||
|
||||
if (unwind_done(state))
|
||||
return 0;
|
||||
|
||||
addr = READ_ONCE_NOCHECK(*state->sp);
|
||||
|
||||
return ftrace_graph_ret_addr(state->task, &state->graph_idx,
|
||||
addr, state->sp);
|
||||
}
|
||||
@ -25,11 +27,12 @@ bool unwind_next_frame(struct unwind_state *state)
|
||||
return false;
|
||||
|
||||
do {
|
||||
unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
|
||||
for (state->sp++; state->sp < info->end; state->sp++) {
|
||||
unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
|
||||
|
||||
for (state->sp++; state->sp < info->end; state->sp++)
|
||||
if (__kernel_text_address(addr))
|
||||
return true;
|
||||
}
|
||||
|
||||
state->sp = info->next_sp;
|
||||
|
||||
|
@ -196,6 +196,7 @@ static int xo15_sci_remove(struct acpi_device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int xo15_sci_resume(struct device *dev)
|
||||
{
|
||||
/* Enable all EC events */
|
||||
@ -207,6 +208,7 @@ static int xo15_sci_resume(struct device *dev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(xo15_sci_pm, NULL, xo15_sci_resume);
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include <regex.h>
|
||||
#include <tools/le_byteshift.h>
|
||||
|
||||
void die(char *fmt, ...);
|
||||
void die(char *fmt, ...) __attribute__((noreturn));
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
|
@ -118,6 +118,9 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
||||
struct iov_iter i;
|
||||
int ret;
|
||||
|
||||
if (!iter_is_iovec(iter))
|
||||
goto fail;
|
||||
|
||||
if (map_data)
|
||||
copy = true;
|
||||
else if (iov_iter_alignment(iter) & align)
|
||||
@ -140,6 +143,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
||||
|
||||
unmap_rq:
|
||||
__blk_rq_unmap_user(bio);
|
||||
fail:
|
||||
rq->bio = NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -81,7 +81,11 @@ static inline bool aead_sufficient_data(struct aead_ctx *ctx)
|
||||
{
|
||||
unsigned as = crypto_aead_authsize(crypto_aead_reqtfm(&ctx->aead_req));
|
||||
|
||||
return ctx->used >= ctx->aead_assoclen + as;
|
||||
/*
|
||||
* The minimum amount of memory needed for an AEAD cipher is
|
||||
* the AAD and in case of decryption the tag.
|
||||
*/
|
||||
return ctx->used >= ctx->aead_assoclen + (ctx->enc ? 0 : as);
|
||||
}
|
||||
|
||||
static void aead_reset_ctx(struct aead_ctx *ctx)
|
||||
@ -415,7 +419,7 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
|
||||
unsigned int i, reqlen = GET_REQ_SIZE(tfm);
|
||||
int err = -ENOMEM;
|
||||
unsigned long used;
|
||||
size_t outlen;
|
||||
size_t outlen = 0;
|
||||
size_t usedpages = 0;
|
||||
|
||||
lock_sock(sk);
|
||||
@ -425,12 +429,15 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
used = ctx->used;
|
||||
outlen = used;
|
||||
|
||||
if (!aead_sufficient_data(ctx))
|
||||
goto unlock;
|
||||
|
||||
used = ctx->used;
|
||||
if (ctx->enc)
|
||||
outlen = used + as;
|
||||
else
|
||||
outlen = used - as;
|
||||
|
||||
req = sock_kmalloc(sk, reqlen, GFP_KERNEL);
|
||||
if (unlikely(!req))
|
||||
goto unlock;
|
||||
@ -444,7 +451,7 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
|
||||
aead_request_set_ad(req, ctx->aead_assoclen);
|
||||
aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
||||
aead_async_cb, sk);
|
||||
used -= ctx->aead_assoclen + (ctx->enc ? as : 0);
|
||||
used -= ctx->aead_assoclen;
|
||||
|
||||
/* take over all tx sgls from ctx */
|
||||
areq->tsgl = sock_kmalloc(sk, sizeof(*areq->tsgl) * sgl->cur,
|
||||
@ -460,7 +467,7 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
|
||||
areq->tsgls = sgl->cur;
|
||||
|
||||
/* create rx sgls */
|
||||
while (iov_iter_count(&msg->msg_iter)) {
|
||||
while (outlen > usedpages && iov_iter_count(&msg->msg_iter)) {
|
||||
size_t seglen = min_t(size_t, iov_iter_count(&msg->msg_iter),
|
||||
(outlen - usedpages));
|
||||
|
||||
@ -490,16 +497,14 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
|
||||
|
||||
last_rsgl = rsgl;
|
||||
|
||||
/* we do not need more iovecs as we have sufficient memory */
|
||||
if (outlen <= usedpages)
|
||||
break;
|
||||
|
||||
iov_iter_advance(&msg->msg_iter, err);
|
||||
}
|
||||
err = -EINVAL;
|
||||
|
||||
/* ensure output buffer is sufficiently large */
|
||||
if (usedpages < outlen)
|
||||
goto free;
|
||||
if (usedpages < outlen) {
|
||||
err = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
aead_request_set_crypt(req, areq->tsgl, areq->first_rsgl.sgl.sg, used,
|
||||
areq->iv);
|
||||
@ -570,6 +575,7 @@ static int aead_recvmsg_sync(struct socket *sock, struct msghdr *msg, int flags)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/* data length provided by caller via sendmsg/sendpage */
|
||||
used = ctx->used;
|
||||
|
||||
/*
|
||||
@ -584,16 +590,27 @@ static int aead_recvmsg_sync(struct socket *sock, struct msghdr *msg, int flags)
|
||||
if (!aead_sufficient_data(ctx))
|
||||
goto unlock;
|
||||
|
||||
outlen = used;
|
||||
/*
|
||||
* Calculate the minimum output buffer size holding the result of the
|
||||
* cipher operation. When encrypting data, the receiving buffer is
|
||||
* larger by the tag length compared to the input buffer as the
|
||||
* encryption operation generates the tag. For decryption, the input
|
||||
* buffer provides the tag which is consumed resulting in only the
|
||||
* plaintext without a buffer for the tag returned to the caller.
|
||||
*/
|
||||
if (ctx->enc)
|
||||
outlen = used + as;
|
||||
else
|
||||
outlen = used - as;
|
||||
|
||||
/*
|
||||
* The cipher operation input data is reduced by the associated data
|
||||
* length as this data is processed separately later on.
|
||||
*/
|
||||
used -= ctx->aead_assoclen + (ctx->enc ? as : 0);
|
||||
used -= ctx->aead_assoclen;
|
||||
|
||||
/* convert iovecs of output buffers into scatterlists */
|
||||
while (iov_iter_count(&msg->msg_iter)) {
|
||||
while (outlen > usedpages && iov_iter_count(&msg->msg_iter)) {
|
||||
size_t seglen = min_t(size_t, iov_iter_count(&msg->msg_iter),
|
||||
(outlen - usedpages));
|
||||
|
||||
@ -620,16 +637,14 @@ static int aead_recvmsg_sync(struct socket *sock, struct msghdr *msg, int flags)
|
||||
|
||||
last_rsgl = rsgl;
|
||||
|
||||
/* we do not need more iovecs as we have sufficient memory */
|
||||
if (outlen <= usedpages)
|
||||
break;
|
||||
iov_iter_advance(&msg->msg_iter, err);
|
||||
}
|
||||
|
||||
err = -EINVAL;
|
||||
/* ensure output buffer is sufficiently large */
|
||||
if (usedpages < outlen)
|
||||
if (usedpages < outlen) {
|
||||
err = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
sg_mark_end(sgl->sg + sgl->cur - 1);
|
||||
aead_request_set_crypt(&ctx->aead_req, sgl->sg, ctx->first_rsgl.sgl.sg,
|
||||
|
@ -254,18 +254,22 @@ out_free_inst:
|
||||
goto out;
|
||||
}
|
||||
|
||||
static inline void mcryptd_check_internal(struct rtattr **tb, u32 *type,
|
||||
static inline bool mcryptd_check_internal(struct rtattr **tb, u32 *type,
|
||||
u32 *mask)
|
||||
{
|
||||
struct crypto_attr_type *algt;
|
||||
|
||||
algt = crypto_get_attr_type(tb);
|
||||
if (IS_ERR(algt))
|
||||
return;
|
||||
if ((algt->type & CRYPTO_ALG_INTERNAL))
|
||||
*type |= CRYPTO_ALG_INTERNAL;
|
||||
if ((algt->mask & CRYPTO_ALG_INTERNAL))
|
||||
*mask |= CRYPTO_ALG_INTERNAL;
|
||||
return false;
|
||||
|
||||
*type |= algt->type & CRYPTO_ALG_INTERNAL;
|
||||
*mask |= algt->mask & CRYPTO_ALG_INTERNAL;
|
||||
|
||||
if (*type & *mask & CRYPTO_ALG_INTERNAL)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
static int mcryptd_hash_init_tfm(struct crypto_tfm *tfm)
|
||||
@ -492,7 +496,8 @@ static int mcryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
||||
u32 mask = 0;
|
||||
int err;
|
||||
|
||||
mcryptd_check_internal(tb, &type, &mask);
|
||||
if (!mcryptd_check_internal(tb, &type, &mask))
|
||||
return -EINVAL;
|
||||
|
||||
halg = ahash_attr_alg(tb[1], type, mask);
|
||||
if (IS_ERR(halg))
|
||||
|
@ -94,7 +94,7 @@ static struct acpi_device *to_acpi_dev(struct acpi_nfit_desc *acpi_desc)
|
||||
return to_acpi_device(acpi_desc->dev);
|
||||
}
|
||||
|
||||
static int xlat_status(void *buf, unsigned int cmd, u32 status)
|
||||
static int xlat_bus_status(void *buf, unsigned int cmd, u32 status)
|
||||
{
|
||||
struct nd_cmd_clear_error *clear_err;
|
||||
struct nd_cmd_ars_status *ars_status;
|
||||
@ -113,7 +113,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
|
||||
flags = ND_ARS_PERSISTENT | ND_ARS_VOLATILE;
|
||||
if ((status >> 16 & flags) == 0)
|
||||
return -ENOTTY;
|
||||
break;
|
||||
return 0;
|
||||
case ND_CMD_ARS_START:
|
||||
/* ARS is in progress */
|
||||
if ((status & 0xffff) == NFIT_ARS_START_BUSY)
|
||||
@ -122,7 +122,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
|
||||
/* Command failed */
|
||||
if (status & 0xffff)
|
||||
return -EIO;
|
||||
break;
|
||||
return 0;
|
||||
case ND_CMD_ARS_STATUS:
|
||||
ars_status = buf;
|
||||
/* Command failed */
|
||||
@ -146,7 +146,8 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
|
||||
* then just continue with the returned results.
|
||||
*/
|
||||
if (status == NFIT_ARS_STATUS_INTR) {
|
||||
if (ars_status->flags & NFIT_ARS_F_OVERFLOW)
|
||||
if (ars_status->out_length >= 40 && (ars_status->flags
|
||||
& NFIT_ARS_F_OVERFLOW))
|
||||
return -ENOSPC;
|
||||
return 0;
|
||||
}
|
||||
@ -154,7 +155,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
|
||||
/* Unknown status */
|
||||
if (status >> 16)
|
||||
return -EIO;
|
||||
break;
|
||||
return 0;
|
||||
case ND_CMD_CLEAR_ERROR:
|
||||
clear_err = buf;
|
||||
if (status & 0xffff)
|
||||
@ -163,7 +164,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
|
||||
return -EIO;
|
||||
if (clear_err->length > clear_err->cleared)
|
||||
return clear_err->cleared;
|
||||
break;
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -174,9 +175,18 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||
struct nvdimm *nvdimm, unsigned int cmd, void *buf,
|
||||
unsigned int buf_len, int *cmd_rc)
|
||||
static int xlat_status(struct nvdimm *nvdimm, void *buf, unsigned int cmd,
|
||||
u32 status)
|
||||
{
|
||||
if (!nvdimm)
|
||||
return xlat_bus_status(buf, cmd, status);
|
||||
if (status)
|
||||
return -EIO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
|
||||
unsigned int cmd, void *buf, unsigned int buf_len, int *cmd_rc)
|
||||
{
|
||||
struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc);
|
||||
union acpi_object in_obj, in_buf, *out_obj;
|
||||
@ -298,7 +308,8 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||
|
||||
for (i = 0, offset = 0; i < desc->out_num; i++) {
|
||||
u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, buf,
|
||||
(u32 *) out_obj->buffer.pointer);
|
||||
(u32 *) out_obj->buffer.pointer,
|
||||
out_obj->buffer.length - offset);
|
||||
|
||||
if (offset + out_size > out_obj->buffer.length) {
|
||||
dev_dbg(dev, "%s:%s output object underflow cmd: %s field: %d\n",
|
||||
@ -333,7 +344,8 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||
*/
|
||||
rc = buf_len - offset - in_buf.buffer.length;
|
||||
if (cmd_rc)
|
||||
*cmd_rc = xlat_status(buf, cmd, fw_status);
|
||||
*cmd_rc = xlat_status(nvdimm, buf, cmd,
|
||||
fw_status);
|
||||
} else {
|
||||
dev_err(dev, "%s:%s underrun cmd: %s buf_len: %d out_len: %d\n",
|
||||
__func__, dimm_name, cmd_name, buf_len,
|
||||
@ -343,7 +355,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||
} else {
|
||||
rc = 0;
|
||||
if (cmd_rc)
|
||||
*cmd_rc = xlat_status(buf, cmd, fw_status);
|
||||
*cmd_rc = xlat_status(nvdimm, buf, cmd, fw_status);
|
||||
}
|
||||
|
||||
out:
|
||||
@ -351,6 +363,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_nfit_ctl);
|
||||
|
||||
static const char *spa_type_name(u16 type)
|
||||
{
|
||||
@ -2001,19 +2014,32 @@ static int ars_get_status(struct acpi_nfit_desc *acpi_desc)
|
||||
return cmd_rc;
|
||||
}
|
||||
|
||||
static int ars_status_process_records(struct nvdimm_bus *nvdimm_bus,
|
||||
static int ars_status_process_records(struct acpi_nfit_desc *acpi_desc,
|
||||
struct nd_cmd_ars_status *ars_status)
|
||||
{
|
||||
struct nvdimm_bus *nvdimm_bus = acpi_desc->nvdimm_bus;
|
||||
int rc;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
* First record starts at 44 byte offset from the start of the
|
||||
* payload.
|
||||
*/
|
||||
if (ars_status->out_length < 44)
|
||||
return 0;
|
||||
for (i = 0; i < ars_status->num_records; i++) {
|
||||
/* only process full records */
|
||||
if (ars_status->out_length
|
||||
< 44 + sizeof(struct nd_ars_record) * (i + 1))
|
||||
break;
|
||||
rc = nvdimm_bus_add_poison(nvdimm_bus,
|
||||
ars_status->records[i].err_address,
|
||||
ars_status->records[i].length);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
if (i < ars_status->num_records)
|
||||
dev_warn(acpi_desc->dev, "detected truncated ars results\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2266,8 +2292,7 @@ static int acpi_nfit_query_poison(struct acpi_nfit_desc *acpi_desc,
|
||||
if (rc < 0 && rc != -ENOSPC)
|
||||
return rc;
|
||||
|
||||
if (ars_status_process_records(acpi_desc->nvdimm_bus,
|
||||
acpi_desc->ars_status))
|
||||
if (ars_status_process_records(acpi_desc, acpi_desc->ars_status))
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
|
@ -240,5 +240,7 @@ const u8 *to_nfit_uuid(enum nfit_uuids id);
|
||||
int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *nfit, acpi_size sz);
|
||||
void __acpi_nfit_notify(struct device *dev, acpi_handle handle, u32 event);
|
||||
void __acpi_nvdimm_notify(struct device *dev, u32 event);
|
||||
int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
|
||||
unsigned int cmd, void *buf, unsigned int buf_len, int *cmd_rc);
|
||||
void acpi_nfit_desc_init(struct acpi_nfit_desc *acpi_desc, struct device *dev);
|
||||
#endif /* __NFIT_H__ */
|
||||
|
@ -1159,6 +1159,7 @@ static void ata_scsi_sdev_config(struct scsi_device *sdev)
|
||||
{
|
||||
sdev->use_10_for_rw = 1;
|
||||
sdev->use_10_for_ms = 1;
|
||||
sdev->no_write_same = 1;
|
||||
|
||||
/* Schedule policy is determined by ->qc_defer() callback and
|
||||
* it needs to see every deferred qc. Set dev_blocked to 1 to
|
||||
|
@ -4090,7 +4090,20 @@ static int mv_platform_probe(struct platform_device *pdev)
|
||||
|
||||
/* allocate host */
|
||||
if (pdev->dev.of_node) {
|
||||
of_property_read_u32(pdev->dev.of_node, "nr-ports", &n_ports);
|
||||
rc = of_property_read_u32(pdev->dev.of_node, "nr-ports",
|
||||
&n_ports);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev,
|
||||
"error parsing nr-ports property: %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (n_ports <= 0) {
|
||||
dev_err(&pdev->dev, "nr-ports must be positive: %d\n",
|
||||
n_ports);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
|
||||
} else {
|
||||
mv_platform_data = dev_get_platdata(&pdev->dev);
|
||||
|
@ -1413,8 +1413,14 @@ static ssize_t hot_remove_store(struct class *class,
|
||||
return ret ? ret : count;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: hot_add attribute is not the usual read-only sysfs attribute. In a
|
||||
* sense that reading from this file does alter the state of your system -- it
|
||||
* creates a new un-initialized zram device and returns back this device's
|
||||
* device_id (or an error code if it fails to create a new device).
|
||||
*/
|
||||
static struct class_attribute zram_control_class_attrs[] = {
|
||||
__ATTR_RO(hot_add),
|
||||
__ATTR(hot_add, 0400, hot_add_show, NULL),
|
||||
__ATTR_WO(hot_remove),
|
||||
__ATTR_NULL,
|
||||
};
|
||||
|
@ -558,8 +558,9 @@ static int caam_probe(struct platform_device *pdev)
|
||||
* Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel,
|
||||
* long pointers in master configuration register
|
||||
*/
|
||||
clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK, MCFGR_AWCACHE_CACH |
|
||||
MCFGR_AWCACHE_BUFF | MCFGR_WDENABLE | MCFGR_LARGE_BURST |
|
||||
clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK | MCFGR_LONG_PTR,
|
||||
MCFGR_AWCACHE_CACH | MCFGR_AWCACHE_BUFF |
|
||||
MCFGR_WDENABLE | MCFGR_LARGE_BURST |
|
||||
(sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0));
|
||||
|
||||
/*
|
||||
|
@ -168,12 +168,11 @@ static void mv_cesa_ahash_std_step(struct ahash_request *req)
|
||||
mv_cesa_adjust_op(engine, &creq->op_tmpl);
|
||||
memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
|
||||
|
||||
digsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(req));
|
||||
for (i = 0; i < digsize / 4; i++)
|
||||
writel_relaxed(creq->state[i], engine->regs + CESA_IVDIG(i));
|
||||
|
||||
mv_cesa_adjust_op(engine, &creq->op_tmpl);
|
||||
memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
|
||||
if (!sreq->offset) {
|
||||
digsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(req));
|
||||
for (i = 0; i < digsize / 4; i++)
|
||||
writel_relaxed(creq->state[i], engine->regs + CESA_IVDIG(i));
|
||||
}
|
||||
|
||||
if (creq->cache_ptr)
|
||||
memcpy_toio(engine->sram + CESA_SA_DATA_SRAM_OFFSET,
|
||||
|
@ -271,7 +271,7 @@ static int check_vma(struct dax_dev *dax_dev, struct vm_area_struct *vma,
|
||||
return -ENXIO;
|
||||
|
||||
/* prevent private mappings from being established */
|
||||
if ((vma->vm_flags & VM_SHARED) != VM_SHARED) {
|
||||
if ((vma->vm_flags & VM_MAYSHARE) != VM_MAYSHARE) {
|
||||
dev_info(dev, "%s: %s: fail, attempted private mapping\n",
|
||||
current->comm, func);
|
||||
return -EINVAL;
|
||||
|
@ -2472,6 +2472,7 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
|
||||
struct drm_file *file_priv);
|
||||
void amdgpu_driver_preclose_kms(struct drm_device *dev,
|
||||
struct drm_file *file_priv);
|
||||
int amdgpu_suspend(struct amdgpu_device *adev);
|
||||
int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon);
|
||||
int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon);
|
||||
u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
|
||||
|
@ -1493,7 +1493,7 @@ static int amdgpu_fini(struct amdgpu_device *adev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_suspend(struct amdgpu_device *adev)
|
||||
int amdgpu_suspend(struct amdgpu_device *adev)
|
||||
{
|
||||
int i, r;
|
||||
|
||||
|
@ -479,12 +479,15 @@ amdgpu_pci_remove(struct pci_dev *pdev)
|
||||
static void
|
||||
amdgpu_pci_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
|
||||
/* if we are running in a VM, make sure the device
|
||||
* torn down properly on reboot/shutdown.
|
||||
* unfortunately we can't detect certain
|
||||
* hypervisors so just do this all the time.
|
||||
*/
|
||||
amdgpu_pci_remove(pdev);
|
||||
amdgpu_suspend(adev);
|
||||
}
|
||||
|
||||
static int amdgpu_pmops_suspend(struct device *dev)
|
||||
|
@ -755,8 +755,10 @@ static int __init ser_gigaset_init(void)
|
||||
driver = gigaset_initdriver(GIGASET_MINOR, GIGASET_MINORS,
|
||||
GIGASET_MODULENAME, GIGASET_DEVNAME,
|
||||
&ops, THIS_MODULE);
|
||||
if (!driver)
|
||||
if (!driver) {
|
||||
rc = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
rc = tty_register_ldisc(N_GIGASET_M101, &gigaset_ldisc);
|
||||
if (rc != 0) {
|
||||
|
@ -870,23 +870,25 @@ lbl_free_candev:
|
||||
static void peak_usb_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct peak_usb_device *dev;
|
||||
struct peak_usb_device *dev_prev_siblings;
|
||||
|
||||
/* unregister as many netdev devices as siblings */
|
||||
for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
|
||||
for (dev = usb_get_intfdata(intf); dev; dev = dev_prev_siblings) {
|
||||
struct net_device *netdev = dev->netdev;
|
||||
char name[IFNAMSIZ];
|
||||
|
||||
dev_prev_siblings = dev->prev_siblings;
|
||||
dev->state &= ~PCAN_USB_STATE_CONNECTED;
|
||||
strncpy(name, netdev->name, IFNAMSIZ);
|
||||
|
||||
unregister_netdev(netdev);
|
||||
free_candev(netdev);
|
||||
|
||||
kfree(dev->cmd_buf);
|
||||
dev->next_siblings = NULL;
|
||||
if (dev->adapter->dev_free)
|
||||
dev->adapter->dev_free(dev);
|
||||
|
||||
free_candev(netdev);
|
||||
dev_info(&intf->dev, "%s removed\n", name);
|
||||
}
|
||||
|
||||
|
@ -4921,6 +4921,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
*/
|
||||
for_each_port(adapter, i) {
|
||||
pi = adap2pinfo(adapter, i);
|
||||
adapter->port[i]->dev_port = pi->lport;
|
||||
netif_set_real_num_tx_queues(adapter->port[i], pi->nqsets);
|
||||
netif_set_real_num_rx_queues(adapter->port[i], pi->nqsets);
|
||||
|
||||
|
@ -7851,7 +7851,6 @@ int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
|
||||
return ret;
|
||||
|
||||
memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN);
|
||||
adap->port[i]->dev_port = j;
|
||||
j++;
|
||||
}
|
||||
return 0;
|
||||
|
@ -2960,6 +2960,7 @@ static int cxgb4vf_pci_probe(struct pci_dev *pdev,
|
||||
|
||||
netdev->netdev_ops = &cxgb4vf_netdev_ops;
|
||||
netdev->ethtool_ops = &cxgb4vf_ethtool_ops;
|
||||
netdev->dev_port = pi->port_id;
|
||||
|
||||
/*
|
||||
* Initialize the hardware/software state for the port.
|
||||
|
@ -58,7 +58,7 @@ static struct kobj_type ktype_veth_pool;
|
||||
|
||||
static const char ibmveth_driver_name[] = "ibmveth";
|
||||
static const char ibmveth_driver_string[] = "IBM Power Virtual Ethernet Driver";
|
||||
#define ibmveth_driver_version "1.05"
|
||||
#define ibmveth_driver_version "1.06"
|
||||
|
||||
MODULE_AUTHOR("Santiago Leon <santil@linux.vnet.ibm.com>");
|
||||
MODULE_DESCRIPTION("IBM Power Virtual Ethernet Driver");
|
||||
@ -137,6 +137,11 @@ static inline int ibmveth_rxq_frame_offset(struct ibmveth_adapter *adapter)
|
||||
return ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_OFF_MASK;
|
||||
}
|
||||
|
||||
static inline int ibmveth_rxq_large_packet(struct ibmveth_adapter *adapter)
|
||||
{
|
||||
return ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_LRG_PKT;
|
||||
}
|
||||
|
||||
static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter)
|
||||
{
|
||||
return be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].length);
|
||||
@ -1174,6 +1179,45 @@ map_failed:
|
||||
goto retry_bounce;
|
||||
}
|
||||
|
||||
static void ibmveth_rx_mss_helper(struct sk_buff *skb, u16 mss, int lrg_pkt)
|
||||
{
|
||||
int offset = 0;
|
||||
|
||||
/* only TCP packets will be aggregated */
|
||||
if (skb->protocol == htons(ETH_P_IP)) {
|
||||
struct iphdr *iph = (struct iphdr *)skb->data;
|
||||
|
||||
if (iph->protocol == IPPROTO_TCP) {
|
||||
offset = iph->ihl * 4;
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
} else if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
struct ipv6hdr *iph6 = (struct ipv6hdr *)skb->data;
|
||||
|
||||
if (iph6->nexthdr == IPPROTO_TCP) {
|
||||
offset = sizeof(struct ipv6hdr);
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
/* if mss is not set through Large Packet bit/mss in rx buffer,
|
||||
* expect that the mss will be written to the tcp header checksum.
|
||||
*/
|
||||
if (lrg_pkt) {
|
||||
skb_shinfo(skb)->gso_size = mss;
|
||||
} else if (offset) {
|
||||
struct tcphdr *tcph = (struct tcphdr *)(skb->data + offset);
|
||||
|
||||
skb_shinfo(skb)->gso_size = ntohs(tcph->check);
|
||||
tcph->check = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int ibmveth_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct ibmveth_adapter *adapter =
|
||||
@ -1182,6 +1226,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
|
||||
int frames_processed = 0;
|
||||
unsigned long lpar_rc;
|
||||
struct iphdr *iph;
|
||||
u16 mss = 0;
|
||||
|
||||
restart_poll:
|
||||
while (frames_processed < budget) {
|
||||
@ -1199,9 +1244,21 @@ restart_poll:
|
||||
int length = ibmveth_rxq_frame_length(adapter);
|
||||
int offset = ibmveth_rxq_frame_offset(adapter);
|
||||
int csum_good = ibmveth_rxq_csum_good(adapter);
|
||||
int lrg_pkt = ibmveth_rxq_large_packet(adapter);
|
||||
|
||||
skb = ibmveth_rxq_get_buffer(adapter);
|
||||
|
||||
/* if the large packet bit is set in the rx queue
|
||||
* descriptor, the mss will be written by PHYP eight
|
||||
* bytes from the start of the rx buffer, which is
|
||||
* skb->data at this stage
|
||||
*/
|
||||
if (lrg_pkt) {
|
||||
__be64 *rxmss = (__be64 *)(skb->data + 8);
|
||||
|
||||
mss = (u16)be64_to_cpu(*rxmss);
|
||||
}
|
||||
|
||||
new_skb = NULL;
|
||||
if (length < rx_copybreak)
|
||||
new_skb = netdev_alloc_skb(netdev, length);
|
||||
@ -1235,11 +1292,15 @@ restart_poll:
|
||||
if (iph->check == 0xffff) {
|
||||
iph->check = 0;
|
||||
iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
|
||||
adapter->rx_large_packets++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (length > netdev->mtu + ETH_HLEN) {
|
||||
ibmveth_rx_mss_helper(skb, mss, lrg_pkt);
|
||||
adapter->rx_large_packets++;
|
||||
}
|
||||
|
||||
napi_gro_receive(napi, skb); /* send it up */
|
||||
|
||||
netdev->stats.rx_packets++;
|
||||
|
@ -209,6 +209,7 @@ struct ibmveth_rx_q_entry {
|
||||
#define IBMVETH_RXQ_TOGGLE 0x80000000
|
||||
#define IBMVETH_RXQ_TOGGLE_SHIFT 31
|
||||
#define IBMVETH_RXQ_VALID 0x40000000
|
||||
#define IBMVETH_RXQ_LRG_PKT 0x04000000
|
||||
#define IBMVETH_RXQ_NO_CSUM 0x02000000
|
||||
#define IBMVETH_RXQ_CSUM_GOOD 0x01000000
|
||||
#define IBMVETH_RXQ_OFF_MASK 0x0000FFFF
|
||||
|
@ -696,6 +696,7 @@ ltq_etop_probe(struct platform_device *pdev)
|
||||
priv->pldata = dev_get_platdata(&pdev->dev);
|
||||
priv->netdev = dev;
|
||||
spin_lock_init(&priv->lock);
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
|
||||
for (i = 0; i < MAX_DMA_CHAN; i++) {
|
||||
if (IS_TX(i))
|
||||
|
@ -18,8 +18,6 @@ config MLX5_CORE_EN
|
||||
default n
|
||||
---help---
|
||||
Ethernet support in Mellanox Technologies ConnectX-4 NIC.
|
||||
Ethernet and Infiniband support in ConnectX-4 are currently mutually
|
||||
exclusive.
|
||||
|
||||
config MLX5_CORE_EN_DCB
|
||||
bool "Data Center Bridging (DCB) Support"
|
||||
|
@ -438,9 +438,16 @@ static int smsc911x_request_resources(struct platform_device *pdev)
|
||||
ret = regulator_bulk_get(&pdev->dev,
|
||||
ARRAY_SIZE(pdata->supplies),
|
||||
pdata->supplies);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
/*
|
||||
* Retry on deferrals, else just report the error
|
||||
* and try to continue.
|
||||
*/
|
||||
if (ret == -EPROBE_DEFER)
|
||||
return ret;
|
||||
netdev_err(ndev, "couldn't get regulators %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
/* Request optional RESET GPIO */
|
||||
pdata->reset_gpiod = devm_gpiod_get_optional(&pdev->dev,
|
||||
|
@ -1112,6 +1112,7 @@ static int cpmac_probe(struct platform_device *pdev)
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
platform_set_drvdata(pdev, dev);
|
||||
priv = netdev_priv(dev);
|
||||
|
||||
|
@ -81,6 +81,7 @@ static void cpsw_gmii_sel_am3352(struct cpsw_phy_sel_priv *priv,
|
||||
};
|
||||
|
||||
mask = GMII_SEL_MODE_MASK << (slave * 2) | BIT(slave + 6);
|
||||
mask |= BIT(slave + 4);
|
||||
mode <<= slave * 2;
|
||||
|
||||
if (priv->rmii_clock_external) {
|
||||
|
@ -47,6 +47,10 @@
|
||||
NETIF_F_TSO | \
|
||||
NETIF_F_TSO6 | \
|
||||
NETIF_F_HW_CSUM)
|
||||
|
||||
/* Restrict GSO size to account for NVGRE */
|
||||
#define NETVSC_GSO_MAX_SIZE 62768
|
||||
|
||||
static int ring_size = 128;
|
||||
module_param(ring_size, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)");
|
||||
@ -1393,6 +1397,7 @@ static int netvsc_probe(struct hv_device *dev,
|
||||
nvdev = net_device_ctx->nvdev;
|
||||
netif_set_real_num_tx_queues(net, nvdev->num_chn);
|
||||
netif_set_real_num_rx_queues(net, nvdev->num_chn);
|
||||
netif_set_gso_max_size(net, NETVSC_GSO_MAX_SIZE);
|
||||
|
||||
/* MTU range: 68 - 1500 or 65521 */
|
||||
net->min_mtu = NETVSC_MTU_MIN;
|
||||
|
@ -546,13 +546,15 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
|
||||
}
|
||||
err = ipvlan_set_port_mode(port, mode);
|
||||
if (err) {
|
||||
goto unregister_netdev;
|
||||
goto unlink_netdev;
|
||||
}
|
||||
|
||||
list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans);
|
||||
netif_stacked_transfer_operstate(phy_dev, dev);
|
||||
return 0;
|
||||
|
||||
unlink_netdev:
|
||||
netdev_upper_dev_unlink(phy_dev, dev);
|
||||
unregister_netdev:
|
||||
unregister_netdevice(dev);
|
||||
destroy_ipvlan_port:
|
||||
|
@ -905,11 +905,17 @@ EXPORT_SYMBOL(phy_attached_print);
|
||||
int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
|
||||
u32 flags, phy_interface_t interface)
|
||||
{
|
||||
struct module *ndev_owner = dev->dev.parent->driver->owner;
|
||||
struct mii_bus *bus = phydev->mdio.bus;
|
||||
struct device *d = &phydev->mdio.dev;
|
||||
int err;
|
||||
|
||||
if (!try_module_get(bus->owner)) {
|
||||
/* For Ethernet device drivers that register their own MDIO bus, we
|
||||
* will have bus->owner match ndev_mod, so we do not want to increment
|
||||
* our own module->refcnt here, otherwise we would not be able to
|
||||
* unload later on.
|
||||
*/
|
||||
if (ndev_owner != bus->owner && !try_module_get(bus->owner)) {
|
||||
dev_err(&dev->dev, "failed to get the bus module\n");
|
||||
return -EIO;
|
||||
}
|
||||
@ -971,7 +977,8 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
|
||||
error:
|
||||
phy_detach(phydev);
|
||||
put_device(d);
|
||||
module_put(bus->owner);
|
||||
if (ndev_owner != bus->owner)
|
||||
module_put(bus->owner);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(phy_attach_direct);
|
||||
@ -1021,6 +1028,8 @@ EXPORT_SYMBOL(phy_attach);
|
||||
*/
|
||||
void phy_detach(struct phy_device *phydev)
|
||||
{
|
||||
struct net_device *dev = phydev->attached_dev;
|
||||
struct module *ndev_owner = dev->dev.parent->driver->owner;
|
||||
struct mii_bus *bus;
|
||||
int i;
|
||||
|
||||
@ -1050,7 +1059,8 @@ void phy_detach(struct phy_device *phydev)
|
||||
bus = phydev->mdio.bus;
|
||||
|
||||
put_device(&phydev->mdio.dev);
|
||||
module_put(bus->owner);
|
||||
if (ndev_owner != bus->owner)
|
||||
module_put(bus->owner);
|
||||
}
|
||||
EXPORT_SYMBOL(phy_detach);
|
||||
|
||||
|
@ -602,6 +602,21 @@ static const struct driver_info cdc_mbim_info_ndp_to_end = {
|
||||
.data = CDC_NCM_FLAG_NDP_TO_END,
|
||||
};
|
||||
|
||||
/* Some modems (e.g. Telit LE922A6) do not work properly with altsetting
|
||||
* toggle done in cdc_ncm_bind_common. CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE
|
||||
* flag is used to avoid this procedure.
|
||||
*/
|
||||
static const struct driver_info cdc_mbim_info_avoid_altsetting_toggle = {
|
||||
.description = "CDC MBIM",
|
||||
.flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN,
|
||||
.bind = cdc_mbim_bind,
|
||||
.unbind = cdc_mbim_unbind,
|
||||
.manage_power = cdc_mbim_manage_power,
|
||||
.rx_fixup = cdc_mbim_rx_fixup,
|
||||
.tx_fixup = cdc_mbim_tx_fixup,
|
||||
.data = CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE,
|
||||
};
|
||||
|
||||
static const struct usb_device_id mbim_devs[] = {
|
||||
/* This duplicate NCM entry is intentional. MBIM devices can
|
||||
* be disguised as NCM by default, and this is necessary to
|
||||
@ -626,6 +641,12 @@ static const struct usb_device_id mbim_devs[] = {
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(0x12d1, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info_ndp_to_end,
|
||||
},
|
||||
|
||||
/* Telit LE922A6 in MBIM composition */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1041, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
|
||||
},
|
||||
|
||||
/* default entry */
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info_zlp,
|
||||
|
@ -835,11 +835,18 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
|
||||
|
||||
iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
||||
/* Device-specific flags */
|
||||
ctx->drvflags = drvflags;
|
||||
|
||||
/* Reset data interface. Some devices will not reset properly
|
||||
* unless they are configured first. Toggle the altsetting to
|
||||
* force a reset
|
||||
* force a reset.
|
||||
* Some other devices do not work properly with this procedure
|
||||
* that can be avoided using quirk CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE
|
||||
*/
|
||||
usb_set_interface(dev->udev, iface_no, data_altsetting);
|
||||
if (!(ctx->drvflags & CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE))
|
||||
usb_set_interface(dev->udev, iface_no, data_altsetting);
|
||||
|
||||
temp = usb_set_interface(dev->udev, iface_no, 0);
|
||||
if (temp) {
|
||||
dev_dbg(&intf->dev, "set interface failed\n");
|
||||
@ -886,9 +893,6 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
|
||||
/* finish setting up the device specific data */
|
||||
cdc_ncm_setup(dev);
|
||||
|
||||
/* Device-specific flags */
|
||||
ctx->drvflags = drvflags;
|
||||
|
||||
/* Allocate the delayed NDP if needed. */
|
||||
if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
|
||||
ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL);
|
||||
|
@ -715,7 +715,7 @@ EXPORT_SYMBOL_GPL(nd_cmd_in_size);
|
||||
|
||||
u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
|
||||
const struct nd_cmd_desc *desc, int idx, const u32 *in_field,
|
||||
const u32 *out_field)
|
||||
const u32 *out_field, unsigned long remainder)
|
||||
{
|
||||
if (idx >= desc->out_num)
|
||||
return UINT_MAX;
|
||||
@ -727,9 +727,24 @@ u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
|
||||
return in_field[1];
|
||||
else if (nvdimm && cmd == ND_CMD_VENDOR && idx == 2)
|
||||
return out_field[1];
|
||||
else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2)
|
||||
return out_field[1] - 8;
|
||||
else if (cmd == ND_CMD_CALL) {
|
||||
else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2) {
|
||||
/*
|
||||
* Per table 9-276 ARS Data in ACPI 6.1, out_field[1] is
|
||||
* "Size of Output Buffer in bytes, including this
|
||||
* field."
|
||||
*/
|
||||
if (out_field[1] < 4)
|
||||
return 0;
|
||||
/*
|
||||
* ACPI 6.1 is ambiguous if 'status' is included in the
|
||||
* output size. If we encounter an output size that
|
||||
* overshoots the remainder by 4 bytes, assume it was
|
||||
* including 'status'.
|
||||
*/
|
||||
if (out_field[1] - 8 == remainder)
|
||||
return remainder;
|
||||
return out_field[1] - 4;
|
||||
} else if (cmd == ND_CMD_CALL) {
|
||||
struct nd_cmd_pkg *pkg = (struct nd_cmd_pkg *) in_field;
|
||||
|
||||
return pkg->nd_size_out;
|
||||
@ -876,7 +891,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
|
||||
/* process an output envelope */
|
||||
for (i = 0; i < desc->out_num; i++) {
|
||||
u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i,
|
||||
(u32 *) in_env, (u32 *) out_env);
|
||||
(u32 *) in_env, (u32 *) out_env, 0);
|
||||
u32 copy;
|
||||
|
||||
if (out_size == UINT_MAX) {
|
||||
|
@ -1323,18 +1323,20 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
{
|
||||
lockdep_assert_held(&phba->hbalock);
|
||||
|
||||
BUG_ON(!piocb || !piocb->vport);
|
||||
BUG_ON(!piocb);
|
||||
|
||||
list_add_tail(&piocb->list, &pring->txcmplq);
|
||||
piocb->iocb_flag |= LPFC_IO_ON_TXCMPLQ;
|
||||
|
||||
if ((unlikely(pring->ringno == LPFC_ELS_RING)) &&
|
||||
(piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
|
||||
(piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN) &&
|
||||
(!(piocb->vport->load_flag & FC_UNLOADING)))
|
||||
mod_timer(&piocb->vport->els_tmofunc,
|
||||
jiffies +
|
||||
msecs_to_jiffies(1000 * (phba->fc_ratov << 1)));
|
||||
(piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN)) {
|
||||
BUG_ON(!piocb->vport);
|
||||
if (!(piocb->vport->load_flag & FC_UNLOADING))
|
||||
mod_timer(&piocb->vport->els_tmofunc,
|
||||
jiffies +
|
||||
msecs_to_jiffies(1000 * (phba->fc_ratov << 1)));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -503,7 +503,7 @@ static void vhost_vsock_reset_orphans(struct sock *sk)
|
||||
* executing.
|
||||
*/
|
||||
|
||||
if (!vhost_vsock_get(vsk->local_addr.svm_cid)) {
|
||||
if (!vhost_vsock_get(vsk->remote_addr.svm_cid)) {
|
||||
sock_set_flag(sk, SOCK_DONE);
|
||||
vsk->peer_shutdown = SHUTDOWN_MASK;
|
||||
sk->sk_state = SS_UNCONNECTED;
|
||||
|
@ -1261,26 +1261,30 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
return -ECHILD;
|
||||
|
||||
op = ceph_snap(dir) == CEPH_SNAPDIR ?
|
||||
CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP;
|
||||
CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_GETATTR;
|
||||
req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS);
|
||||
if (!IS_ERR(req)) {
|
||||
req->r_dentry = dget(dentry);
|
||||
req->r_num_caps = 2;
|
||||
req->r_num_caps = op == CEPH_MDS_OP_GETATTR ? 1 : 2;
|
||||
|
||||
mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED;
|
||||
if (ceph_security_xattr_wanted(dir))
|
||||
mask |= CEPH_CAP_XATTR_SHARED;
|
||||
req->r_args.getattr.mask = mask;
|
||||
|
||||
req->r_locked_dir = dir;
|
||||
err = ceph_mdsc_do_request(mdsc, NULL, req);
|
||||
if (err == 0 || err == -ENOENT) {
|
||||
if (dentry == req->r_dentry) {
|
||||
valid = !d_unhashed(dentry);
|
||||
} else {
|
||||
d_invalidate(req->r_dentry);
|
||||
err = -EAGAIN;
|
||||
}
|
||||
switch (err) {
|
||||
case 0:
|
||||
if (d_really_is_positive(dentry) &&
|
||||
d_inode(dentry) == req->r_target_inode)
|
||||
valid = 1;
|
||||
break;
|
||||
case -ENOENT:
|
||||
if (d_really_is_negative(dentry))
|
||||
valid = 1;
|
||||
/* Fallthrough */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ceph_mdsc_put_request(req);
|
||||
dout("d_revalidate %p lookup result=%d\n",
|
||||
|
@ -1739,8 +1739,6 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
|
||||
* This should be done on write(), truncate() and chown().
|
||||
*/
|
||||
if (!fc->handle_killpriv) {
|
||||
int kill;
|
||||
|
||||
/*
|
||||
* ia_mode calculation may have used stale i_mode.
|
||||
* Refresh and recalculate.
|
||||
@ -1750,12 +1748,11 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
|
||||
return ret;
|
||||
|
||||
attr->ia_mode = inode->i_mode;
|
||||
kill = should_remove_suid(entry);
|
||||
if (kill & ATTR_KILL_SUID) {
|
||||
if (inode->i_mode & S_ISUID) {
|
||||
attr->ia_valid |= ATTR_MODE;
|
||||
attr->ia_mode &= ~S_ISUID;
|
||||
}
|
||||
if (kill & ATTR_KILL_SGID) {
|
||||
if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
|
||||
attr->ia_valid |= ATTR_MODE;
|
||||
attr->ia_mode &= ~S_ISGID;
|
||||
}
|
||||
|
@ -54,7 +54,6 @@ KSYM(__kstrtab_\name):
|
||||
KSYM(__kcrctab_\name):
|
||||
__put KSYM(__crc_\name)
|
||||
.weak KSYM(__crc_\name)
|
||||
.set KSYM(__crc_\name), 0
|
||||
.previous
|
||||
#endif
|
||||
#endif
|
||||
|
@ -143,7 +143,7 @@ u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
|
||||
const struct nd_cmd_desc *desc, int idx, void *buf);
|
||||
u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
|
||||
const struct nd_cmd_desc *desc, int idx, const u32 *in_field,
|
||||
const u32 *out_field);
|
||||
const u32 *out_field, unsigned long remainder);
|
||||
int nvdimm_bus_check_dimm_count(struct nvdimm_bus *nvdimm_bus, int dimm_count);
|
||||
struct nd_region *nvdimm_pmem_region_create(struct nvdimm_bus *nvdimm_bus,
|
||||
struct nd_region_desc *ndr_desc);
|
||||
|
@ -81,7 +81,8 @@
|
||||
#define CDC_NCM_TIMER_INTERVAL_MAX (U32_MAX / NSEC_PER_USEC)
|
||||
|
||||
/* Driver flags */
|
||||
#define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */
|
||||
#define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */
|
||||
#define CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE 0x04 /* Avoid altsetting toggle during init */
|
||||
|
||||
#define cdc_ncm_comm_intf_is_mbim(x) ((x)->desc.bInterfaceSubClass == USB_CDC_SUBCLASS_MBIM && \
|
||||
(x)->desc.bInterfaceProtocol == USB_CDC_PROTO_NONE)
|
||||
|
@ -196,5 +196,6 @@ struct can_filter {
|
||||
};
|
||||
|
||||
#define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */
|
||||
#define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */
|
||||
|
||||
#endif /* !_UAPI_CAN_H */
|
||||
|
@ -903,17 +903,14 @@ list_update_cgroup_event(struct perf_event *event,
|
||||
*/
|
||||
cpuctx = __get_cpu_context(ctx);
|
||||
|
||||
/* Only set/clear cpuctx->cgrp if current task uses event->cgrp. */
|
||||
if (perf_cgroup_from_task(current, ctx) != event->cgrp) {
|
||||
/*
|
||||
* We are removing the last cpu event in this context.
|
||||
* If that event is not active in this cpu, cpuctx->cgrp
|
||||
* should've been cleared by perf_cgroup_switch.
|
||||
*/
|
||||
WARN_ON_ONCE(!add && cpuctx->cgrp);
|
||||
return;
|
||||
}
|
||||
cpuctx->cgrp = add ? event->cgrp : NULL;
|
||||
/*
|
||||
* cpuctx->cgrp is NULL until a cgroup event is sched in or
|
||||
* ctx->nr_cgroup == 0 .
|
||||
*/
|
||||
if (add && perf_cgroup_from_task(current, ctx) == event->cgrp)
|
||||
cpuctx->cgrp = event->cgrp;
|
||||
else if (!add)
|
||||
cpuctx->cgrp = NULL;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_CGROUP_PERF */
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
@ -506,13 +506,13 @@ static void __print_lock_name(struct lock_class *class)
|
||||
name = class->name;
|
||||
if (!name) {
|
||||
name = __get_key_name(class->key, str);
|
||||
printk("%s", name);
|
||||
printk(KERN_CONT "%s", name);
|
||||
} else {
|
||||
printk("%s", name);
|
||||
printk(KERN_CONT "%s", name);
|
||||
if (class->name_version > 1)
|
||||
printk("#%d", class->name_version);
|
||||
printk(KERN_CONT "#%d", class->name_version);
|
||||
if (class->subclass)
|
||||
printk("/%d", class->subclass);
|
||||
printk(KERN_CONT "/%d", class->subclass);
|
||||
}
|
||||
}
|
||||
|
||||
@ -522,9 +522,9 @@ static void print_lock_name(struct lock_class *class)
|
||||
|
||||
get_usage_chars(class, usage);
|
||||
|
||||
printk(" (");
|
||||
printk(KERN_CONT " (");
|
||||
__print_lock_name(class);
|
||||
printk("){%s}", usage);
|
||||
printk(KERN_CONT "){%s}", usage);
|
||||
}
|
||||
|
||||
static void print_lockdep_cache(struct lockdep_map *lock)
|
||||
@ -536,7 +536,7 @@ static void print_lockdep_cache(struct lockdep_map *lock)
|
||||
if (!name)
|
||||
name = __get_key_name(lock->key->subkeys, str);
|
||||
|
||||
printk("%s", name);
|
||||
printk(KERN_CONT "%s", name);
|
||||
}
|
||||
|
||||
static void print_lock(struct held_lock *hlock)
|
||||
@ -551,13 +551,13 @@ static void print_lock(struct held_lock *hlock)
|
||||
barrier();
|
||||
|
||||
if (!class_idx || (class_idx - 1) >= MAX_LOCKDEP_KEYS) {
|
||||
printk("<RELEASED>\n");
|
||||
printk(KERN_CONT "<RELEASED>\n");
|
||||
return;
|
||||
}
|
||||
|
||||
print_lock_name(lock_classes + class_idx - 1);
|
||||
printk(", at: ");
|
||||
print_ip_sym(hlock->acquire_ip);
|
||||
printk(KERN_CONT ", at: [<%p>] %pS\n",
|
||||
(void *)hlock->acquire_ip, (void *)hlock->acquire_ip);
|
||||
}
|
||||
|
||||
static void lockdep_print_held_locks(struct task_struct *curr)
|
||||
@ -792,8 +792,8 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
|
||||
|
||||
printk("\nnew class %p: %s", class->key, class->name);
|
||||
if (class->name_version > 1)
|
||||
printk("#%d", class->name_version);
|
||||
printk("\n");
|
||||
printk(KERN_CONT "#%d", class->name_version);
|
||||
printk(KERN_CONT "\n");
|
||||
dump_stack();
|
||||
|
||||
if (!graph_lock()) {
|
||||
@ -1071,7 +1071,7 @@ print_circular_bug_entry(struct lock_list *target, int depth)
|
||||
return 0;
|
||||
printk("\n-> #%u", depth);
|
||||
print_lock_name(target->class);
|
||||
printk(":\n");
|
||||
printk(KERN_CONT ":\n");
|
||||
print_stack_trace(&target->trace, 6);
|
||||
|
||||
return 0;
|
||||
@ -1102,11 +1102,11 @@ print_circular_lock_scenario(struct held_lock *src,
|
||||
if (parent != source) {
|
||||
printk("Chain exists of:\n ");
|
||||
__print_lock_name(source);
|
||||
printk(" --> ");
|
||||
printk(KERN_CONT " --> ");
|
||||
__print_lock_name(parent);
|
||||
printk(" --> ");
|
||||
printk(KERN_CONT " --> ");
|
||||
__print_lock_name(target);
|
||||
printk("\n\n");
|
||||
printk(KERN_CONT "\n\n");
|
||||
}
|
||||
|
||||
printk(" Possible unsafe locking scenario:\n\n");
|
||||
@ -1114,16 +1114,16 @@ print_circular_lock_scenario(struct held_lock *src,
|
||||
printk(" ---- ----\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(target);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(parent);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(target);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(source);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk("\n *** DEADLOCK ***\n\n");
|
||||
}
|
||||
|
||||
@ -1359,22 +1359,22 @@ static void print_lock_class_header(struct lock_class *class, int depth)
|
||||
|
||||
printk("%*s->", depth, "");
|
||||
print_lock_name(class);
|
||||
printk(" ops: %lu", class->ops);
|
||||
printk(" {\n");
|
||||
printk(KERN_CONT " ops: %lu", class->ops);
|
||||
printk(KERN_CONT " {\n");
|
||||
|
||||
for (bit = 0; bit < LOCK_USAGE_STATES; bit++) {
|
||||
if (class->usage_mask & (1 << bit)) {
|
||||
int len = depth;
|
||||
|
||||
len += printk("%*s %s", depth, "", usage_str[bit]);
|
||||
len += printk(" at:\n");
|
||||
len += printk(KERN_CONT " at:\n");
|
||||
print_stack_trace(class->usage_traces + bit, len);
|
||||
}
|
||||
}
|
||||
printk("%*s }\n", depth, "");
|
||||
|
||||
printk("%*s ... key at: ",depth,"");
|
||||
print_ip_sym((unsigned long)class->key);
|
||||
printk("%*s ... key at: [<%p>] %pS\n",
|
||||
depth, "", class->key, class->key);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1437,11 +1437,11 @@ print_irq_lock_scenario(struct lock_list *safe_entry,
|
||||
if (middle_class != unsafe_class) {
|
||||
printk("Chain exists of:\n ");
|
||||
__print_lock_name(safe_class);
|
||||
printk(" --> ");
|
||||
printk(KERN_CONT " --> ");
|
||||
__print_lock_name(middle_class);
|
||||
printk(" --> ");
|
||||
printk(KERN_CONT " --> ");
|
||||
__print_lock_name(unsafe_class);
|
||||
printk("\n\n");
|
||||
printk(KERN_CONT "\n\n");
|
||||
}
|
||||
|
||||
printk(" Possible interrupt unsafe locking scenario:\n\n");
|
||||
@ -1449,18 +1449,18 @@ print_irq_lock_scenario(struct lock_list *safe_entry,
|
||||
printk(" ---- ----\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(unsafe_class);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" local_irq_disable();\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(safe_class);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(middle_class);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" <Interrupt>\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(safe_class);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk("\n *** DEADLOCK ***\n\n");
|
||||
}
|
||||
|
||||
@ -1497,9 +1497,9 @@ print_bad_irq_dependency(struct task_struct *curr,
|
||||
print_lock(prev);
|
||||
printk("which would create a new lock dependency:\n");
|
||||
print_lock_name(hlock_class(prev));
|
||||
printk(" ->");
|
||||
printk(KERN_CONT " ->");
|
||||
print_lock_name(hlock_class(next));
|
||||
printk("\n");
|
||||
printk(KERN_CONT "\n");
|
||||
|
||||
printk("\nbut this new dependency connects a %s-irq-safe lock:\n",
|
||||
irqclass);
|
||||
@ -1521,8 +1521,7 @@ print_bad_irq_dependency(struct task_struct *curr,
|
||||
|
||||
lockdep_print_held_locks(curr);
|
||||
|
||||
printk("\nthe dependencies between %s-irq-safe lock", irqclass);
|
||||
printk(" and the holding lock:\n");
|
||||
printk("\nthe dependencies between %s-irq-safe lock and the holding lock:\n", irqclass);
|
||||
if (!save_trace(&prev_root->trace))
|
||||
return 0;
|
||||
print_shortest_lock_dependencies(backwards_entry, prev_root);
|
||||
@ -1694,10 +1693,10 @@ print_deadlock_scenario(struct held_lock *nxt,
|
||||
printk(" ----\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(prev);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(next);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk("\n *** DEADLOCK ***\n\n");
|
||||
printk(" May be due to missing lock nesting notation\n\n");
|
||||
}
|
||||
@ -1891,9 +1890,9 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
|
||||
graph_unlock();
|
||||
printk("\n new dependency: ");
|
||||
print_lock_name(hlock_class(prev));
|
||||
printk(" => ");
|
||||
printk(KERN_CONT " => ");
|
||||
print_lock_name(hlock_class(next));
|
||||
printk("\n");
|
||||
printk(KERN_CONT "\n");
|
||||
dump_stack();
|
||||
return graph_lock();
|
||||
}
|
||||
@ -2343,11 +2342,11 @@ print_usage_bug_scenario(struct held_lock *lock)
|
||||
printk(" ----\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(class);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk(" <Interrupt>\n");
|
||||
printk(" lock(");
|
||||
__print_lock_name(class);
|
||||
printk(");\n");
|
||||
printk(KERN_CONT ");\n");
|
||||
printk("\n *** DEADLOCK ***\n\n");
|
||||
}
|
||||
|
||||
@ -2522,14 +2521,18 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this,
|
||||
void print_irqtrace_events(struct task_struct *curr)
|
||||
{
|
||||
printk("irq event stamp: %u\n", curr->irq_events);
|
||||
printk("hardirqs last enabled at (%u): ", curr->hardirq_enable_event);
|
||||
print_ip_sym(curr->hardirq_enable_ip);
|
||||
printk("hardirqs last disabled at (%u): ", curr->hardirq_disable_event);
|
||||
print_ip_sym(curr->hardirq_disable_ip);
|
||||
printk("softirqs last enabled at (%u): ", curr->softirq_enable_event);
|
||||
print_ip_sym(curr->softirq_enable_ip);
|
||||
printk("softirqs last disabled at (%u): ", curr->softirq_disable_event);
|
||||
print_ip_sym(curr->softirq_disable_ip);
|
||||
printk("hardirqs last enabled at (%u): [<%p>] %pS\n",
|
||||
curr->hardirq_enable_event, (void *)curr->hardirq_enable_ip,
|
||||
(void *)curr->hardirq_enable_ip);
|
||||
printk("hardirqs last disabled at (%u): [<%p>] %pS\n",
|
||||
curr->hardirq_disable_event, (void *)curr->hardirq_disable_ip,
|
||||
(void *)curr->hardirq_disable_ip);
|
||||
printk("softirqs last enabled at (%u): [<%p>] %pS\n",
|
||||
curr->softirq_enable_event, (void *)curr->softirq_enable_ip,
|
||||
(void *)curr->softirq_enable_ip);
|
||||
printk("softirqs last disabled at (%u): [<%p>] %pS\n",
|
||||
curr->softirq_disable_event, (void *)curr->softirq_disable_ip,
|
||||
(void *)curr->softirq_disable_ip);
|
||||
}
|
||||
|
||||
static int HARDIRQ_verbose(struct lock_class *class)
|
||||
@ -3235,8 +3238,8 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
|
||||
if (very_verbose(class)) {
|
||||
printk("\nacquire class [%p] %s", class->key, class->name);
|
||||
if (class->name_version > 1)
|
||||
printk("#%d", class->name_version);
|
||||
printk("\n");
|
||||
printk(KERN_CONT "#%d", class->name_version);
|
||||
printk(KERN_CONT "\n");
|
||||
dump_stack();
|
||||
}
|
||||
|
||||
@ -3378,7 +3381,7 @@ print_unlock_imbalance_bug(struct task_struct *curr, struct lockdep_map *lock,
|
||||
printk("%s/%d is trying to release lock (",
|
||||
curr->comm, task_pid_nr(curr));
|
||||
print_lockdep_cache(lock);
|
||||
printk(") at:\n");
|
||||
printk(KERN_CONT ") at:\n");
|
||||
print_ip_sym(ip);
|
||||
printk("but there are no more locks to release!\n");
|
||||
printk("\nother info that might help us debug this:\n");
|
||||
@ -3871,7 +3874,7 @@ print_lock_contention_bug(struct task_struct *curr, struct lockdep_map *lock,
|
||||
printk("%s/%d is trying to contend lock (",
|
||||
curr->comm, task_pid_nr(curr));
|
||||
print_lockdep_cache(lock);
|
||||
printk(") at:\n");
|
||||
printk(KERN_CONT ") at:\n");
|
||||
print_ip_sym(ip);
|
||||
printk("but there are no locks held!\n");
|
||||
printk("\nother info that might help us debug this:\n");
|
||||
|
@ -65,8 +65,72 @@ static inline void clear_rt_mutex_waiters(struct rt_mutex *lock)
|
||||
|
||||
static void fixup_rt_mutex_waiters(struct rt_mutex *lock)
|
||||
{
|
||||
if (!rt_mutex_has_waiters(lock))
|
||||
clear_rt_mutex_waiters(lock);
|
||||
unsigned long owner, *p = (unsigned long *) &lock->owner;
|
||||
|
||||
if (rt_mutex_has_waiters(lock))
|
||||
return;
|
||||
|
||||
/*
|
||||
* The rbtree has no waiters enqueued, now make sure that the
|
||||
* lock->owner still has the waiters bit set, otherwise the
|
||||
* following can happen:
|
||||
*
|
||||
* CPU 0 CPU 1 CPU2
|
||||
* l->owner=T1
|
||||
* rt_mutex_lock(l)
|
||||
* lock(l->lock)
|
||||
* l->owner = T1 | HAS_WAITERS;
|
||||
* enqueue(T2)
|
||||
* boost()
|
||||
* unlock(l->lock)
|
||||
* block()
|
||||
*
|
||||
* rt_mutex_lock(l)
|
||||
* lock(l->lock)
|
||||
* l->owner = T1 | HAS_WAITERS;
|
||||
* enqueue(T3)
|
||||
* boost()
|
||||
* unlock(l->lock)
|
||||
* block()
|
||||
* signal(->T2) signal(->T3)
|
||||
* lock(l->lock)
|
||||
* dequeue(T2)
|
||||
* deboost()
|
||||
* unlock(l->lock)
|
||||
* lock(l->lock)
|
||||
* dequeue(T3)
|
||||
* ==> wait list is empty
|
||||
* deboost()
|
||||
* unlock(l->lock)
|
||||
* lock(l->lock)
|
||||
* fixup_rt_mutex_waiters()
|
||||
* if (wait_list_empty(l) {
|
||||
* l->owner = owner
|
||||
* owner = l->owner & ~HAS_WAITERS;
|
||||
* ==> l->owner = T1
|
||||
* }
|
||||
* lock(l->lock)
|
||||
* rt_mutex_unlock(l) fixup_rt_mutex_waiters()
|
||||
* if (wait_list_empty(l) {
|
||||
* owner = l->owner & ~HAS_WAITERS;
|
||||
* cmpxchg(l->owner, T1, NULL)
|
||||
* ===> Success (l->owner = NULL)
|
||||
*
|
||||
* l->owner = owner
|
||||
* ==> l->owner = T1
|
||||
* }
|
||||
*
|
||||
* With the check for the waiter bit in place T3 on CPU2 will not
|
||||
* overwrite. All tasks fiddling with the waiters bit are
|
||||
* serialized by l->lock, so nothing else can modify the waiters
|
||||
* bit. If the bit is set then nothing can change l->owner either
|
||||
* so the simple RMW is safe. The cmpxchg() will simply fail if it
|
||||
* happens in the middle of the RMW because the waiters bit is
|
||||
* still set.
|
||||
*/
|
||||
owner = READ_ONCE(*p);
|
||||
if (owner & RT_MUTEX_HAS_WAITERS)
|
||||
WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -75,8 +75,9 @@ task_top_pi_waiter(struct task_struct *p)
|
||||
|
||||
static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock)
|
||||
{
|
||||
return (struct task_struct *)
|
||||
((unsigned long)lock->owner & ~RT_MUTEX_OWNER_MASKALL);
|
||||
unsigned long owner = (unsigned long) READ_ONCE(lock->owner);
|
||||
|
||||
return (struct task_struct *) (owner & ~RT_MUTEX_OWNER_MASKALL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -212,6 +212,7 @@ int proc_sched_autogroup_set_nice(struct task_struct *p, int nice)
|
||||
{
|
||||
static unsigned long next = INITIAL_JIFFIES;
|
||||
struct autogroup *ag;
|
||||
unsigned long shares;
|
||||
int err;
|
||||
|
||||
if (nice < MIN_NICE || nice > MAX_NICE)
|
||||
@ -230,9 +231,10 @@ int proc_sched_autogroup_set_nice(struct task_struct *p, int nice)
|
||||
|
||||
next = HZ / 10 + jiffies;
|
||||
ag = autogroup_task_get(p);
|
||||
shares = scale_load(sched_prio_to_weight[nice + 20]);
|
||||
|
||||
down_write(&ag->lock);
|
||||
err = sched_group_set_shares(ag->tg, sched_prio_to_weight[nice + 20]);
|
||||
err = sched_group_set_shares(ag->tg, shares);
|
||||
if (!err)
|
||||
ag->nice = nice;
|
||||
up_write(&ag->lock);
|
||||
|
@ -980,23 +980,23 @@ static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
|
||||
#ifndef CONFIG_PROVE_LOCKING
|
||||
if (expected == FAILURE && debug_locks) {
|
||||
expected_testcase_failures++;
|
||||
printk("failed|");
|
||||
pr_cont("failed|");
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (debug_locks != expected) {
|
||||
unexpected_testcase_failures++;
|
||||
printk("FAILED|");
|
||||
pr_cont("FAILED|");
|
||||
|
||||
dump_stack();
|
||||
} else {
|
||||
testcase_successes++;
|
||||
printk(" ok |");
|
||||
pr_cont(" ok |");
|
||||
}
|
||||
testcase_total++;
|
||||
|
||||
if (debug_locks_verbose)
|
||||
printk(" lockclass mask: %x, debug_locks: %d, expected: %d\n",
|
||||
pr_cont(" lockclass mask: %x, debug_locks: %d, expected: %d\n",
|
||||
lockclass_mask, debug_locks, expected);
|
||||
/*
|
||||
* Some tests (e.g. double-unlock) might corrupt the preemption
|
||||
@ -1021,26 +1021,26 @@ static inline void print_testname(const char *testname)
|
||||
#define DO_TESTCASE_1(desc, name, nr) \
|
||||
print_testname(desc"/"#nr); \
|
||||
dotest(name##_##nr, SUCCESS, LOCKTYPE_RWLOCK); \
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
#define DO_TESTCASE_1B(desc, name, nr) \
|
||||
print_testname(desc"/"#nr); \
|
||||
dotest(name##_##nr, FAILURE, LOCKTYPE_RWLOCK); \
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
#define DO_TESTCASE_3(desc, name, nr) \
|
||||
print_testname(desc"/"#nr); \
|
||||
dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN); \
|
||||
dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK); \
|
||||
dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK); \
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
#define DO_TESTCASE_3RW(desc, name, nr) \
|
||||
print_testname(desc"/"#nr); \
|
||||
dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN|LOCKTYPE_RWLOCK);\
|
||||
dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK); \
|
||||
dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK); \
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
#define DO_TESTCASE_6(desc, name) \
|
||||
print_testname(desc); \
|
||||
@ -1050,7 +1050,7 @@ static inline void print_testname(const char *testname)
|
||||
dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX); \
|
||||
dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM); \
|
||||
dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM); \
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
#define DO_TESTCASE_6_SUCCESS(desc, name) \
|
||||
print_testname(desc); \
|
||||
@ -1060,7 +1060,7 @@ static inline void print_testname(const char *testname)
|
||||
dotest(name##_mutex, SUCCESS, LOCKTYPE_MUTEX); \
|
||||
dotest(name##_wsem, SUCCESS, LOCKTYPE_RWSEM); \
|
||||
dotest(name##_rsem, SUCCESS, LOCKTYPE_RWSEM); \
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
/*
|
||||
* 'read' variant: rlocks must not trigger.
|
||||
@ -1073,7 +1073,7 @@ static inline void print_testname(const char *testname)
|
||||
dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX); \
|
||||
dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM); \
|
||||
dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM); \
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
#define DO_TESTCASE_2I(desc, name, nr) \
|
||||
DO_TESTCASE_1("hard-"desc, name##_hard, nr); \
|
||||
@ -1726,25 +1726,25 @@ static void ww_tests(void)
|
||||
dotest(ww_test_fail_acquire, SUCCESS, LOCKTYPE_WW);
|
||||
dotest(ww_test_normal, SUCCESS, LOCKTYPE_WW);
|
||||
dotest(ww_test_unneeded_slow, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("ww contexts mixing");
|
||||
dotest(ww_test_two_contexts, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_diff_class, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("finishing ww context");
|
||||
dotest(ww_test_context_done_twice, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_context_unlock_twice, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_context_fini_early, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_context_lock_after_done, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("locking mismatches");
|
||||
dotest(ww_test_object_unlock_twice, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_object_lock_unbalanced, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_object_lock_stale_context, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("EDEADLK handling");
|
||||
dotest(ww_test_edeadlk_normal, SUCCESS, LOCKTYPE_WW);
|
||||
@ -1757,11 +1757,11 @@ static void ww_tests(void)
|
||||
dotest(ww_test_edeadlk_acquire_more_edeadlk_slow, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_edeadlk_acquire_wrong, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_edeadlk_acquire_wrong_slow, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("spinlock nest unlocked");
|
||||
dotest(ww_test_spin_nest_unlocked, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
printk(" -----------------------------------------------------\n");
|
||||
printk(" |block | try |context|\n");
|
||||
@ -1771,25 +1771,25 @@ static void ww_tests(void)
|
||||
dotest(ww_test_context_block, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_context_try, SUCCESS, LOCKTYPE_WW);
|
||||
dotest(ww_test_context_context, SUCCESS, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("try");
|
||||
dotest(ww_test_try_block, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_try_try, SUCCESS, LOCKTYPE_WW);
|
||||
dotest(ww_test_try_context, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("block");
|
||||
dotest(ww_test_block_block, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_block_try, SUCCESS, LOCKTYPE_WW);
|
||||
dotest(ww_test_block_context, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("spinlock");
|
||||
dotest(ww_test_spin_block, FAILURE, LOCKTYPE_WW);
|
||||
dotest(ww_test_spin_try, SUCCESS, LOCKTYPE_WW);
|
||||
dotest(ww_test_spin_context, FAILURE, LOCKTYPE_WW);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
void locking_selftest(void)
|
||||
@ -1829,32 +1829,32 @@ void locking_selftest(void)
|
||||
|
||||
printk(" --------------------------------------------------------------------------\n");
|
||||
print_testname("recursive read-lock");
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_AA1, SUCCESS, LOCKTYPE_RWLOCK);
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rsem_AA1, FAILURE, LOCKTYPE_RWSEM);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("recursive read-lock #2");
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK);
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("mixed read-write-lock");
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_AA2, FAILURE, LOCKTYPE_RWLOCK);
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rsem_AA2, FAILURE, LOCKTYPE_RWSEM);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("mixed write-read-lock");
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_AA3, FAILURE, LOCKTYPE_RWLOCK);
|
||||
printk(" |");
|
||||
pr_cont(" |");
|
||||
dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
printk(" --------------------------------------------------------------------------\n");
|
||||
|
||||
|
@ -499,6 +499,9 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
if (optlen % sizeof(struct can_filter) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (optlen > CAN_RAW_FILTER_MAX * sizeof(struct can_filter))
|
||||
return -EINVAL;
|
||||
|
||||
count = optlen / sizeof(struct can_filter);
|
||||
|
||||
if (count > 1) {
|
||||
|
@ -99,7 +99,7 @@ int arch_decode_instruction(struct elf *elf, struct section *sec,
|
||||
break;
|
||||
|
||||
case 0x8d:
|
||||
if (insn.rex_prefix.bytes &&
|
||||
if (insn.rex_prefix.nbytes &&
|
||||
insn.rex_prefix.bytes[0] == 0x48 &&
|
||||
insn.modrm.nbytes && insn.modrm.bytes[0] == 0x2c &&
|
||||
insn.sib.nbytes && insn.sib.bytes[0] == 0x24)
|
||||
|
@ -14,6 +14,7 @@ ldflags-y += --wrap=devm_memremap_pages
|
||||
ldflags-y += --wrap=insert_resource
|
||||
ldflags-y += --wrap=remove_resource
|
||||
ldflags-y += --wrap=acpi_evaluate_object
|
||||
ldflags-y += --wrap=acpi_evaluate_dsm
|
||||
|
||||
DRIVERS := ../../../drivers
|
||||
NVDIMM_SRC := $(DRIVERS)/nvdimm
|
||||
|
@ -26,14 +26,17 @@ static LIST_HEAD(iomap_head);
|
||||
|
||||
static struct iomap_ops {
|
||||
nfit_test_lookup_fn nfit_test_lookup;
|
||||
nfit_test_evaluate_dsm_fn evaluate_dsm;
|
||||
struct list_head list;
|
||||
} iomap_ops = {
|
||||
.list = LIST_HEAD_INIT(iomap_ops.list),
|
||||
};
|
||||
|
||||
void nfit_test_setup(nfit_test_lookup_fn lookup)
|
||||
void nfit_test_setup(nfit_test_lookup_fn lookup,
|
||||
nfit_test_evaluate_dsm_fn evaluate)
|
||||
{
|
||||
iomap_ops.nfit_test_lookup = lookup;
|
||||
iomap_ops.evaluate_dsm = evaluate;
|
||||
list_add_rcu(&iomap_ops.list, &iomap_head);
|
||||
}
|
||||
EXPORT_SYMBOL(nfit_test_setup);
|
||||
@ -367,4 +370,22 @@ acpi_status __wrap_acpi_evaluate_object(acpi_handle handle, acpi_string path,
|
||||
}
|
||||
EXPORT_SYMBOL(__wrap_acpi_evaluate_object);
|
||||
|
||||
union acpi_object * __wrap_acpi_evaluate_dsm(acpi_handle handle, const u8 *uuid,
|
||||
u64 rev, u64 func, union acpi_object *argv4)
|
||||
{
|
||||
union acpi_object *obj = ERR_PTR(-ENXIO);
|
||||
struct iomap_ops *ops;
|
||||
|
||||
rcu_read_lock();
|
||||
ops = list_first_or_null_rcu(&iomap_head, typeof(*ops), list);
|
||||
if (ops)
|
||||
obj = ops->evaluate_dsm(handle, uuid, rev, func, argv4);
|
||||
rcu_read_unlock();
|
||||
|
||||
if (IS_ERR(obj))
|
||||
return acpi_evaluate_dsm(handle, uuid, rev, func, argv4);
|
||||
return obj;
|
||||
}
|
||||
EXPORT_SYMBOL(__wrap_acpi_evaluate_dsm);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/sizes.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/slab.h>
|
||||
#include <nd-core.h>
|
||||
#include <nfit.h>
|
||||
#include <nd.h>
|
||||
#include "nfit_test.h"
|
||||
@ -1506,6 +1507,225 @@ static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long nfit_ctl_handle;
|
||||
|
||||
union acpi_object *result;
|
||||
|
||||
static union acpi_object *nfit_test_evaluate_dsm(acpi_handle handle,
|
||||
const u8 *uuid, u64 rev, u64 func, union acpi_object *argv4)
|
||||
{
|
||||
if (handle != &nfit_ctl_handle)
|
||||
return ERR_PTR(-ENXIO);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int setup_result(void *buf, size_t size)
|
||||
{
|
||||
result = kmalloc(sizeof(union acpi_object) + size, GFP_KERNEL);
|
||||
if (!result)
|
||||
return -ENOMEM;
|
||||
result->package.type = ACPI_TYPE_BUFFER,
|
||||
result->buffer.pointer = (void *) (result + 1);
|
||||
result->buffer.length = size;
|
||||
memcpy(result->buffer.pointer, buf, size);
|
||||
memset(buf, 0, size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nfit_ctl_test(struct device *dev)
|
||||
{
|
||||
int rc, cmd_rc;
|
||||
struct nvdimm *nvdimm;
|
||||
struct acpi_device *adev;
|
||||
struct nfit_mem *nfit_mem;
|
||||
struct nd_ars_record *record;
|
||||
struct acpi_nfit_desc *acpi_desc;
|
||||
const u64 test_val = 0x0123456789abcdefULL;
|
||||
unsigned long mask, cmd_size, offset;
|
||||
union {
|
||||
struct nd_cmd_get_config_size cfg_size;
|
||||
struct nd_cmd_ars_status ars_stat;
|
||||
struct nd_cmd_ars_cap ars_cap;
|
||||
char buf[sizeof(struct nd_cmd_ars_status)
|
||||
+ sizeof(struct nd_ars_record)];
|
||||
} cmds;
|
||||
|
||||
adev = devm_kzalloc(dev, sizeof(*adev), GFP_KERNEL);
|
||||
if (!adev)
|
||||
return -ENOMEM;
|
||||
*adev = (struct acpi_device) {
|
||||
.handle = &nfit_ctl_handle,
|
||||
.dev = {
|
||||
.init_name = "test-adev",
|
||||
},
|
||||
};
|
||||
|
||||
acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL);
|
||||
if (!acpi_desc)
|
||||
return -ENOMEM;
|
||||
*acpi_desc = (struct acpi_nfit_desc) {
|
||||
.nd_desc = {
|
||||
.cmd_mask = 1UL << ND_CMD_ARS_CAP
|
||||
| 1UL << ND_CMD_ARS_START
|
||||
| 1UL << ND_CMD_ARS_STATUS
|
||||
| 1UL << ND_CMD_CLEAR_ERROR,
|
||||
.module = THIS_MODULE,
|
||||
.provider_name = "ACPI.NFIT",
|
||||
.ndctl = acpi_nfit_ctl,
|
||||
},
|
||||
.dev = &adev->dev,
|
||||
};
|
||||
|
||||
nfit_mem = devm_kzalloc(dev, sizeof(*nfit_mem), GFP_KERNEL);
|
||||
if (!nfit_mem)
|
||||
return -ENOMEM;
|
||||
|
||||
mask = 1UL << ND_CMD_SMART | 1UL << ND_CMD_SMART_THRESHOLD
|
||||
| 1UL << ND_CMD_DIMM_FLAGS | 1UL << ND_CMD_GET_CONFIG_SIZE
|
||||
| 1UL << ND_CMD_GET_CONFIG_DATA | 1UL << ND_CMD_SET_CONFIG_DATA
|
||||
| 1UL << ND_CMD_VENDOR;
|
||||
*nfit_mem = (struct nfit_mem) {
|
||||
.adev = adev,
|
||||
.family = NVDIMM_FAMILY_INTEL,
|
||||
.dsm_mask = mask,
|
||||
};
|
||||
|
||||
nvdimm = devm_kzalloc(dev, sizeof(*nvdimm), GFP_KERNEL);
|
||||
if (!nvdimm)
|
||||
return -ENOMEM;
|
||||
*nvdimm = (struct nvdimm) {
|
||||
.provider_data = nfit_mem,
|
||||
.cmd_mask = mask,
|
||||
.dev = {
|
||||
.init_name = "test-dimm",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
/* basic checkout of a typical 'get config size' command */
|
||||
cmd_size = sizeof(cmds.cfg_size);
|
||||
cmds.cfg_size = (struct nd_cmd_get_config_size) {
|
||||
.status = 0,
|
||||
.config_size = SZ_128K,
|
||||
.max_xfer = SZ_4K,
|
||||
};
|
||||
rc = setup_result(cmds.buf, cmd_size);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = acpi_nfit_ctl(&acpi_desc->nd_desc, nvdimm, ND_CMD_GET_CONFIG_SIZE,
|
||||
cmds.buf, cmd_size, &cmd_rc);
|
||||
|
||||
if (rc < 0 || cmd_rc || cmds.cfg_size.status != 0
|
||||
|| cmds.cfg_size.config_size != SZ_128K
|
||||
|| cmds.cfg_size.max_xfer != SZ_4K) {
|
||||
dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
|
||||
__func__, __LINE__, rc, cmd_rc);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/* test ars_status with zero output */
|
||||
cmd_size = offsetof(struct nd_cmd_ars_status, address);
|
||||
cmds.ars_stat = (struct nd_cmd_ars_status) {
|
||||
.out_length = 0,
|
||||
};
|
||||
rc = setup_result(cmds.buf, cmd_size);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
|
||||
cmds.buf, cmd_size, &cmd_rc);
|
||||
|
||||
if (rc < 0 || cmd_rc) {
|
||||
dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
|
||||
__func__, __LINE__, rc, cmd_rc);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/* test ars_cap with benign extended status */
|
||||
cmd_size = sizeof(cmds.ars_cap);
|
||||
cmds.ars_cap = (struct nd_cmd_ars_cap) {
|
||||
.status = ND_ARS_PERSISTENT << 16,
|
||||
};
|
||||
offset = offsetof(struct nd_cmd_ars_cap, status);
|
||||
rc = setup_result(cmds.buf + offset, cmd_size - offset);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_CAP,
|
||||
cmds.buf, cmd_size, &cmd_rc);
|
||||
|
||||
if (rc < 0 || cmd_rc) {
|
||||
dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
|
||||
__func__, __LINE__, rc, cmd_rc);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/* test ars_status with 'status' trimmed from 'out_length' */
|
||||
cmd_size = sizeof(cmds.ars_stat) + sizeof(struct nd_ars_record);
|
||||
cmds.ars_stat = (struct nd_cmd_ars_status) {
|
||||
.out_length = cmd_size - 4,
|
||||
};
|
||||
record = &cmds.ars_stat.records[0];
|
||||
*record = (struct nd_ars_record) {
|
||||
.length = test_val,
|
||||
};
|
||||
rc = setup_result(cmds.buf, cmd_size);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
|
||||
cmds.buf, cmd_size, &cmd_rc);
|
||||
|
||||
if (rc < 0 || cmd_rc || record->length != test_val) {
|
||||
dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
|
||||
__func__, __LINE__, rc, cmd_rc);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/* test ars_status with 'Output (Size)' including 'status' */
|
||||
cmd_size = sizeof(cmds.ars_stat) + sizeof(struct nd_ars_record);
|
||||
cmds.ars_stat = (struct nd_cmd_ars_status) {
|
||||
.out_length = cmd_size,
|
||||
};
|
||||
record = &cmds.ars_stat.records[0];
|
||||
*record = (struct nd_ars_record) {
|
||||
.length = test_val,
|
||||
};
|
||||
rc = setup_result(cmds.buf, cmd_size);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
|
||||
cmds.buf, cmd_size, &cmd_rc);
|
||||
|
||||
if (rc < 0 || cmd_rc || record->length != test_val) {
|
||||
dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
|
||||
__func__, __LINE__, rc, cmd_rc);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/* test extended status for get_config_size results in failure */
|
||||
cmd_size = sizeof(cmds.cfg_size);
|
||||
cmds.cfg_size = (struct nd_cmd_get_config_size) {
|
||||
.status = 1 << 16,
|
||||
};
|
||||
rc = setup_result(cmds.buf, cmd_size);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = acpi_nfit_ctl(&acpi_desc->nd_desc, nvdimm, ND_CMD_GET_CONFIG_SIZE,
|
||||
cmds.buf, cmd_size, &cmd_rc);
|
||||
|
||||
if (rc < 0 || cmd_rc >= 0) {
|
||||
dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
|
||||
__func__, __LINE__, rc, cmd_rc);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nfit_test_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct nvdimm_bus_descriptor *nd_desc;
|
||||
@ -1516,6 +1736,12 @@ static int nfit_test_probe(struct platform_device *pdev)
|
||||
union acpi_object *obj;
|
||||
int rc;
|
||||
|
||||
if (strcmp(dev_name(&pdev->dev), "nfit_test.0") == 0) {
|
||||
rc = nfit_ctl_test(&pdev->dev);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
nfit_test = to_nfit_test(&pdev->dev);
|
||||
|
||||
/* common alloc */
|
||||
@ -1639,11 +1865,13 @@ static __init int nfit_test_init(void)
|
||||
{
|
||||
int rc, i;
|
||||
|
||||
nfit_test_dimm = class_create(THIS_MODULE, "nfit_test_dimm");
|
||||
if (IS_ERR(nfit_test_dimm))
|
||||
return PTR_ERR(nfit_test_dimm);
|
||||
nfit_test_setup(nfit_test_lookup, nfit_test_evaluate_dsm);
|
||||
|
||||
nfit_test_setup(nfit_test_lookup);
|
||||
nfit_test_dimm = class_create(THIS_MODULE, "nfit_test_dimm");
|
||||
if (IS_ERR(nfit_test_dimm)) {
|
||||
rc = PTR_ERR(nfit_test_dimm);
|
||||
goto err_register;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_NFITS; i++) {
|
||||
struct nfit_test *nfit_test;
|
||||
|
@ -31,11 +31,17 @@ struct nfit_test_resource {
|
||||
void *buf;
|
||||
};
|
||||
|
||||
union acpi_object;
|
||||
typedef void *acpi_handle;
|
||||
|
||||
typedef struct nfit_test_resource *(*nfit_test_lookup_fn)(resource_size_t);
|
||||
typedef union acpi_object *(*nfit_test_evaluate_dsm_fn)(acpi_handle handle,
|
||||
const u8 *uuid, u64 rev, u64 func, union acpi_object *argv4);
|
||||
void __iomem *__wrap_ioremap_nocache(resource_size_t offset,
|
||||
unsigned long size);
|
||||
void __wrap_iounmap(volatile void __iomem *addr);
|
||||
void nfit_test_setup(nfit_test_lookup_fn lookup);
|
||||
void nfit_test_setup(nfit_test_lookup_fn lookup,
|
||||
nfit_test_evaluate_dsm_fn evaluate);
|
||||
void nfit_test_teardown(void);
|
||||
struct nfit_test_resource *get_nfit_res(resource_size_t resource);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user