mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
This is the 4.14.124 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlz8sr0ACgkQONu9yGCS aT54tw/+MuNheIksFu/G9xPkjPykIL6bkqTQBlMzLvdNTqfqBQz6w41NR0QVcs9i BTo1m6FUlxpIXilsvWfBsdaRV6/LdqDzIkr0LskD45Wj6nTHZN/kCAQL0PAH0KaR ZHQzwefZVEvfdDaC4Z8MKDOmot3uZQunljtF6lGGbabIJ1hRxNfo5dNuLKt7Bh4G BrUou5fB4NO4FIS429p5xzmEjmiEvNZO5oQapb9YmX0vhkYwNn+kYwLJcYBZ6cX1 FWdSdyfv1x8uSKcT/v+Zhb4WMSkf1538PrSCdPJQ58U42zXLAgf5O/cOpsJfnK8Z MX8bTWEewHRN7z3q0ojygcqk1HhTiVMufFdqSrE9FN8O8WwowLNysM0L77bDnRNs /IdTL/XX9aD7lcToVEuH1RbCWFjUT99pWsubgbvQGOMiehWQOPbp5xfIkJywSbmf Pqu3LRzHx0JEeKADrcU4UAH+TpQg8Vy3m0EibslqQNjLssxtGyOLUhSyuaxtcQLP vX69FI/RFLrd4qs1nyr6QWD2wsjGMf+9HbUA5faW3REpK+ndJo6M6tgyCLOLHKay EB9j6cwolbvtQH/DMJh1SA4ut0SGCGUd/4fhAo8ZWES/3bWmtmVcaaz90ohQ61c8 x0Z6nxOviYNxG4F0OTwHequETF8bXhhvDdRRkjjE5leLveuJ86c= =ZOJI -----END PGP SIGNATURE----- Merge 4.14.124 into android-4.14-q Changes in 4.14.124 inet: switch IP ID generator to siphash ipv6: Consider sk_bound_dev_if when binding a raw socket to an address llc: fix skb leak in llc_build_and_send_ui_pkt() net: fec: fix the clk mismatch in failed_reset path net-gro: fix use-after-free read in napi_gro_frags() net: stmmac: fix reset gpio free missing usbnet: fix kernel crash after disconnect tipc: Avoid copying bytes beyond the supplied data net/mlx5: Allocate root ns memory using kzalloc to match kfree bnxt_en: Fix aggregation buffer leak under OOM condition. ipv4/igmp: fix another memory leak in igmpv3_del_delrec() ipv4/igmp: fix build error if !CONFIG_IP_MULTICAST net: dsa: mv88e6xxx: fix handling of upper half of STATS_TYPE_PORT net: mvneta: Fix err code path of probe net: mvpp2: fix bad MVPP2_TXQ_SCHED_TOKEN_CNTR_REG queue value net: phy: marvell10g: report if the PHY fails to boot firmware crypto: vmx - ghash: do nosimd fallback manually xen/pciback: Don't disable PCI_COMMAND on PCI device reset. Revert "tipc: fix modprobe tipc failed after switch order of device registration" tipc: fix modprobe tipc failed after switch order of device registration sparc64: Fix regression in non-hypervisor TLB flush xcall include/linux/bitops.h: sanitize rotate primitives xhci: update bounce buffer with correct sg num xhci: Use %zu for printing size_t type xhci: Convert xhci_handshake() to use readl_poll_timeout_atomic() usb: xhci: avoid null pointer deref when bos field is NULL usbip: usbip_host: fix BUG: sleeping function called from invalid context usbip: usbip_host: fix stub_dev lock context imbalance regression USB: Fix slab-out-of-bounds write in usb_get_bos_descriptor USB: sisusbvga: fix oops in error path of sisusb_probe USB: Add LPM quirk for Surface Dock GigE adapter USB: rio500: refuse more than one device at a time USB: rio500: fix memory leak in close after disconnect media: usb: siano: Fix general protection fault in smsusb media: usb: siano: Fix false-positive "uninitialized variable" warning media: smsusb: better handle optional alignment scsi: zfcp: fix missing zfcp_port reference put on -EBUSY from port_remove scsi: zfcp: fix to prevent port_remove with pure auto scan LUNs (only sdevs) Btrfs: fix wrong ctime and mtime of a directory after log replay Btrfs: fix race updating log root item during fsync Btrfs: fix fsync not persisting changed attributes of a directory Btrfs: incremental send, fix file corruption when no-holes feature is enabled KVM: PPC: Book3S HV: XIVE: Do not clear IRQ data of passthrough interrupts powerpc/perf: Fix MMCRA corruption by bhrb_filter ALSA: hda/realtek - Set default power save node to 0 KVM: s390: Do not report unusabled IDs via KVM_CAP_MAX_VCPU_ID drm/nouveau/i2c: Disable i2c bus access after ->fini() tty: serial: msm_serial: Fix XON/XOFF tty: max310x: Fix external crystal register setup memcg: make it work on sparse non-0-node systems kernel/signal.c: trace_signal_deliver when signal_group_exit docs: Fix conf.py for Sphinx 2.0 doc: Cope with the deprecation of AutoReporter doc: Cope with Sphinx logging deprecations ima: show rules with IMA_INMASK correctly serial: sh-sci: disable DMA for uart_console staging: vc04_services: prevent integer overflow in create_pagelist() staging: wlan-ng: fix adapter initialization failure CIFS: cifs_read_allocate_pages: don't iterate through whole page array on ENOMEM Revert "lockd: Show pid of lockd for remote locks" gcc-plugins: Fix build failures under Darwin host drm/vmwgfx: Don't send drm sysfs hotplug events on initial master set drm/rockchip: shutdown drm subsystem on shutdown Compiler Attributes: add support for __copy (gcc >= 9) include/linux/module.h: copy __init/__exit attrs to init/cleanup_module Revert "x86/build: Move _etext to actual end of .text" Revert "binder: fix handling of misaligned binder object" binder: fix race between munmap() and direct reclaim media: uvcvideo: Fix uvc_alloc_entity() allocation alignment Linux 4.14.124 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
8e1d939d22
@ -37,7 +37,7 @@ needs_sphinx = '1.3'
|
||||
extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include', 'cdomain', 'kfigure']
|
||||
|
||||
# The name of the math extension changed on Sphinx 1.4
|
||||
if major == 1 and minor > 3:
|
||||
if (major == 1 and minor > 3) or (major > 1):
|
||||
extensions.append("sphinx.ext.imgmath")
|
||||
else:
|
||||
extensions.append("sphinx.ext.pngmath")
|
||||
|
@ -37,7 +37,19 @@ import glob
|
||||
from docutils import nodes, statemachine
|
||||
from docutils.statemachine import ViewList
|
||||
from docutils.parsers.rst import directives, Directive
|
||||
from sphinx.ext.autodoc import AutodocReporter
|
||||
|
||||
#
|
||||
# AutodocReporter is only good up to Sphinx 1.7
|
||||
#
|
||||
import sphinx
|
||||
|
||||
Use_SSI = sphinx.__version__[:3] >= '1.7'
|
||||
if Use_SSI:
|
||||
from sphinx.util.docutils import switch_source_input
|
||||
else:
|
||||
from sphinx.ext.autodoc import AutodocReporter
|
||||
|
||||
import kernellog
|
||||
|
||||
__version__ = '1.0'
|
||||
|
||||
@ -86,7 +98,8 @@ class KernelDocDirective(Directive):
|
||||
cmd += [filename]
|
||||
|
||||
try:
|
||||
env.app.verbose('calling kernel-doc \'%s\'' % (" ".join(cmd)))
|
||||
kernellog.verbose(env.app,
|
||||
'calling kernel-doc \'%s\'' % (" ".join(cmd)))
|
||||
|
||||
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
out, err = p.communicate()
|
||||
@ -96,7 +109,8 @@ class KernelDocDirective(Directive):
|
||||
if p.returncode != 0:
|
||||
sys.stderr.write(err)
|
||||
|
||||
env.app.warn('kernel-doc \'%s\' failed with return code %d' % (" ".join(cmd), p.returncode))
|
||||
kernellog.warn(env.app,
|
||||
'kernel-doc \'%s\' failed with return code %d' % (" ".join(cmd), p.returncode))
|
||||
return [nodes.error(None, nodes.paragraph(text = "kernel-doc missing"))]
|
||||
elif env.config.kerneldoc_verbosity > 0:
|
||||
sys.stderr.write(err)
|
||||
@ -117,20 +131,28 @@ class KernelDocDirective(Directive):
|
||||
lineoffset += 1
|
||||
|
||||
node = nodes.section()
|
||||
buf = self.state.memo.title_styles, self.state.memo.section_level, self.state.memo.reporter
|
||||
self.do_parse(result, node)
|
||||
|
||||
return node.children
|
||||
|
||||
except Exception as e: # pylint: disable=W0703
|
||||
kernellog.warn(env.app, 'kernel-doc \'%s\' processing failed with: %s' %
|
||||
(" ".join(cmd), str(e)))
|
||||
return [nodes.error(None, nodes.paragraph(text = "kernel-doc missing"))]
|
||||
|
||||
def do_parse(self, result, node):
|
||||
if Use_SSI:
|
||||
with switch_source_input(self.state, result):
|
||||
self.state.nested_parse(result, 0, node, match_titles=1)
|
||||
else:
|
||||
save = self.state.memo.title_styles, self.state.memo.section_level, self.state.memo.reporter
|
||||
self.state.memo.reporter = AutodocReporter(result, self.state.memo.reporter)
|
||||
self.state.memo.title_styles, self.state.memo.section_level = [], 0
|
||||
try:
|
||||
self.state.nested_parse(result, 0, node, match_titles=1)
|
||||
finally:
|
||||
self.state.memo.title_styles, self.state.memo.section_level, self.state.memo.reporter = buf
|
||||
self.state.memo.title_styles, self.state.memo.section_level, self.state.memo.reporter = save
|
||||
|
||||
return node.children
|
||||
|
||||
except Exception as e: # pylint: disable=W0703
|
||||
env.app.warn('kernel-doc \'%s\' processing failed with: %s' %
|
||||
(" ".join(cmd), str(e)))
|
||||
return [nodes.error(None, nodes.paragraph(text = "kernel-doc missing"))]
|
||||
|
||||
def setup(app):
|
||||
app.add_config_value('kerneldoc_bin', None, 'env')
|
||||
|
28
Documentation/sphinx/kernellog.py
Normal file
28
Documentation/sphinx/kernellog.py
Normal file
@ -0,0 +1,28 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Sphinx has deprecated its older logging interface, but the replacement
|
||||
# only goes back to 1.6. So here's a wrapper layer to keep around for
|
||||
# as long as we support 1.4.
|
||||
#
|
||||
import sphinx
|
||||
|
||||
if sphinx.__version__[:3] >= '1.6':
|
||||
UseLogging = True
|
||||
from sphinx.util import logging
|
||||
logger = logging.getLogger('kerneldoc')
|
||||
else:
|
||||
UseLogging = False
|
||||
|
||||
def warn(app, message):
|
||||
if UseLogging:
|
||||
logger.warning(message)
|
||||
else:
|
||||
app.warn(message)
|
||||
|
||||
def verbose(app, message):
|
||||
if UseLogging:
|
||||
logger.verbose(message)
|
||||
else:
|
||||
app.verbose(message)
|
||||
|
||||
|
@ -60,6 +60,8 @@ import sphinx
|
||||
from sphinx.util.nodes import clean_astext
|
||||
from six import iteritems
|
||||
|
||||
import kernellog
|
||||
|
||||
PY3 = sys.version_info[0] == 3
|
||||
|
||||
if PY3:
|
||||
@ -171,20 +173,20 @@ def setupTools(app):
|
||||
This function is called once, when the builder is initiated.
|
||||
"""
|
||||
global dot_cmd, convert_cmd # pylint: disable=W0603
|
||||
app.verbose("kfigure: check installed tools ...")
|
||||
kernellog.verbose(app, "kfigure: check installed tools ...")
|
||||
|
||||
dot_cmd = which('dot')
|
||||
convert_cmd = which('convert')
|
||||
|
||||
if dot_cmd:
|
||||
app.verbose("use dot(1) from: " + dot_cmd)
|
||||
kernellog.verbose(app, "use dot(1) from: " + dot_cmd)
|
||||
else:
|
||||
app.warn("dot(1) not found, for better output quality install "
|
||||
"graphviz from http://www.graphviz.org")
|
||||
kernellog.warn(app, "dot(1) not found, for better output quality install "
|
||||
"graphviz from http://www.graphviz.org")
|
||||
if convert_cmd:
|
||||
app.verbose("use convert(1) from: " + convert_cmd)
|
||||
kernellog.verbose(app, "use convert(1) from: " + convert_cmd)
|
||||
else:
|
||||
app.warn(
|
||||
kernellog.warn(app,
|
||||
"convert(1) not found, for SVG to PDF conversion install "
|
||||
"ImageMagick (https://www.imagemagick.org)")
|
||||
|
||||
@ -220,12 +222,13 @@ def convert_image(img_node, translator, src_fname=None):
|
||||
|
||||
# in kernel builds, use 'make SPHINXOPTS=-v' to see verbose messages
|
||||
|
||||
app.verbose('assert best format for: ' + img_node['uri'])
|
||||
kernellog.verbose(app, 'assert best format for: ' + img_node['uri'])
|
||||
|
||||
if in_ext == '.dot':
|
||||
|
||||
if not dot_cmd:
|
||||
app.verbose("dot from graphviz not available / include DOT raw.")
|
||||
kernellog.verbose(app,
|
||||
"dot from graphviz not available / include DOT raw.")
|
||||
img_node.replace_self(file2literal(src_fname))
|
||||
|
||||
elif translator.builder.format == 'latex':
|
||||
@ -252,7 +255,8 @@ def convert_image(img_node, translator, src_fname=None):
|
||||
|
||||
if translator.builder.format == 'latex':
|
||||
if convert_cmd is None:
|
||||
app.verbose("no SVG to PDF conversion available / include SVG raw.")
|
||||
kernellog.verbose(app,
|
||||
"no SVG to PDF conversion available / include SVG raw.")
|
||||
img_node.replace_self(file2literal(src_fname))
|
||||
else:
|
||||
dst_fname = path.join(translator.builder.outdir, fname + '.pdf')
|
||||
@ -265,18 +269,19 @@ def convert_image(img_node, translator, src_fname=None):
|
||||
_name = dst_fname[len(translator.builder.outdir) + 1:]
|
||||
|
||||
if isNewer(dst_fname, src_fname):
|
||||
app.verbose("convert: {out}/%s already exists and is newer" % _name)
|
||||
kernellog.verbose(app,
|
||||
"convert: {out}/%s already exists and is newer" % _name)
|
||||
|
||||
else:
|
||||
ok = False
|
||||
mkdir(path.dirname(dst_fname))
|
||||
|
||||
if in_ext == '.dot':
|
||||
app.verbose('convert DOT to: {out}/' + _name)
|
||||
kernellog.verbose(app, 'convert DOT to: {out}/' + _name)
|
||||
ok = dot2format(app, src_fname, dst_fname)
|
||||
|
||||
elif in_ext == '.svg':
|
||||
app.verbose('convert SVG to: {out}/' + _name)
|
||||
kernellog.verbose(app, 'convert SVG to: {out}/' + _name)
|
||||
ok = svg2pdf(app, src_fname, dst_fname)
|
||||
|
||||
if not ok:
|
||||
@ -305,7 +310,8 @@ def dot2format(app, dot_fname, out_fname):
|
||||
with open(out_fname, "w") as out:
|
||||
exit_code = subprocess.call(cmd, stdout = out)
|
||||
if exit_code != 0:
|
||||
app.warn("Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
kernellog.warn(app,
|
||||
"Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
return bool(exit_code == 0)
|
||||
|
||||
def svg2pdf(app, svg_fname, pdf_fname):
|
||||
@ -322,7 +328,7 @@ def svg2pdf(app, svg_fname, pdf_fname):
|
||||
# use stdout and stderr from parent
|
||||
exit_code = subprocess.call(cmd)
|
||||
if exit_code != 0:
|
||||
app.warn("Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
kernellog.warn(app, "Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||
return bool(exit_code == 0)
|
||||
|
||||
|
||||
@ -415,15 +421,15 @@ def visit_kernel_render(self, node):
|
||||
app = self.builder.app
|
||||
srclang = node.get('srclang')
|
||||
|
||||
app.verbose('visit kernel-render node lang: "%s"' % (srclang))
|
||||
kernellog.verbose('visit kernel-render node lang: "%s"' % (srclang))
|
||||
|
||||
tmp_ext = RENDER_MARKUP_EXT.get(srclang, None)
|
||||
if tmp_ext is None:
|
||||
app.warn('kernel-render: "%s" unknow / include raw.' % (srclang))
|
||||
kernellog.warn('kernel-render: "%s" unknow / include raw.' % (srclang))
|
||||
return
|
||||
|
||||
if not dot_cmd and tmp_ext == '.dot':
|
||||
app.verbose("dot from graphviz not available / include raw.")
|
||||
kernellog.verbose("dot from graphviz not available / include raw.")
|
||||
return
|
||||
|
||||
literal_block = node[0]
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 123
|
||||
SUBLEVEL = 124
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
|
@ -1078,6 +1078,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||
case KVM_CAP_MAX_VCPUS:
|
||||
r = KVM_MAX_VCPUS;
|
||||
break;
|
||||
case KVM_CAP_MAX_VCPU_ID:
|
||||
r = KVM_MAX_VCPU_ID;
|
||||
break;
|
||||
case KVM_CAP_MIPS_FPU:
|
||||
/* We don't handle systems with inconsistent cpu_has_fpu */
|
||||
r = !!raw_cpu_has_fpu;
|
||||
|
@ -1675,7 +1675,6 @@ static void kvmppc_xive_cleanup_irq(u32 hw_num, struct xive_irq_data *xd)
|
||||
{
|
||||
xive_vm_esb_load(xd, XIVE_ESB_SET_PQ_01);
|
||||
xive_native_configure_irq(hw_num, 0, MASKED, 0);
|
||||
xive_cleanup_irq_data(xd);
|
||||
}
|
||||
|
||||
static void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb)
|
||||
@ -1689,9 +1688,10 @@ static void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb)
|
||||
continue;
|
||||
|
||||
kvmppc_xive_cleanup_irq(state->ipi_number, &state->ipi_data);
|
||||
xive_cleanup_irq_data(&state->ipi_data);
|
||||
xive_native_free_irq(state->ipi_number);
|
||||
|
||||
/* Pass-through, cleanup too */
|
||||
/* Pass-through, cleanup too but keep IRQ hw data */
|
||||
if (state->pt_number)
|
||||
kvmppc_xive_cleanup_irq(state->pt_number, state->pt_data);
|
||||
|
||||
|
@ -629,6 +629,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||
case KVM_CAP_MAX_VCPUS:
|
||||
r = KVM_MAX_VCPUS;
|
||||
break;
|
||||
case KVM_CAP_MAX_VCPU_ID:
|
||||
r = KVM_MAX_VCPU_ID;
|
||||
break;
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
case KVM_CAP_PPC_GET_SMMU_INFO:
|
||||
r = 1;
|
||||
|
@ -1845,6 +1845,7 @@ static int power_pmu_event_init(struct perf_event *event)
|
||||
int n;
|
||||
int err;
|
||||
struct cpu_hw_events *cpuhw;
|
||||
u64 bhrb_filter;
|
||||
|
||||
if (!ppmu)
|
||||
return -ENOENT;
|
||||
@ -1941,13 +1942,14 @@ static int power_pmu_event_init(struct perf_event *event)
|
||||
err = power_check_constraints(cpuhw, events, cflags, n + 1);
|
||||
|
||||
if (has_branch_stack(event)) {
|
||||
cpuhw->bhrb_filter = ppmu->bhrb_filter_map(
|
||||
bhrb_filter = ppmu->bhrb_filter_map(
|
||||
event->attr.branch_sample_type);
|
||||
|
||||
if (cpuhw->bhrb_filter == -1) {
|
||||
if (bhrb_filter == -1) {
|
||||
put_cpu_var(cpu_hw_events);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
cpuhw->bhrb_filter = bhrb_filter;
|
||||
}
|
||||
|
||||
put_cpu_var(cpu_hw_events);
|
||||
|
@ -29,6 +29,7 @@ enum {
|
||||
#define POWER8_MMCRA_IFM1 0x0000000040000000UL
|
||||
#define POWER8_MMCRA_IFM2 0x0000000080000000UL
|
||||
#define POWER8_MMCRA_IFM3 0x00000000C0000000UL
|
||||
#define POWER8_MMCRA_BHRB_MASK 0x00000000C0000000UL
|
||||
|
||||
/* PowerISA v2.07 format attribute structure*/
|
||||
extern struct attribute_group isa207_pmu_format_group;
|
||||
@ -179,6 +180,8 @@ static u64 power8_bhrb_filter_map(u64 branch_sample_type)
|
||||
|
||||
static void power8_config_bhrb(u64 pmu_bhrb_filter)
|
||||
{
|
||||
pmu_bhrb_filter &= POWER8_MMCRA_BHRB_MASK;
|
||||
|
||||
/* Enable BHRB filter in PMU */
|
||||
mtspr(SPRN_MMCRA, (mfspr(SPRN_MMCRA) | pmu_bhrb_filter));
|
||||
}
|
||||
|
@ -100,6 +100,7 @@ enum {
|
||||
#define POWER9_MMCRA_IFM1 0x0000000040000000UL
|
||||
#define POWER9_MMCRA_IFM2 0x0000000080000000UL
|
||||
#define POWER9_MMCRA_IFM3 0x00000000C0000000UL
|
||||
#define POWER9_MMCRA_BHRB_MASK 0x00000000C0000000UL
|
||||
|
||||
/* PowerISA v2.07 format attribute structure*/
|
||||
extern struct attribute_group isa207_pmu_format_group;
|
||||
@ -289,6 +290,8 @@ static u64 power9_bhrb_filter_map(u64 branch_sample_type)
|
||||
|
||||
static void power9_config_bhrb(u64 pmu_bhrb_filter)
|
||||
{
|
||||
pmu_bhrb_filter &= POWER9_MMCRA_BHRB_MASK;
|
||||
|
||||
/* Enable BHRB filter in PMU */
|
||||
mtspr(SPRN_MMCRA, (mfspr(SPRN_MMCRA) | pmu_bhrb_filter));
|
||||
}
|
||||
|
@ -428,6 +428,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||
break;
|
||||
case KVM_CAP_NR_VCPUS:
|
||||
case KVM_CAP_MAX_VCPUS:
|
||||
case KVM_CAP_MAX_VCPU_ID:
|
||||
r = KVM_S390_BSCA_CPU_SLOTS;
|
||||
if (!kvm_s390_use_sca_entries())
|
||||
r = KVM_MAX_VCPUS;
|
||||
|
@ -587,7 +587,7 @@ xcall_flush_tlb_kernel_range: /* 44 insns */
|
||||
sub %g7, %g1, %g3
|
||||
srlx %g3, 18, %g2
|
||||
brnz,pn %g2, 2f
|
||||
add %g2, 1, %g2
|
||||
sethi %hi(PAGE_SIZE), %g2
|
||||
sub %g3, %g2, %g3
|
||||
or %g1, 0x20, %g1 ! Nucleus
|
||||
1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP
|
||||
@ -751,7 +751,7 @@ __cheetah_xcall_flush_tlb_kernel_range: /* 44 insns */
|
||||
sub %g7, %g1, %g3
|
||||
srlx %g3, 18, %g2
|
||||
brnz,pn %g2, 2f
|
||||
add %g2, 1, %g2
|
||||
sethi %hi(PAGE_SIZE), %g2
|
||||
sub %g3, %g2, %g3
|
||||
or %g1, 0x20, %g1 ! Nucleus
|
||||
1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP
|
||||
|
@ -2825,6 +2825,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||
case KVM_CAP_MAX_VCPUS:
|
||||
r = KVM_MAX_VCPUS;
|
||||
break;
|
||||
case KVM_CAP_MAX_VCPU_ID:
|
||||
r = KVM_MAX_VCPU_ID;
|
||||
break;
|
||||
case KVM_CAP_NR_MEMSLOTS:
|
||||
r = KVM_USER_MEM_SLOTS;
|
||||
break;
|
||||
|
@ -1,22 +1,14 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/**
|
||||
* GHASH routines supporting VMX instructions on the Power 8
|
||||
*
|
||||
* Copyright (C) 2015 International Business Machines Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 only.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
* Copyright (C) 2015, 2019 International Business Machines Inc.
|
||||
*
|
||||
* Author: Marcelo Henrique Cerri <mhcerri@br.ibm.com>
|
||||
*
|
||||
* Extended by Daniel Axtens <dja@axtens.net> to replace the fallback
|
||||
* mechanism. The new approach is based on arm64 code, which is:
|
||||
* Copyright (C) 2014 - 2018 Linaro Ltd. <ard.biesheuvel@linaro.org>
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
@ -39,71 +31,25 @@ void gcm_ghash_p8(u64 Xi[2], const u128 htable[16],
|
||||
const u8 *in, size_t len);
|
||||
|
||||
struct p8_ghash_ctx {
|
||||
/* key used by vector asm */
|
||||
u128 htable[16];
|
||||
struct crypto_shash *fallback;
|
||||
/* key used by software fallback */
|
||||
be128 key;
|
||||
};
|
||||
|
||||
struct p8_ghash_desc_ctx {
|
||||
u64 shash[2];
|
||||
u8 buffer[GHASH_DIGEST_SIZE];
|
||||
int bytes;
|
||||
struct shash_desc fallback_desc;
|
||||
};
|
||||
|
||||
static int p8_ghash_init_tfm(struct crypto_tfm *tfm)
|
||||
{
|
||||
const char *alg = "ghash-generic";
|
||||
struct crypto_shash *fallback;
|
||||
struct crypto_shash *shash_tfm = __crypto_shash_cast(tfm);
|
||||
struct p8_ghash_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
fallback = crypto_alloc_shash(alg, 0, CRYPTO_ALG_NEED_FALLBACK);
|
||||
if (IS_ERR(fallback)) {
|
||||
printk(KERN_ERR
|
||||
"Failed to allocate transformation for '%s': %ld\n",
|
||||
alg, PTR_ERR(fallback));
|
||||
return PTR_ERR(fallback);
|
||||
}
|
||||
|
||||
crypto_shash_set_flags(fallback,
|
||||
crypto_shash_get_flags((struct crypto_shash
|
||||
*) tfm));
|
||||
|
||||
/* Check if the descsize defined in the algorithm is still enough. */
|
||||
if (shash_tfm->descsize < sizeof(struct p8_ghash_desc_ctx)
|
||||
+ crypto_shash_descsize(fallback)) {
|
||||
printk(KERN_ERR
|
||||
"Desc size of the fallback implementation (%s) does not match the expected value: %lu vs %u\n",
|
||||
alg,
|
||||
shash_tfm->descsize - sizeof(struct p8_ghash_desc_ctx),
|
||||
crypto_shash_descsize(fallback));
|
||||
return -EINVAL;
|
||||
}
|
||||
ctx->fallback = fallback;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void p8_ghash_exit_tfm(struct crypto_tfm *tfm)
|
||||
{
|
||||
struct p8_ghash_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
if (ctx->fallback) {
|
||||
crypto_free_shash(ctx->fallback);
|
||||
ctx->fallback = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int p8_ghash_init(struct shash_desc *desc)
|
||||
{
|
||||
struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm));
|
||||
struct p8_ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
|
||||
dctx->bytes = 0;
|
||||
memset(dctx->shash, 0, GHASH_DIGEST_SIZE);
|
||||
dctx->fallback_desc.tfm = ctx->fallback;
|
||||
dctx->fallback_desc.flags = desc->flags;
|
||||
return crypto_shash_init(&dctx->fallback_desc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int p8_ghash_setkey(struct crypto_shash *tfm, const u8 *key,
|
||||
@ -121,7 +67,51 @@ static int p8_ghash_setkey(struct crypto_shash *tfm, const u8 *key,
|
||||
disable_kernel_vsx();
|
||||
pagefault_enable();
|
||||
preempt_enable();
|
||||
return crypto_shash_setkey(ctx->fallback, key, keylen);
|
||||
|
||||
memcpy(&ctx->key, key, GHASH_BLOCK_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void __ghash_block(struct p8_ghash_ctx *ctx,
|
||||
struct p8_ghash_desc_ctx *dctx)
|
||||
{
|
||||
if (!IN_INTERRUPT) {
|
||||
preempt_disable();
|
||||
pagefault_disable();
|
||||
enable_kernel_vsx();
|
||||
gcm_ghash_p8(dctx->shash, ctx->htable,
|
||||
dctx->buffer, GHASH_DIGEST_SIZE);
|
||||
disable_kernel_vsx();
|
||||
pagefault_enable();
|
||||
preempt_enable();
|
||||
} else {
|
||||
crypto_xor((u8 *)dctx->shash, dctx->buffer, GHASH_BLOCK_SIZE);
|
||||
gf128mul_lle((be128 *)dctx->shash, &ctx->key);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void __ghash_blocks(struct p8_ghash_ctx *ctx,
|
||||
struct p8_ghash_desc_ctx *dctx,
|
||||
const u8 *src, unsigned int srclen)
|
||||
{
|
||||
if (!IN_INTERRUPT) {
|
||||
preempt_disable();
|
||||
pagefault_disable();
|
||||
enable_kernel_vsx();
|
||||
gcm_ghash_p8(dctx->shash, ctx->htable,
|
||||
src, srclen);
|
||||
disable_kernel_vsx();
|
||||
pagefault_enable();
|
||||
preempt_enable();
|
||||
} else {
|
||||
while (srclen >= GHASH_BLOCK_SIZE) {
|
||||
crypto_xor((u8 *)dctx->shash, src, GHASH_BLOCK_SIZE);
|
||||
gf128mul_lle((be128 *)dctx->shash, &ctx->key);
|
||||
srclen -= GHASH_BLOCK_SIZE;
|
||||
src += GHASH_BLOCK_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int p8_ghash_update(struct shash_desc *desc,
|
||||
@ -131,49 +121,33 @@ static int p8_ghash_update(struct shash_desc *desc,
|
||||
struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm));
|
||||
struct p8_ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
|
||||
if (IN_INTERRUPT) {
|
||||
return crypto_shash_update(&dctx->fallback_desc, src,
|
||||
srclen);
|
||||
} else {
|
||||
if (dctx->bytes) {
|
||||
if (dctx->bytes + srclen < GHASH_DIGEST_SIZE) {
|
||||
memcpy(dctx->buffer + dctx->bytes, src,
|
||||
srclen);
|
||||
dctx->bytes += srclen;
|
||||
return 0;
|
||||
}
|
||||
if (dctx->bytes) {
|
||||
if (dctx->bytes + srclen < GHASH_DIGEST_SIZE) {
|
||||
memcpy(dctx->buffer + dctx->bytes, src,
|
||||
GHASH_DIGEST_SIZE - dctx->bytes);
|
||||
preempt_disable();
|
||||
pagefault_disable();
|
||||
enable_kernel_vsx();
|
||||
gcm_ghash_p8(dctx->shash, ctx->htable,
|
||||
dctx->buffer, GHASH_DIGEST_SIZE);
|
||||
disable_kernel_vsx();
|
||||
pagefault_enable();
|
||||
preempt_enable();
|
||||
src += GHASH_DIGEST_SIZE - dctx->bytes;
|
||||
srclen -= GHASH_DIGEST_SIZE - dctx->bytes;
|
||||
dctx->bytes = 0;
|
||||
srclen);
|
||||
dctx->bytes += srclen;
|
||||
return 0;
|
||||
}
|
||||
len = srclen & ~(GHASH_DIGEST_SIZE - 1);
|
||||
if (len) {
|
||||
preempt_disable();
|
||||
pagefault_disable();
|
||||
enable_kernel_vsx();
|
||||
gcm_ghash_p8(dctx->shash, ctx->htable, src, len);
|
||||
disable_kernel_vsx();
|
||||
pagefault_enable();
|
||||
preempt_enable();
|
||||
src += len;
|
||||
srclen -= len;
|
||||
}
|
||||
if (srclen) {
|
||||
memcpy(dctx->buffer, src, srclen);
|
||||
dctx->bytes = srclen;
|
||||
}
|
||||
return 0;
|
||||
memcpy(dctx->buffer + dctx->bytes, src,
|
||||
GHASH_DIGEST_SIZE - dctx->bytes);
|
||||
|
||||
__ghash_block(ctx, dctx);
|
||||
|
||||
src += GHASH_DIGEST_SIZE - dctx->bytes;
|
||||
srclen -= GHASH_DIGEST_SIZE - dctx->bytes;
|
||||
dctx->bytes = 0;
|
||||
}
|
||||
len = srclen & ~(GHASH_DIGEST_SIZE - 1);
|
||||
if (len) {
|
||||
__ghash_blocks(ctx, dctx, src, len);
|
||||
src += len;
|
||||
srclen -= len;
|
||||
}
|
||||
if (srclen) {
|
||||
memcpy(dctx->buffer, src, srclen);
|
||||
dctx->bytes = srclen;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int p8_ghash_final(struct shash_desc *desc, u8 *out)
|
||||
@ -182,25 +156,14 @@ static int p8_ghash_final(struct shash_desc *desc, u8 *out)
|
||||
struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm));
|
||||
struct p8_ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
|
||||
if (IN_INTERRUPT) {
|
||||
return crypto_shash_final(&dctx->fallback_desc, out);
|
||||
} else {
|
||||
if (dctx->bytes) {
|
||||
for (i = dctx->bytes; i < GHASH_DIGEST_SIZE; i++)
|
||||
dctx->buffer[i] = 0;
|
||||
preempt_disable();
|
||||
pagefault_disable();
|
||||
enable_kernel_vsx();
|
||||
gcm_ghash_p8(dctx->shash, ctx->htable,
|
||||
dctx->buffer, GHASH_DIGEST_SIZE);
|
||||
disable_kernel_vsx();
|
||||
pagefault_enable();
|
||||
preempt_enable();
|
||||
dctx->bytes = 0;
|
||||
}
|
||||
memcpy(out, dctx->shash, GHASH_DIGEST_SIZE);
|
||||
return 0;
|
||||
if (dctx->bytes) {
|
||||
for (i = dctx->bytes; i < GHASH_DIGEST_SIZE; i++)
|
||||
dctx->buffer[i] = 0;
|
||||
__ghash_block(ctx, dctx);
|
||||
dctx->bytes = 0;
|
||||
}
|
||||
memcpy(out, dctx->shash, GHASH_DIGEST_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct shash_alg p8_ghash_alg = {
|
||||
@ -215,11 +178,9 @@ struct shash_alg p8_ghash_alg = {
|
||||
.cra_name = "ghash",
|
||||
.cra_driver_name = "p8_ghash",
|
||||
.cra_priority = 1000,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_SHASH | CRYPTO_ALG_NEED_FALLBACK,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_SHASH,
|
||||
.cra_blocksize = GHASH_BLOCK_SIZE,
|
||||
.cra_ctxsize = sizeof(struct p8_ghash_ctx),
|
||||
.cra_module = THIS_MODULE,
|
||||
.cra_init = p8_ghash_init_tfm,
|
||||
.cra_exit = p8_ghash_exit_tfm,
|
||||
},
|
||||
};
|
||||
|
@ -38,6 +38,7 @@ struct nvkm_i2c_bus {
|
||||
struct mutex mutex;
|
||||
struct list_head head;
|
||||
struct i2c_adapter i2c;
|
||||
u8 enabled;
|
||||
};
|
||||
|
||||
int nvkm_i2c_bus_acquire(struct nvkm_i2c_bus *);
|
||||
@ -57,6 +58,7 @@ struct nvkm_i2c_aux {
|
||||
struct mutex mutex;
|
||||
struct list_head head;
|
||||
struct i2c_adapter i2c;
|
||||
u8 enabled;
|
||||
|
||||
u32 intr;
|
||||
};
|
||||
|
@ -105,9 +105,15 @@ nvkm_i2c_aux_acquire(struct nvkm_i2c_aux *aux)
|
||||
{
|
||||
struct nvkm_i2c_pad *pad = aux->pad;
|
||||
int ret;
|
||||
|
||||
AUX_TRACE(aux, "acquire");
|
||||
mutex_lock(&aux->mutex);
|
||||
ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_AUX);
|
||||
|
||||
if (aux->enabled)
|
||||
ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_AUX);
|
||||
else
|
||||
ret = -EIO;
|
||||
|
||||
if (ret)
|
||||
mutex_unlock(&aux->mutex);
|
||||
return ret;
|
||||
@ -145,6 +151,24 @@ nvkm_i2c_aux_del(struct nvkm_i2c_aux **paux)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_i2c_aux_init(struct nvkm_i2c_aux *aux)
|
||||
{
|
||||
AUX_TRACE(aux, "init");
|
||||
mutex_lock(&aux->mutex);
|
||||
aux->enabled = true;
|
||||
mutex_unlock(&aux->mutex);
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_i2c_aux_fini(struct nvkm_i2c_aux *aux)
|
||||
{
|
||||
AUX_TRACE(aux, "fini");
|
||||
mutex_lock(&aux->mutex);
|
||||
aux->enabled = false;
|
||||
mutex_unlock(&aux->mutex);
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_i2c_aux_ctor(const struct nvkm_i2c_aux_func *func,
|
||||
struct nvkm_i2c_pad *pad, int id,
|
||||
|
@ -16,6 +16,8 @@ int nvkm_i2c_aux_ctor(const struct nvkm_i2c_aux_func *, struct nvkm_i2c_pad *,
|
||||
int nvkm_i2c_aux_new_(const struct nvkm_i2c_aux_func *, struct nvkm_i2c_pad *,
|
||||
int id, struct nvkm_i2c_aux **);
|
||||
void nvkm_i2c_aux_del(struct nvkm_i2c_aux **);
|
||||
void nvkm_i2c_aux_init(struct nvkm_i2c_aux *);
|
||||
void nvkm_i2c_aux_fini(struct nvkm_i2c_aux *);
|
||||
int nvkm_i2c_aux_xfer(struct nvkm_i2c_aux *, bool retry, u8 type,
|
||||
u32 addr, u8 *data, u8 *size);
|
||||
|
||||
|
@ -160,8 +160,18 @@ nvkm_i2c_fini(struct nvkm_subdev *subdev, bool suspend)
|
||||
{
|
||||
struct nvkm_i2c *i2c = nvkm_i2c(subdev);
|
||||
struct nvkm_i2c_pad *pad;
|
||||
struct nvkm_i2c_bus *bus;
|
||||
struct nvkm_i2c_aux *aux;
|
||||
u32 mask;
|
||||
|
||||
list_for_each_entry(aux, &i2c->aux, head) {
|
||||
nvkm_i2c_aux_fini(aux);
|
||||
}
|
||||
|
||||
list_for_each_entry(bus, &i2c->bus, head) {
|
||||
nvkm_i2c_bus_fini(bus);
|
||||
}
|
||||
|
||||
if ((mask = (1 << i2c->func->aux) - 1), i2c->func->aux_stat) {
|
||||
i2c->func->aux_mask(i2c, NVKM_I2C_ANY, mask, 0);
|
||||
i2c->func->aux_stat(i2c, &mask, &mask, &mask, &mask);
|
||||
@ -180,6 +190,7 @@ nvkm_i2c_init(struct nvkm_subdev *subdev)
|
||||
struct nvkm_i2c *i2c = nvkm_i2c(subdev);
|
||||
struct nvkm_i2c_bus *bus;
|
||||
struct nvkm_i2c_pad *pad;
|
||||
struct nvkm_i2c_aux *aux;
|
||||
|
||||
list_for_each_entry(pad, &i2c->pad, head) {
|
||||
nvkm_i2c_pad_init(pad);
|
||||
@ -189,6 +200,10 @@ nvkm_i2c_init(struct nvkm_subdev *subdev)
|
||||
nvkm_i2c_bus_init(bus);
|
||||
}
|
||||
|
||||
list_for_each_entry(aux, &i2c->aux, head) {
|
||||
nvkm_i2c_aux_init(aux);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -110,6 +110,19 @@ nvkm_i2c_bus_init(struct nvkm_i2c_bus *bus)
|
||||
BUS_TRACE(bus, "init");
|
||||
if (bus->func->init)
|
||||
bus->func->init(bus);
|
||||
|
||||
mutex_lock(&bus->mutex);
|
||||
bus->enabled = true;
|
||||
mutex_unlock(&bus->mutex);
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_i2c_bus_fini(struct nvkm_i2c_bus *bus)
|
||||
{
|
||||
BUS_TRACE(bus, "fini");
|
||||
mutex_lock(&bus->mutex);
|
||||
bus->enabled = false;
|
||||
mutex_unlock(&bus->mutex);
|
||||
}
|
||||
|
||||
void
|
||||
@ -126,9 +139,15 @@ nvkm_i2c_bus_acquire(struct nvkm_i2c_bus *bus)
|
||||
{
|
||||
struct nvkm_i2c_pad *pad = bus->pad;
|
||||
int ret;
|
||||
|
||||
BUS_TRACE(bus, "acquire");
|
||||
mutex_lock(&bus->mutex);
|
||||
ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_I2C);
|
||||
|
||||
if (bus->enabled)
|
||||
ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_I2C);
|
||||
else
|
||||
ret = -EIO;
|
||||
|
||||
if (ret)
|
||||
mutex_unlock(&bus->mutex);
|
||||
return ret;
|
||||
|
@ -18,6 +18,7 @@ int nvkm_i2c_bus_new_(const struct nvkm_i2c_bus_func *, struct nvkm_i2c_pad *,
|
||||
int id, struct nvkm_i2c_bus **);
|
||||
void nvkm_i2c_bus_del(struct nvkm_i2c_bus **);
|
||||
void nvkm_i2c_bus_init(struct nvkm_i2c_bus *);
|
||||
void nvkm_i2c_bus_fini(struct nvkm_i2c_bus *);
|
||||
|
||||
int nvkm_i2c_bit_xfer(struct nvkm_i2c_bus *, struct i2c_msg *, int);
|
||||
|
||||
|
@ -425,6 +425,14 @@ static int rockchip_drm_platform_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rockchip_drm_platform_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
struct drm_device *drm = platform_get_drvdata(pdev);
|
||||
|
||||
if (drm)
|
||||
drm_atomic_helper_shutdown(drm);
|
||||
}
|
||||
|
||||
static const struct of_device_id rockchip_drm_dt_ids[] = {
|
||||
{ .compatible = "rockchip,display-subsystem", },
|
||||
{ /* sentinel */ },
|
||||
@ -434,6 +442,7 @@ MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);
|
||||
static struct platform_driver rockchip_drm_platform_driver = {
|
||||
.probe = rockchip_drm_platform_probe,
|
||||
.remove = rockchip_drm_platform_remove,
|
||||
.shutdown = rockchip_drm_platform_shutdown,
|
||||
.driver = {
|
||||
.name = "rockchip-drm",
|
||||
.of_match_table = rockchip_drm_dt_ids,
|
||||
|
@ -1245,7 +1245,13 @@ static int vmw_master_set(struct drm_device *dev,
|
||||
}
|
||||
|
||||
dev_priv->active_master = vmaster;
|
||||
drm_sysfs_hotplug_event(dev);
|
||||
|
||||
/*
|
||||
* Inform a new master that the layout may have changed while
|
||||
* it was gone.
|
||||
*/
|
||||
if (!from_open)
|
||||
drm_sysfs_hotplug_event(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -402,6 +402,7 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
||||
struct smsusb_device_t *dev;
|
||||
void *mdev;
|
||||
int i, rc;
|
||||
int align = 0;
|
||||
|
||||
/* create device object */
|
||||
dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL);
|
||||
@ -413,6 +414,24 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
||||
dev->udev = interface_to_usbdev(intf);
|
||||
dev->state = SMSUSB_DISCONNECTED;
|
||||
|
||||
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
|
||||
struct usb_endpoint_descriptor *desc =
|
||||
&intf->cur_altsetting->endpoint[i].desc;
|
||||
|
||||
if (desc->bEndpointAddress & USB_DIR_IN) {
|
||||
dev->in_ep = desc->bEndpointAddress;
|
||||
align = usb_endpoint_maxp(desc) - sizeof(struct sms_msg_hdr);
|
||||
} else {
|
||||
dev->out_ep = desc->bEndpointAddress;
|
||||
}
|
||||
}
|
||||
|
||||
pr_debug("in_ep = %02x, out_ep = %02x\n", dev->in_ep, dev->out_ep);
|
||||
if (!dev->in_ep || !dev->out_ep || align < 0) { /* Missing endpoints? */
|
||||
smsusb_term_device(intf);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
params.device_type = sms_get_board(board_id)->type;
|
||||
|
||||
switch (params.device_type) {
|
||||
@ -427,24 +446,12 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
||||
/* fall-thru */
|
||||
default:
|
||||
dev->buffer_size = USB2_BUFFER_SIZE;
|
||||
dev->response_alignment =
|
||||
le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) -
|
||||
sizeof(struct sms_msg_hdr);
|
||||
dev->response_alignment = align;
|
||||
|
||||
params.flags |= SMS_DEVICE_FAMILY2;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
|
||||
if (intf->cur_altsetting->endpoint[i].desc. bEndpointAddress & USB_DIR_IN)
|
||||
dev->in_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
|
||||
else
|
||||
dev->out_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
|
||||
}
|
||||
|
||||
pr_debug("in_ep = %02x, out_ep = %02x\n",
|
||||
dev->in_ep, dev->out_ep);
|
||||
|
||||
params.device = &dev->udev->dev;
|
||||
params.buffer_size = dev->buffer_size;
|
||||
params.num_buffers = MAX_BUFFERS;
|
||||
|
@ -903,7 +903,7 @@ static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id,
|
||||
unsigned int size;
|
||||
unsigned int i;
|
||||
|
||||
extra_size = ALIGN(extra_size, sizeof(*entity->pads));
|
||||
extra_size = roundup(extra_size, sizeof(*entity->pads));
|
||||
num_inputs = (type & UVC_TERM_OUTPUT) ? num_pads : num_pads - 1;
|
||||
size = sizeof(*entity) + extra_size + sizeof(*entity->pads) * num_pads
|
||||
+ num_inputs;
|
||||
|
@ -624,7 +624,7 @@ static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
|
||||
err = mv88e6xxx_port_read(chip, port, s->reg + 1, ®);
|
||||
if (err)
|
||||
return UINT64_MAX;
|
||||
high = reg;
|
||||
low |= ((u32)reg) << 16;
|
||||
}
|
||||
break;
|
||||
case STATS_TYPE_BANK1:
|
||||
|
@ -1583,6 +1583,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi *bnapi, u32 *raw_cons,
|
||||
skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr);
|
||||
bnxt_reuse_rx_data(rxr, cons, data);
|
||||
if (!skb) {
|
||||
if (agg_bufs)
|
||||
bnxt_reuse_rx_agg_bufs(bnapi, cp_cons, agg_bufs);
|
||||
rc = -ENOMEM;
|
||||
goto next_rx;
|
||||
}
|
||||
|
@ -3539,7 +3539,7 @@ failed_init:
|
||||
if (fep->reg_phy)
|
||||
regulator_disable(fep->reg_phy);
|
||||
failed_reset:
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
failed_regulator:
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
|
@ -4350,7 +4350,7 @@ static int mvneta_probe(struct platform_device *pdev)
|
||||
err = register_netdev(dev);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "failed to register\n");
|
||||
goto err_free_stats;
|
||||
goto err_netdev;
|
||||
}
|
||||
|
||||
netdev_info(dev, "Using %s mac address %pM\n", mac_from,
|
||||
@ -4369,13 +4369,11 @@ static int mvneta_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
err_netdev:
|
||||
unregister_netdev(dev);
|
||||
if (pp->bm_priv) {
|
||||
mvneta_bm_pool_destroy(pp->bm_priv, pp->pool_long, 1 << pp->id);
|
||||
mvneta_bm_pool_destroy(pp->bm_priv, pp->pool_short,
|
||||
1 << pp->id);
|
||||
}
|
||||
err_free_stats:
|
||||
free_percpu(pp->stats);
|
||||
err_free_ports:
|
||||
free_percpu(pp->ports);
|
||||
|
@ -4780,7 +4780,7 @@ static inline void mvpp2_xlg_max_rx_size_set(struct mvpp2_port *port)
|
||||
/* Set defaults to the MVPP2 port */
|
||||
static void mvpp2_defaults_set(struct mvpp2_port *port)
|
||||
{
|
||||
int tx_port_num, val, queue, ptxq, lrxq;
|
||||
int tx_port_num, val, queue, lrxq;
|
||||
|
||||
if (port->priv->hw_version == MVPP21) {
|
||||
/* Configure port to loopback if needed */
|
||||
@ -4802,11 +4802,9 @@ static void mvpp2_defaults_set(struct mvpp2_port *port)
|
||||
mvpp2_write(port->priv, MVPP2_TXP_SCHED_CMD_1_REG, 0);
|
||||
|
||||
/* Close bandwidth for all queues */
|
||||
for (queue = 0; queue < MVPP2_MAX_TXQ; queue++) {
|
||||
ptxq = mvpp2_txq_phys(port->id, queue);
|
||||
for (queue = 0; queue < MVPP2_MAX_TXQ; queue++)
|
||||
mvpp2_write(port->priv,
|
||||
MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(ptxq), 0);
|
||||
}
|
||||
MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(queue), 0);
|
||||
|
||||
/* Set refill period to 1 usec, refill tokens
|
||||
* and bucket size to maximum
|
||||
@ -5645,7 +5643,7 @@ static void mvpp2_txq_deinit(struct mvpp2_port *port,
|
||||
txq->descs_dma = 0;
|
||||
|
||||
/* Set minimum bandwidth for disabled TXQs */
|
||||
mvpp2_write(port->priv, MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(txq->id), 0);
|
||||
mvpp2_write(port->priv, MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(txq->log_id), 0);
|
||||
|
||||
/* Set Tx descriptors queue starting address and size */
|
||||
cpu = get_cpu();
|
||||
|
@ -1960,7 +1960,7 @@ static struct mlx5_flow_root_namespace *create_root_ns(struct mlx5_flow_steering
|
||||
struct mlx5_flow_namespace *ns;
|
||||
|
||||
/* Create the root namespace */
|
||||
root_ns = kvzalloc(sizeof(*root_ns), GFP_KERNEL);
|
||||
root_ns = kzalloc(sizeof(*root_ns), GFP_KERNEL);
|
||||
if (!root_ns)
|
||||
return NULL;
|
||||
|
||||
|
@ -157,7 +157,8 @@ int stmmac_mdio_reset(struct mii_bus *bus)
|
||||
of_property_read_u32_array(np,
|
||||
"snps,reset-delays-us", data->delays, 3);
|
||||
|
||||
if (gpio_request(data->reset_gpio, "mdio-reset"))
|
||||
if (devm_gpio_request(priv->device, data->reset_gpio,
|
||||
"mdio-reset"))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,9 @@
|
||||
#include <linux/marvell_phy.h>
|
||||
|
||||
enum {
|
||||
MV_PMA_BOOT = 0xc050,
|
||||
MV_PMA_BOOT_FATAL = BIT(0),
|
||||
|
||||
MV_PCS_BASE_T = 0x0000,
|
||||
MV_PCS_BASE_R = 0x1000,
|
||||
MV_PCS_1000BASEX = 0x2000,
|
||||
@ -59,11 +62,22 @@ static int mv3310_modify(struct phy_device *phydev, int devad, u16 reg,
|
||||
static int mv3310_probe(struct phy_device *phydev)
|
||||
{
|
||||
u32 mmd_mask = MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
|
||||
int ret;
|
||||
|
||||
if (!phydev->is_c45 ||
|
||||
(phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask)
|
||||
return -ENODEV;
|
||||
|
||||
ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret & MV_PMA_BOOT_FATAL) {
|
||||
dev_warn(&phydev->mdio.dev,
|
||||
"PHY failed to boot firmware, status=%04x\n", ret);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -508,6 +508,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
|
||||
|
||||
if (netif_running (dev->net) &&
|
||||
netif_device_present (dev->net) &&
|
||||
test_bit(EVENT_DEV_OPEN, &dev->flags) &&
|
||||
!test_bit (EVENT_RX_HALT, &dev->flags) &&
|
||||
!test_bit (EVENT_DEV_ASLEEP, &dev->flags)) {
|
||||
switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) {
|
||||
@ -1433,6 +1434,11 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
|
||||
spin_unlock_irqrestore(&dev->txq.lock, flags);
|
||||
goto drop;
|
||||
}
|
||||
if (netif_queue_stopped(net)) {
|
||||
usb_autopm_put_interface_async(dev->intf);
|
||||
spin_unlock_irqrestore(&dev->txq.lock, flags);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/* if this triggers the device is still a sleep */
|
||||
|
@ -161,6 +161,7 @@ extern const struct attribute_group *zfcp_port_attr_groups[];
|
||||
extern struct mutex zfcp_sysfs_port_units_mutex;
|
||||
extern struct device_attribute *zfcp_sysfs_sdev_attrs[];
|
||||
extern struct device_attribute *zfcp_sysfs_shost_attrs[];
|
||||
bool zfcp_sysfs_port_is_removing(const struct zfcp_port *const port);
|
||||
|
||||
/* zfcp_unit.c */
|
||||
extern int zfcp_unit_add(struct zfcp_port *, u64);
|
||||
|
@ -125,6 +125,15 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev)
|
||||
|
||||
zfcp_sdev->erp_action.port = port;
|
||||
|
||||
mutex_lock(&zfcp_sysfs_port_units_mutex);
|
||||
if (zfcp_sysfs_port_is_removing(port)) {
|
||||
/* port is already gone */
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
put_device(&port->dev); /* undo zfcp_get_port_by_wwpn() */
|
||||
return -ENXIO;
|
||||
}
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
|
||||
unit = zfcp_unit_find(port, zfcp_scsi_dev_lun(sdev));
|
||||
if (unit)
|
||||
put_device(&unit->dev);
|
||||
|
@ -238,6 +238,53 @@ static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL,
|
||||
|
||||
DEFINE_MUTEX(zfcp_sysfs_port_units_mutex);
|
||||
|
||||
static void zfcp_sysfs_port_set_removing(struct zfcp_port *const port)
|
||||
{
|
||||
lockdep_assert_held(&zfcp_sysfs_port_units_mutex);
|
||||
atomic_set(&port->units, -1);
|
||||
}
|
||||
|
||||
bool zfcp_sysfs_port_is_removing(const struct zfcp_port *const port)
|
||||
{
|
||||
lockdep_assert_held(&zfcp_sysfs_port_units_mutex);
|
||||
return atomic_read(&port->units) == -1;
|
||||
}
|
||||
|
||||
static bool zfcp_sysfs_port_in_use(struct zfcp_port *const port)
|
||||
{
|
||||
struct zfcp_adapter *const adapter = port->adapter;
|
||||
unsigned long flags;
|
||||
struct scsi_device *sdev;
|
||||
bool in_use = true;
|
||||
|
||||
mutex_lock(&zfcp_sysfs_port_units_mutex);
|
||||
if (atomic_read(&port->units) > 0)
|
||||
goto unlock_port_units_mutex; /* zfcp_unit(s) under port */
|
||||
|
||||
spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
|
||||
__shost_for_each_device(sdev, adapter->scsi_host) {
|
||||
const struct zfcp_scsi_dev *zsdev = sdev_to_zfcp(sdev);
|
||||
|
||||
if (sdev->sdev_state == SDEV_DEL ||
|
||||
sdev->sdev_state == SDEV_CANCEL)
|
||||
continue;
|
||||
if (zsdev->port != port)
|
||||
continue;
|
||||
/* alive scsi_device under port of interest */
|
||||
goto unlock_host_lock;
|
||||
}
|
||||
|
||||
/* port is about to be removed, so no more unit_add or slave_alloc */
|
||||
zfcp_sysfs_port_set_removing(port);
|
||||
in_use = false;
|
||||
|
||||
unlock_host_lock:
|
||||
spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
|
||||
unlock_port_units_mutex:
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
return in_use;
|
||||
}
|
||||
|
||||
static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
@ -260,15 +307,11 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
|
||||
else
|
||||
retval = 0;
|
||||
|
||||
mutex_lock(&zfcp_sysfs_port_units_mutex);
|
||||
if (atomic_read(&port->units) > 0) {
|
||||
if (zfcp_sysfs_port_in_use(port)) {
|
||||
retval = -EBUSY;
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
put_device(&port->dev); /* undo zfcp_get_port_by_wwpn() */
|
||||
goto out;
|
||||
}
|
||||
/* port is about to be removed, so no more unit_add */
|
||||
atomic_set(&port->units, -1);
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
|
||||
write_lock_irq(&adapter->port_list_lock);
|
||||
list_del(&port->list);
|
||||
|
@ -124,7 +124,7 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
|
||||
int retval = 0;
|
||||
|
||||
mutex_lock(&zfcp_sysfs_port_units_mutex);
|
||||
if (atomic_read(&port->units) == -1) {
|
||||
if (zfcp_sysfs_port_is_removing(port)) {
|
||||
/* port is already gone */
|
||||
retval = -ENODEV;
|
||||
goto out;
|
||||
@ -168,8 +168,14 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
|
||||
write_lock_irq(&port->unit_list_lock);
|
||||
list_add_tail(&unit->list, &port->unit_list);
|
||||
write_unlock_irq(&port->unit_list_lock);
|
||||
/*
|
||||
* lock order: shost->scan_mutex before zfcp_sysfs_port_units_mutex
|
||||
* due to zfcp_unit_scsi_scan() => zfcp_scsi_slave_alloc()
|
||||
*/
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
|
||||
zfcp_unit_scsi_scan(unit);
|
||||
return retval;
|
||||
|
||||
out:
|
||||
mutex_unlock(&zfcp_sysfs_port_units_mutex);
|
||||
|
@ -405,9 +405,18 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
|
||||
int dma_buffers;
|
||||
dma_addr_t dma_addr;
|
||||
|
||||
if (count >= INT_MAX - PAGE_SIZE)
|
||||
return NULL;
|
||||
|
||||
offset = ((unsigned int)(unsigned long)buf & (PAGE_SIZE - 1));
|
||||
num_pages = DIV_ROUND_UP(count + offset, PAGE_SIZE);
|
||||
|
||||
if (num_pages > (SIZE_MAX - sizeof(PAGELIST_T) -
|
||||
sizeof(struct vchiq_pagelist_info)) /
|
||||
(sizeof(u32) + sizeof(pages[0]) +
|
||||
sizeof(struct scatterlist)))
|
||||
return NULL;
|
||||
|
||||
pagelist_size = sizeof(PAGELIST_T) +
|
||||
(num_pages * sizeof(u32)) +
|
||||
(num_pages * sizeof(pages[0]) +
|
||||
|
@ -3119,7 +3119,9 @@ static void hfa384x_usbin_callback(struct urb *urb)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Save values from the RX URB before reposting overwrites it. */
|
||||
urb_status = urb->status;
|
||||
usbin = (union hfa384x_usbin *)urb->transfer_buffer;
|
||||
|
||||
if (action != ABORT) {
|
||||
/* Repost the RX URB */
|
||||
@ -3136,7 +3138,6 @@ static void hfa384x_usbin_callback(struct urb *urb)
|
||||
/* Note: the check of the sw_support field, the type field doesn't
|
||||
* have bit 12 set like the docs suggest.
|
||||
*/
|
||||
usbin = (union hfa384x_usbin *)urb->transfer_buffer;
|
||||
type = le16_to_cpu(usbin->type);
|
||||
if (HFA384x_USB_ISRXFRM(type)) {
|
||||
if (action == HANDLE) {
|
||||
|
@ -579,7 +579,7 @@ static int max310x_set_ref_clk(struct max310x_port *s, unsigned long freq,
|
||||
}
|
||||
|
||||
/* Configure clock source */
|
||||
clksrc = xtal ? MAX310X_CLKSRC_CRYST_BIT : MAX310X_CLKSRC_EXTCLK_BIT;
|
||||
clksrc = MAX310X_CLKSRC_EXTCLK_BIT | (xtal ? MAX310X_CLKSRC_CRYST_BIT : 0);
|
||||
|
||||
/* Configure PLL */
|
||||
if (pllcfg) {
|
||||
|
@ -868,6 +868,7 @@ static void msm_handle_tx(struct uart_port *port)
|
||||
struct circ_buf *xmit = &msm_port->uart.state->xmit;
|
||||
struct msm_dma *dma = &msm_port->tx_dma;
|
||||
unsigned int pio_count, dma_count, dma_min;
|
||||
char buf[4] = { 0 };
|
||||
void __iomem *tf;
|
||||
int err = 0;
|
||||
|
||||
@ -877,10 +878,12 @@ static void msm_handle_tx(struct uart_port *port)
|
||||
else
|
||||
tf = port->membase + UART_TF;
|
||||
|
||||
buf[0] = port->x_char;
|
||||
|
||||
if (msm_port->is_uartdm)
|
||||
msm_reset_dm_count(port, 1);
|
||||
|
||||
iowrite8_rep(tf, &port->x_char, 1);
|
||||
iowrite32_rep(tf, buf, 1);
|
||||
port->icount.tx++;
|
||||
port->x_char = 0;
|
||||
return;
|
||||
|
@ -1479,6 +1479,13 @@ static void sci_request_dma(struct uart_port *port)
|
||||
|
||||
dev_dbg(port->dev, "%s: port %d\n", __func__, port->line);
|
||||
|
||||
/*
|
||||
* DMA on console may interfere with Kernel log messages which use
|
||||
* plain putchar(). So, simply don't use it with a console.
|
||||
*/
|
||||
if (uart_console(port))
|
||||
return;
|
||||
|
||||
if (!port->dev->of_node)
|
||||
return;
|
||||
|
||||
|
@ -936,8 +936,8 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
||||
|
||||
/* Get BOS descriptor */
|
||||
ret = usb_get_descriptor(dev, USB_DT_BOS, 0, bos, USB_DT_BOS_SIZE);
|
||||
if (ret < USB_DT_BOS_SIZE) {
|
||||
dev_err(ddev, "unable to get BOS descriptor\n");
|
||||
if (ret < USB_DT_BOS_SIZE || bos->bLength < USB_DT_BOS_SIZE) {
|
||||
dev_err(ddev, "unable to get BOS descriptor or descriptor too short\n");
|
||||
if (ret >= 0)
|
||||
ret = -ENOMSG;
|
||||
kfree(bos);
|
||||
|
@ -64,6 +64,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Microsoft LifeCam-VX700 v2.0 */
|
||||
{ USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Microsoft Surface Dock Ethernet (RTL8153 GigE) */
|
||||
{ USB_DEVICE(0x045e, 0x07c6), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Cherry Stream G230 2.0 (G85-231) and 3.0 (G85-232) */
|
||||
{ USB_DEVICE(0x046a, 0x0023), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
|
@ -667,6 +667,7 @@ static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci,
|
||||
struct device *dev = xhci_to_hcd(xhci)->self.controller;
|
||||
struct xhci_segment *seg = td->bounce_seg;
|
||||
struct urb *urb = td->urb;
|
||||
size_t len;
|
||||
|
||||
if (!ring || !seg || !urb)
|
||||
return;
|
||||
@ -677,11 +678,14 @@ static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci,
|
||||
return;
|
||||
}
|
||||
|
||||
/* for in tranfers we need to copy the data from bounce to sg */
|
||||
sg_pcopy_from_buffer(urb->sg, urb->num_mapped_sgs, seg->bounce_buf,
|
||||
seg->bounce_len, seg->bounce_offs);
|
||||
dma_unmap_single(dev, seg->bounce_dma, ring->bounce_buf_len,
|
||||
DMA_FROM_DEVICE);
|
||||
/* for in tranfers we need to copy the data from bounce to sg */
|
||||
len = sg_pcopy_from_buffer(urb->sg, urb->num_sgs, seg->bounce_buf,
|
||||
seg->bounce_len, seg->bounce_offs);
|
||||
if (len != seg->bounce_len)
|
||||
xhci_warn(xhci, "WARN Wrong bounce buffer read length: %zu != %d\n",
|
||||
len, seg->bounce_len);
|
||||
seg->bounce_len = 0;
|
||||
seg->bounce_offs = 0;
|
||||
}
|
||||
@ -3186,6 +3190,7 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len,
|
||||
unsigned int unalign;
|
||||
unsigned int max_pkt;
|
||||
u32 new_buff_len;
|
||||
size_t len;
|
||||
|
||||
max_pkt = usb_endpoint_maxp(&urb->ep->desc);
|
||||
unalign = (enqd_len + *trb_buff_len) % max_pkt;
|
||||
@ -3216,8 +3221,12 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len,
|
||||
|
||||
/* create a max max_pkt sized bounce buffer pointed to by last trb */
|
||||
if (usb_urb_dir_out(urb)) {
|
||||
sg_pcopy_to_buffer(urb->sg, urb->num_mapped_sgs,
|
||||
len = sg_pcopy_to_buffer(urb->sg, urb->num_sgs,
|
||||
seg->bounce_buf, new_buff_len, enqd_len);
|
||||
if (len != seg->bounce_len)
|
||||
xhci_warn(xhci,
|
||||
"WARN Wrong bounce buffer write length: %zu != %d\n",
|
||||
len, seg->bounce_len);
|
||||
seg->bounce_dma = dma_map_single(dev, seg->bounce_buf,
|
||||
max_pkt, DMA_TO_DEVICE);
|
||||
} else {
|
||||
|
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/module.h>
|
||||
@ -62,7 +63,6 @@ static bool td_on_ring(struct xhci_td *td, struct xhci_ring *ring)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* TODO: copied from ehci-hcd.c - can this be refactored? */
|
||||
/*
|
||||
* xhci_handshake - spin reading hc until handshake completes or fails
|
||||
* @ptr: address of hc register to be read
|
||||
@ -79,18 +79,16 @@ static bool td_on_ring(struct xhci_td *td, struct xhci_ring *ring)
|
||||
int xhci_handshake(void __iomem *ptr, u32 mask, u32 done, int usec)
|
||||
{
|
||||
u32 result;
|
||||
int ret;
|
||||
|
||||
do {
|
||||
result = readl(ptr);
|
||||
if (result == ~(u32)0) /* card removed */
|
||||
return -ENODEV;
|
||||
result &= mask;
|
||||
if (result == done)
|
||||
return 0;
|
||||
udelay(1);
|
||||
usec--;
|
||||
} while (usec > 0);
|
||||
return -ETIMEDOUT;
|
||||
ret = readl_poll_timeout_atomic(ptr, result,
|
||||
(result & mask) == done ||
|
||||
result == U32_MAX,
|
||||
1, usec);
|
||||
if (result == U32_MAX) /* card removed */
|
||||
return -ENODEV;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -4155,7 +4153,6 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
|
||||
pm_addr = port_array[port_num] + PORTPMSC;
|
||||
pm_val = readl(pm_addr);
|
||||
hlpm_addr = port_array[port_num] + PORTHLPMC;
|
||||
field = le32_to_cpu(udev->bos->ext_cap->bmAttributes);
|
||||
|
||||
xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n",
|
||||
enable ? "enable" : "disable", port_num + 1);
|
||||
@ -4167,6 +4164,7 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
|
||||
* default one which works with mixed HIRD and BESL
|
||||
* systems. See XHCI_DEFAULT_BESL definition in xhci.h
|
||||
*/
|
||||
field = le32_to_cpu(udev->bos->ext_cap->bmAttributes);
|
||||
if ((field & USB_BESL_SUPPORT) &&
|
||||
(field & USB_BESL_BASELINE_VALID))
|
||||
hird = USB_GET_BESL_BASELINE(field);
|
||||
|
@ -99,9 +99,22 @@ static int close_rio(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct rio_usb_data *rio = &rio_instance;
|
||||
|
||||
rio->isopen = 0;
|
||||
/* against disconnect() */
|
||||
mutex_lock(&rio500_mutex);
|
||||
mutex_lock(&(rio->lock));
|
||||
|
||||
dev_info(&rio->rio_dev->dev, "Rio closed.\n");
|
||||
rio->isopen = 0;
|
||||
if (!rio->present) {
|
||||
/* cleanup has been delayed */
|
||||
kfree(rio->ibuf);
|
||||
kfree(rio->obuf);
|
||||
rio->ibuf = NULL;
|
||||
rio->obuf = NULL;
|
||||
} else {
|
||||
dev_info(&rio->rio_dev->dev, "Rio closed.\n");
|
||||
}
|
||||
mutex_unlock(&(rio->lock));
|
||||
mutex_unlock(&rio500_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -460,15 +473,23 @@ static int probe_rio(struct usb_interface *intf,
|
||||
{
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct rio_usb_data *rio = &rio_instance;
|
||||
int retval;
|
||||
int retval = 0;
|
||||
|
||||
dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
|
||||
mutex_lock(&rio500_mutex);
|
||||
if (rio->present) {
|
||||
dev_info(&intf->dev, "Second USB Rio at address %d refused\n", dev->devnum);
|
||||
retval = -EBUSY;
|
||||
goto bail_out;
|
||||
} else {
|
||||
dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
|
||||
}
|
||||
|
||||
retval = usb_register_dev(intf, &usb_rio_class);
|
||||
if (retval) {
|
||||
dev_err(&dev->dev,
|
||||
"Not able to get a minor for this device.\n");
|
||||
return -ENOMEM;
|
||||
retval = -ENOMEM;
|
||||
goto bail_out;
|
||||
}
|
||||
|
||||
rio->rio_dev = dev;
|
||||
@ -477,7 +498,8 @@ static int probe_rio(struct usb_interface *intf,
|
||||
dev_err(&dev->dev,
|
||||
"probe_rio: Not enough memory for the output buffer\n");
|
||||
usb_deregister_dev(intf, &usb_rio_class);
|
||||
return -ENOMEM;
|
||||
retval = -ENOMEM;
|
||||
goto bail_out;
|
||||
}
|
||||
dev_dbg(&intf->dev, "obuf address:%p\n", rio->obuf);
|
||||
|
||||
@ -486,7 +508,8 @@ static int probe_rio(struct usb_interface *intf,
|
||||
"probe_rio: Not enough memory for the input buffer\n");
|
||||
usb_deregister_dev(intf, &usb_rio_class);
|
||||
kfree(rio->obuf);
|
||||
return -ENOMEM;
|
||||
retval = -ENOMEM;
|
||||
goto bail_out;
|
||||
}
|
||||
dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf);
|
||||
|
||||
@ -494,8 +517,10 @@ static int probe_rio(struct usb_interface *intf,
|
||||
|
||||
usb_set_intfdata (intf, rio);
|
||||
rio->present = 1;
|
||||
bail_out:
|
||||
mutex_unlock(&rio500_mutex);
|
||||
|
||||
return 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void disconnect_rio(struct usb_interface *intf)
|
||||
|
@ -3028,6 +3028,13 @@ static int sisusb_probe(struct usb_interface *intf,
|
||||
|
||||
mutex_init(&(sisusb->lock));
|
||||
|
||||
sisusb->sisusb_dev = dev;
|
||||
sisusb->vrambase = SISUSB_PCI_MEMBASE;
|
||||
sisusb->mmiobase = SISUSB_PCI_MMIOBASE;
|
||||
sisusb->mmiosize = SISUSB_PCI_MMIOSIZE;
|
||||
sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
|
||||
/* Everything else is zero */
|
||||
|
||||
/* Register device */
|
||||
retval = usb_register_dev(intf, &usb_sisusb_class);
|
||||
if (retval) {
|
||||
@ -3038,13 +3045,7 @@ static int sisusb_probe(struct usb_interface *intf,
|
||||
goto error_1;
|
||||
}
|
||||
|
||||
sisusb->sisusb_dev = dev;
|
||||
sisusb->minor = intf->minor;
|
||||
sisusb->vrambase = SISUSB_PCI_MEMBASE;
|
||||
sisusb->mmiobase = SISUSB_PCI_MMIOBASE;
|
||||
sisusb->mmiosize = SISUSB_PCI_MMIOSIZE;
|
||||
sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
|
||||
/* Everything else is zero */
|
||||
sisusb->minor = intf->minor;
|
||||
|
||||
/* Allocate buffers */
|
||||
sisusb->ibufsize = SISUSB_IBUF_SIZE;
|
||||
|
@ -315,9 +315,17 @@ static int stub_probe(struct usb_device *udev)
|
||||
const char *udev_busid = dev_name(&udev->dev);
|
||||
struct bus_id_priv *busid_priv;
|
||||
int rc = 0;
|
||||
char save_status;
|
||||
|
||||
dev_dbg(&udev->dev, "Enter probe\n");
|
||||
|
||||
/* Not sure if this is our device. Allocate here to avoid
|
||||
* calling alloc while holding busid_table lock.
|
||||
*/
|
||||
sdev = stub_device_alloc(udev);
|
||||
if (!sdev)
|
||||
return -ENOMEM;
|
||||
|
||||
/* check we should claim or not by busid_table */
|
||||
busid_priv = get_busid_priv(udev_busid);
|
||||
if (!busid_priv || (busid_priv->status == STUB_BUSID_REMOV) ||
|
||||
@ -332,6 +340,9 @@ static int stub_probe(struct usb_device *udev)
|
||||
* See driver_probe_device() in driver/base/dd.c
|
||||
*/
|
||||
rc = -ENODEV;
|
||||
if (!busid_priv)
|
||||
goto sdev_free;
|
||||
|
||||
goto call_put_busid_priv;
|
||||
}
|
||||
|
||||
@ -351,12 +362,6 @@ static int stub_probe(struct usb_device *udev)
|
||||
goto call_put_busid_priv;
|
||||
}
|
||||
|
||||
/* ok, this is my device */
|
||||
sdev = stub_device_alloc(udev);
|
||||
if (!sdev) {
|
||||
rc = -ENOMEM;
|
||||
goto call_put_busid_priv;
|
||||
}
|
||||
|
||||
dev_info(&udev->dev,
|
||||
"usbip-host: register new device (bus %u dev %u)\n",
|
||||
@ -366,9 +371,16 @@ static int stub_probe(struct usb_device *udev)
|
||||
|
||||
/* set private data to usb_device */
|
||||
dev_set_drvdata(&udev->dev, sdev);
|
||||
|
||||
busid_priv->sdev = sdev;
|
||||
busid_priv->udev = udev;
|
||||
|
||||
save_status = busid_priv->status;
|
||||
busid_priv->status = STUB_BUSID_ALLOC;
|
||||
|
||||
/* release the busid_lock */
|
||||
put_busid_priv(busid_priv);
|
||||
|
||||
/*
|
||||
* Claim this hub port.
|
||||
* It doesn't matter what value we pass as owner
|
||||
@ -386,10 +398,8 @@ static int stub_probe(struct usb_device *udev)
|
||||
dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid);
|
||||
goto err_files;
|
||||
}
|
||||
busid_priv->status = STUB_BUSID_ALLOC;
|
||||
|
||||
rc = 0;
|
||||
goto call_put_busid_priv;
|
||||
return 0;
|
||||
|
||||
err_files:
|
||||
usb_hub_release_port(udev->parent, udev->portnum,
|
||||
@ -398,23 +408,30 @@ err_port:
|
||||
dev_set_drvdata(&udev->dev, NULL);
|
||||
usb_put_dev(udev);
|
||||
|
||||
/* we already have busid_priv, just lock busid_lock */
|
||||
spin_lock(&busid_priv->busid_lock);
|
||||
busid_priv->sdev = NULL;
|
||||
stub_device_free(sdev);
|
||||
busid_priv->status = save_status;
|
||||
spin_unlock(&busid_priv->busid_lock);
|
||||
/* lock is released - go to free */
|
||||
goto sdev_free;
|
||||
|
||||
call_put_busid_priv:
|
||||
/* release the busid_lock */
|
||||
put_busid_priv(busid_priv);
|
||||
|
||||
sdev_free:
|
||||
stub_device_free(sdev);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void shutdown_busid(struct bus_id_priv *busid_priv)
|
||||
{
|
||||
if (busid_priv->sdev && !busid_priv->shutdown_busid) {
|
||||
busid_priv->shutdown_busid = 1;
|
||||
usbip_event_add(&busid_priv->sdev->ud, SDEV_EVENT_REMOVED);
|
||||
usbip_event_add(&busid_priv->sdev->ud, SDEV_EVENT_REMOVED);
|
||||
|
||||
/* wait for the stop of the event handler */
|
||||
usbip_stop_eh(&busid_priv->sdev->ud);
|
||||
}
|
||||
/* wait for the stop of the event handler */
|
||||
usbip_stop_eh(&busid_priv->sdev->ud);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -441,11 +458,16 @@ static void stub_disconnect(struct usb_device *udev)
|
||||
/* get stub_device */
|
||||
if (!sdev) {
|
||||
dev_err(&udev->dev, "could not get device");
|
||||
goto call_put_busid_priv;
|
||||
/* release busid_lock */
|
||||
put_busid_priv(busid_priv);
|
||||
return;
|
||||
}
|
||||
|
||||
dev_set_drvdata(&udev->dev, NULL);
|
||||
|
||||
/* release busid_lock before call to remove device files */
|
||||
put_busid_priv(busid_priv);
|
||||
|
||||
/*
|
||||
* NOTE: rx/tx threads are invoked for each usb_device.
|
||||
*/
|
||||
@ -456,27 +478,36 @@ static void stub_disconnect(struct usb_device *udev)
|
||||
(struct usb_dev_state *) udev);
|
||||
if (rc) {
|
||||
dev_dbg(&udev->dev, "unable to release port\n");
|
||||
goto call_put_busid_priv;
|
||||
return;
|
||||
}
|
||||
|
||||
/* If usb reset is called from event handler */
|
||||
if (usbip_in_eh(current))
|
||||
goto call_put_busid_priv;
|
||||
return;
|
||||
|
||||
/* we already have busid_priv, just lock busid_lock */
|
||||
spin_lock(&busid_priv->busid_lock);
|
||||
if (!busid_priv->shutdown_busid)
|
||||
busid_priv->shutdown_busid = 1;
|
||||
/* release busid_lock */
|
||||
spin_unlock(&busid_priv->busid_lock);
|
||||
|
||||
/* shutdown the current connection */
|
||||
shutdown_busid(busid_priv);
|
||||
|
||||
usb_put_dev(sdev->udev);
|
||||
|
||||
/* we already have busid_priv, just lock busid_lock */
|
||||
spin_lock(&busid_priv->busid_lock);
|
||||
/* free sdev */
|
||||
busid_priv->sdev = NULL;
|
||||
stub_device_free(sdev);
|
||||
|
||||
if (busid_priv->status == STUB_BUSID_ALLOC)
|
||||
busid_priv->status = STUB_BUSID_ADDED;
|
||||
|
||||
call_put_busid_priv:
|
||||
put_busid_priv(busid_priv);
|
||||
/* release busid_lock */
|
||||
spin_unlock(&busid_priv->busid_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -127,8 +127,6 @@ void xen_pcibk_reset_device(struct pci_dev *dev)
|
||||
if (pci_is_enabled(dev))
|
||||
pci_disable_device(dev);
|
||||
|
||||
pci_write_config_word(dev, PCI_COMMAND, 0);
|
||||
|
||||
dev->is_busmaster = 0;
|
||||
} else {
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
|
@ -6580,8 +6580,18 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
|
||||
btrfs_i_size_write(parent_inode, parent_inode->vfs_inode.i_size +
|
||||
name_len * 2);
|
||||
inode_inc_iversion(&parent_inode->vfs_inode);
|
||||
parent_inode->vfs_inode.i_mtime = parent_inode->vfs_inode.i_ctime =
|
||||
current_time(&parent_inode->vfs_inode);
|
||||
/*
|
||||
* If we are replaying a log tree, we do not want to update the mtime
|
||||
* and ctime of the parent directory with the current time, since the
|
||||
* log replay procedure is responsible for setting them to their correct
|
||||
* values (the ones it had when the fsync was done).
|
||||
*/
|
||||
if (!test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags)) {
|
||||
struct timespec now = current_time(&parent_inode->vfs_inode);
|
||||
|
||||
parent_inode->vfs_inode.i_mtime = now;
|
||||
parent_inode->vfs_inode.i_ctime = now;
|
||||
}
|
||||
ret = btrfs_update_inode(trans, root, &parent_inode->vfs_inode);
|
||||
if (ret)
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
|
@ -5013,6 +5013,12 @@ static int send_hole(struct send_ctx *sctx, u64 end)
|
||||
u64 len;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* Don't go beyond the inode's i_size due to prealloc extents that start
|
||||
* after the i_size.
|
||||
*/
|
||||
end = min_t(u64, end, sctx->cur_inode_size);
|
||||
|
||||
if (sctx->flags & BTRFS_SEND_FLAG_NO_FILE_DATA)
|
||||
return send_update_extent(sctx, offset, end - offset);
|
||||
|
||||
|
@ -2906,6 +2906,12 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
||||
root->log_transid++;
|
||||
log->log_transid = root->log_transid;
|
||||
root->log_start_pid = 0;
|
||||
/*
|
||||
* Update or create log root item under the root's log_mutex to prevent
|
||||
* races with concurrent log syncs that can lead to failure to update
|
||||
* log root item because it was not created yet.
|
||||
*/
|
||||
ret = update_log_root(trans, log);
|
||||
/*
|
||||
* IO has been started, blocks of the log tree have WRITTEN flag set
|
||||
* in their headers. new modifications of the log will be written to
|
||||
@ -2925,8 +2931,6 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
||||
|
||||
mutex_unlock(&log_root_tree->log_mutex);
|
||||
|
||||
ret = update_log_root(trans, log);
|
||||
|
||||
mutex_lock(&log_root_tree->log_mutex);
|
||||
if (atomic_dec_and_test(&log_root_tree->log_writers)) {
|
||||
/*
|
||||
@ -5328,7 +5332,6 @@ static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans,
|
||||
{
|
||||
int ret = 0;
|
||||
struct dentry *old_parent = NULL;
|
||||
struct btrfs_inode *orig_inode = inode;
|
||||
|
||||
/*
|
||||
* for regular files, if its inode is already on disk, we don't
|
||||
@ -5348,16 +5351,6 @@ static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans,
|
||||
}
|
||||
|
||||
while (1) {
|
||||
/*
|
||||
* If we are logging a directory then we start with our inode,
|
||||
* not our parent's inode, so we need to skip setting the
|
||||
* logged_trans so that further down in the log code we don't
|
||||
* think this inode has already been logged.
|
||||
*/
|
||||
if (inode != orig_inode)
|
||||
inode->logged_trans = trans->transid;
|
||||
smp_mb();
|
||||
|
||||
if (btrfs_must_commit_transaction(trans, inode)) {
|
||||
ret = 1;
|
||||
break;
|
||||
@ -6087,7 +6080,6 @@ void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans,
|
||||
* if this directory was already logged any new
|
||||
* names for this file/dir will get recorded
|
||||
*/
|
||||
smp_mb();
|
||||
if (dir->logged_trans == trans->transid)
|
||||
return;
|
||||
|
||||
|
@ -2984,7 +2984,9 @@ cifs_read_allocate_pages(struct cifs_readdata *rdata, unsigned int nr_pages)
|
||||
}
|
||||
|
||||
if (rc) {
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
unsigned int nr_page_failed = i;
|
||||
|
||||
for (i = 0; i < nr_page_failed; i++) {
|
||||
put_page(rdata->pages[i]);
|
||||
rdata->pages[i] = NULL;
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ nlm_decode_lock(__be32 *p, struct nlm_lock *lock)
|
||||
|
||||
locks_init_lock(fl);
|
||||
fl->fl_owner = current->files;
|
||||
fl->fl_pid = current->tgid;
|
||||
fl->fl_pid = (pid_t)lock->svid;
|
||||
fl->fl_flags = FL_POSIX;
|
||||
fl->fl_type = F_RDLCK; /* as good as anything else */
|
||||
start = ntohl(*p++);
|
||||
@ -269,7 +269,7 @@ nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
|
||||
memset(lock, 0, sizeof(*lock));
|
||||
locks_init_lock(&lock->fl);
|
||||
lock->svid = ~(u32) 0;
|
||||
lock->fl.fl_pid = current->tgid;
|
||||
lock->fl.fl_pid = (pid_t)lock->svid;
|
||||
|
||||
if (!(p = nlm_decode_cookie(p, &argp->cookie))
|
||||
|| !(p = xdr_decode_string_inplace(p, &lock->caller,
|
||||
|
@ -119,7 +119,7 @@ nlm4_decode_lock(__be32 *p, struct nlm_lock *lock)
|
||||
|
||||
locks_init_lock(fl);
|
||||
fl->fl_owner = current->files;
|
||||
fl->fl_pid = current->tgid;
|
||||
fl->fl_pid = (pid_t)lock->svid;
|
||||
fl->fl_flags = FL_POSIX;
|
||||
fl->fl_type = F_RDLCK; /* as good as anything else */
|
||||
p = xdr_decode_hyper(p, &start);
|
||||
@ -266,7 +266,7 @@ nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
|
||||
memset(lock, 0, sizeof(*lock));
|
||||
locks_init_lock(&lock->fl);
|
||||
lock->svid = ~(u32) 0;
|
||||
lock->fl.fl_pid = current->tgid;
|
||||
lock->fl.fl_pid = (pid_t)lock->svid;
|
||||
|
||||
if (!(p = nlm4_decode_cookie(p, &argp->cookie))
|
||||
|| !(p = xdr_decode_string_inplace(p, &lock->caller,
|
||||
|
@ -59,7 +59,7 @@ static __always_inline unsigned long hweight_long(unsigned long w)
|
||||
*/
|
||||
static inline __u64 rol64(__u64 word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> (64 - shift));
|
||||
return (word << (shift & 63)) | (word >> ((-shift) & 63));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -69,7 +69,7 @@ static inline __u64 rol64(__u64 word, unsigned int shift)
|
||||
*/
|
||||
static inline __u64 ror64(__u64 word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (64 - shift));
|
||||
return (word >> (shift & 63)) | (word << ((-shift) & 63));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -79,7 +79,7 @@ static inline __u64 ror64(__u64 word, unsigned int shift)
|
||||
*/
|
||||
static inline __u32 rol32(__u32 word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> ((-shift) & 31));
|
||||
return (word << (shift & 31)) | (word >> ((-shift) & 31));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -89,7 +89,7 @@ static inline __u32 rol32(__u32 word, unsigned int shift)
|
||||
*/
|
||||
static inline __u32 ror32(__u32 word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (32 - shift));
|
||||
return (word >> (shift & 31)) | (word << ((-shift) & 31));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -99,7 +99,7 @@ static inline __u32 ror32(__u32 word, unsigned int shift)
|
||||
*/
|
||||
static inline __u16 rol16(__u16 word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> (16 - shift));
|
||||
return (word << (shift & 15)) | (word >> ((-shift) & 15));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -109,7 +109,7 @@ static inline __u16 rol16(__u16 word, unsigned int shift)
|
||||
*/
|
||||
static inline __u16 ror16(__u16 word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (16 - shift));
|
||||
return (word >> (shift & 15)) | (word << ((-shift) & 15));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -119,7 +119,7 @@ static inline __u16 ror16(__u16 word, unsigned int shift)
|
||||
*/
|
||||
static inline __u8 rol8(__u8 word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> (8 - shift));
|
||||
return (word << (shift & 7)) | (word >> ((-shift) & 7));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -129,7 +129,7 @@ static inline __u8 rol8(__u8 word, unsigned int shift)
|
||||
*/
|
||||
static inline __u8 ror8(__u8 word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (8 - shift));
|
||||
return (word >> (shift & 7)) | (word << ((-shift) & 7));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -343,6 +343,10 @@
|
||||
#define __designated_init __attribute__((designated_init))
|
||||
#endif
|
||||
|
||||
#if GCC_VERSION >= 90100
|
||||
#define __copy(symbol) __attribute__((__copy__(symbol)))
|
||||
#endif
|
||||
|
||||
#endif /* gcc version >= 40000 specific checks */
|
||||
|
||||
#if !defined(__noclone)
|
||||
|
@ -230,6 +230,10 @@ struct ftrace_likely_data {
|
||||
# define __latent_entropy
|
||||
#endif
|
||||
|
||||
#ifndef __copy
|
||||
# define __copy(symbol)
|
||||
#endif
|
||||
|
||||
#ifndef __randomize_layout
|
||||
# define __randomize_layout __designated_init
|
||||
#endif
|
||||
|
@ -52,6 +52,7 @@ struct list_lru {
|
||||
struct list_lru_node *node;
|
||||
#if defined(CONFIG_MEMCG) && !defined(CONFIG_SLOB)
|
||||
struct list_head list;
|
||||
bool memcg_aware;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -129,13 +129,13 @@ extern void cleanup_module(void);
|
||||
#define module_init(initfn) \
|
||||
static inline initcall_t __maybe_unused __inittest(void) \
|
||||
{ return initfn; } \
|
||||
int init_module(void) __attribute__((alias(#initfn)));
|
||||
int init_module(void) __copy(initfn) __attribute__((alias(#initfn)));
|
||||
|
||||
/* This is only required if you want to be unloadable. */
|
||||
#define module_exit(exitfn) \
|
||||
static inline exitcall_t __maybe_unused __exittest(void) \
|
||||
{ return exitfn; } \
|
||||
void cleanup_module(void) __attribute__((alias(#exitfn)));
|
||||
void cleanup_module(void) __copy(exitfn) __attribute__((alias(#exitfn)));
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -21,6 +21,11 @@ typedef struct {
|
||||
u64 key[2];
|
||||
} siphash_key_t;
|
||||
|
||||
static inline bool siphash_key_is_zero(const siphash_key_t *key)
|
||||
{
|
||||
return !(key->key[0] | key->key[1]);
|
||||
}
|
||||
|
||||
u64 __siphash_aligned(const void *data, size_t len, const siphash_key_t *key);
|
||||
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
u64 __siphash_unaligned(const void *data, size_t len, const siphash_key_t *key);
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <linux/uidgid.h>
|
||||
#include <net/inet_frag.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/siphash.h>
|
||||
|
||||
struct tcpm_hash_bucket;
|
||||
struct ctl_table_header;
|
||||
@ -164,5 +165,6 @@ struct netns_ipv4 {
|
||||
unsigned int fib_seq; /* protected by rtnl_mutex */
|
||||
|
||||
atomic_t rt_genid;
|
||||
siphash_key_t ip_id_key;
|
||||
};
|
||||
#endif
|
||||
|
@ -302,8 +302,10 @@ static inline int TLV_SET(void *tlv, __u16 type, void *data, __u16 len)
|
||||
tlv_ptr = (struct tlv_desc *)tlv;
|
||||
tlv_ptr->tlv_type = htons(type);
|
||||
tlv_ptr->tlv_len = htons(tlv_len);
|
||||
if (len && data)
|
||||
memcpy(TLV_DATA(tlv_ptr), data, tlv_len);
|
||||
if (len && data) {
|
||||
memcpy(TLV_DATA(tlv_ptr), data, len);
|
||||
memset(TLV_DATA(tlv_ptr) + len, 0, TLV_SPACE(len) - tlv_len);
|
||||
}
|
||||
return TLV_SPACE(len);
|
||||
}
|
||||
|
||||
@ -400,8 +402,10 @@ static inline int TCM_SET(void *msg, __u16 cmd, __u16 flags,
|
||||
tcm_hdr->tcm_len = htonl(msg_len);
|
||||
tcm_hdr->tcm_type = htons(cmd);
|
||||
tcm_hdr->tcm_flags = htons(flags);
|
||||
if (data_len && data)
|
||||
if (data_len && data) {
|
||||
memcpy(TCM_DATA(msg), data, data_len);
|
||||
memset(TCM_DATA(msg) + data_len, 0, TCM_SPACE(data_len) - msg_len);
|
||||
}
|
||||
return TCM_SPACE(data_len);
|
||||
}
|
||||
|
||||
|
@ -2271,6 +2271,8 @@ relock:
|
||||
if (signal_group_exit(signal)) {
|
||||
ksig->info.si_signo = signr = SIGKILL;
|
||||
sigdelset(¤t->pending.signal, SIGKILL);
|
||||
trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
|
||||
&sighand->action[SIGKILL - 1]);
|
||||
recalc_sigpending();
|
||||
goto fatal;
|
||||
}
|
||||
|
@ -42,11 +42,7 @@ static void list_lru_unregister(struct list_lru *lru)
|
||||
#if defined(CONFIG_MEMCG) && !defined(CONFIG_SLOB)
|
||||
static inline bool list_lru_memcg_aware(struct list_lru *lru)
|
||||
{
|
||||
/*
|
||||
* This needs node 0 to be always present, even
|
||||
* in the systems supporting sparse numa ids.
|
||||
*/
|
||||
return !!lru->node[0].memcg_lrus;
|
||||
return lru->memcg_aware;
|
||||
}
|
||||
|
||||
static inline struct list_lru_one *
|
||||
@ -389,6 +385,8 @@ static int memcg_init_list_lru(struct list_lru *lru, bool memcg_aware)
|
||||
{
|
||||
int i;
|
||||
|
||||
lru->memcg_aware = memcg_aware;
|
||||
|
||||
if (!memcg_aware)
|
||||
return 0;
|
||||
|
||||
|
@ -5067,7 +5067,6 @@ static struct sk_buff *napi_frags_skb(struct napi_struct *napi)
|
||||
skb_reset_mac_header(skb);
|
||||
skb_gro_reset_offset(skb);
|
||||
|
||||
eth = skb_gro_header_fast(skb, 0);
|
||||
if (unlikely(skb_gro_header_hard(skb, hlen))) {
|
||||
eth = skb_gro_header_slow(skb, hlen, 0);
|
||||
if (unlikely(!eth)) {
|
||||
@ -5077,6 +5076,7 @@ static struct sk_buff *napi_frags_skb(struct napi_struct *napi)
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
eth = (const struct ethhdr *)skb->data;
|
||||
gro_pull_from_frag0(skb, hlen);
|
||||
NAPI_GRO_CB(skb)->frag0 += hlen;
|
||||
NAPI_GRO_CB(skb)->frag0_len -= hlen;
|
||||
|
@ -190,6 +190,17 @@ static void ip_ma_put(struct ip_mc_list *im)
|
||||
pmc != NULL; \
|
||||
pmc = rtnl_dereference(pmc->next_rcu))
|
||||
|
||||
static void ip_sf_list_clear_all(struct ip_sf_list *psf)
|
||||
{
|
||||
struct ip_sf_list *next;
|
||||
|
||||
while (psf) {
|
||||
next = psf->sf_next;
|
||||
kfree(psf);
|
||||
psf = next;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IP_MULTICAST
|
||||
|
||||
/*
|
||||
@ -635,6 +646,13 @@ static void igmpv3_clear_zeros(struct ip_sf_list **ppsf)
|
||||
}
|
||||
}
|
||||
|
||||
static void kfree_pmc(struct ip_mc_list *pmc)
|
||||
{
|
||||
ip_sf_list_clear_all(pmc->sources);
|
||||
ip_sf_list_clear_all(pmc->tomb);
|
||||
kfree(pmc);
|
||||
}
|
||||
|
||||
static void igmpv3_send_cr(struct in_device *in_dev)
|
||||
{
|
||||
struct ip_mc_list *pmc, *pmc_prev, *pmc_next;
|
||||
@ -671,7 +689,7 @@ static void igmpv3_send_cr(struct in_device *in_dev)
|
||||
else
|
||||
in_dev->mc_tomb = pmc_next;
|
||||
in_dev_put(pmc->interface);
|
||||
kfree(pmc);
|
||||
kfree_pmc(pmc);
|
||||
} else
|
||||
pmc_prev = pmc;
|
||||
}
|
||||
@ -1203,12 +1221,16 @@ static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im)
|
||||
im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
|
||||
if (im->sfmode == MCAST_INCLUDE) {
|
||||
im->tomb = pmc->tomb;
|
||||
pmc->tomb = NULL;
|
||||
|
||||
im->sources = pmc->sources;
|
||||
pmc->sources = NULL;
|
||||
|
||||
for (psf = im->sources; psf; psf = psf->sf_next)
|
||||
psf->sf_crcount = im->crcount;
|
||||
}
|
||||
in_dev_put(pmc->interface);
|
||||
kfree(pmc);
|
||||
kfree_pmc(pmc);
|
||||
}
|
||||
spin_unlock_bh(&im->lock);
|
||||
}
|
||||
@ -1229,21 +1251,18 @@ static void igmpv3_clear_delrec(struct in_device *in_dev)
|
||||
nextpmc = pmc->next;
|
||||
ip_mc_clear_src(pmc);
|
||||
in_dev_put(pmc->interface);
|
||||
kfree(pmc);
|
||||
kfree_pmc(pmc);
|
||||
}
|
||||
/* clear dead sources, too */
|
||||
rcu_read_lock();
|
||||
for_each_pmc_rcu(in_dev, pmc) {
|
||||
struct ip_sf_list *psf, *psf_next;
|
||||
struct ip_sf_list *psf;
|
||||
|
||||
spin_lock_bh(&pmc->lock);
|
||||
psf = pmc->tomb;
|
||||
pmc->tomb = NULL;
|
||||
spin_unlock_bh(&pmc->lock);
|
||||
for (; psf; psf = psf_next) {
|
||||
psf_next = psf->sf_next;
|
||||
kfree(psf);
|
||||
}
|
||||
ip_sf_list_clear_all(psf);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
@ -2107,7 +2126,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
|
||||
|
||||
static void ip_mc_clear_src(struct ip_mc_list *pmc)
|
||||
{
|
||||
struct ip_sf_list *psf, *nextpsf, *tomb, *sources;
|
||||
struct ip_sf_list *tomb, *sources;
|
||||
|
||||
spin_lock_bh(&pmc->lock);
|
||||
tomb = pmc->tomb;
|
||||
@ -2119,14 +2138,8 @@ static void ip_mc_clear_src(struct ip_mc_list *pmc)
|
||||
pmc->sfcount[MCAST_EXCLUDE] = 1;
|
||||
spin_unlock_bh(&pmc->lock);
|
||||
|
||||
for (psf = tomb; psf; psf = nextpsf) {
|
||||
nextpsf = psf->sf_next;
|
||||
kfree(psf);
|
||||
}
|
||||
for (psf = sources; psf; psf = nextpsf) {
|
||||
nextpsf = psf->sf_next;
|
||||
kfree(psf);
|
||||
}
|
||||
ip_sf_list_clear_all(tomb);
|
||||
ip_sf_list_clear_all(sources);
|
||||
}
|
||||
|
||||
/* Join a multicast group
|
||||
|
@ -517,15 +517,17 @@ EXPORT_SYMBOL(ip_idents_reserve);
|
||||
|
||||
void __ip_select_ident(struct net *net, struct iphdr *iph, int segs)
|
||||
{
|
||||
static u32 ip_idents_hashrnd __read_mostly;
|
||||
u32 hash, id;
|
||||
|
||||
net_get_random_once(&ip_idents_hashrnd, sizeof(ip_idents_hashrnd));
|
||||
/* Note the following code is not safe, but this is okay. */
|
||||
if (unlikely(siphash_key_is_zero(&net->ipv4.ip_id_key)))
|
||||
get_random_bytes(&net->ipv4.ip_id_key,
|
||||
sizeof(net->ipv4.ip_id_key));
|
||||
|
||||
hash = jhash_3words((__force u32)iph->daddr,
|
||||
hash = siphash_3u32((__force u32)iph->daddr,
|
||||
(__force u32)iph->saddr,
|
||||
iph->protocol ^ net_hash_mix(net),
|
||||
ip_idents_hashrnd);
|
||||
iph->protocol,
|
||||
&net->ipv4.ip_id_key);
|
||||
id = ip_idents_reserve(hash, segs);
|
||||
iph->id = htons(id);
|
||||
}
|
||||
|
@ -10,15 +10,25 @@
|
||||
#include <net/secure_seq.h>
|
||||
#include <linux/netfilter.h>
|
||||
|
||||
static u32 __ipv6_select_ident(struct net *net, u32 hashrnd,
|
||||
static u32 __ipv6_select_ident(struct net *net,
|
||||
const struct in6_addr *dst,
|
||||
const struct in6_addr *src)
|
||||
{
|
||||
const struct {
|
||||
struct in6_addr dst;
|
||||
struct in6_addr src;
|
||||
} __aligned(SIPHASH_ALIGNMENT) combined = {
|
||||
.dst = *dst,
|
||||
.src = *src,
|
||||
};
|
||||
u32 hash, id;
|
||||
|
||||
hash = __ipv6_addr_jhash(dst, hashrnd);
|
||||
hash = __ipv6_addr_jhash(src, hash);
|
||||
hash ^= net_hash_mix(net);
|
||||
/* Note the following code is not safe, but this is okay. */
|
||||
if (unlikely(siphash_key_is_zero(&net->ipv4.ip_id_key)))
|
||||
get_random_bytes(&net->ipv4.ip_id_key,
|
||||
sizeof(net->ipv4.ip_id_key));
|
||||
|
||||
hash = siphash(&combined, sizeof(combined), &net->ipv4.ip_id_key);
|
||||
|
||||
/* Treat id of 0 as unset and if we get 0 back from ip_idents_reserve,
|
||||
* set the hight order instead thus minimizing possible future
|
||||
@ -41,7 +51,6 @@ static u32 __ipv6_select_ident(struct net *net, u32 hashrnd,
|
||||
*/
|
||||
__be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb)
|
||||
{
|
||||
static u32 ip6_proxy_idents_hashrnd __read_mostly;
|
||||
struct in6_addr buf[2];
|
||||
struct in6_addr *addrs;
|
||||
u32 id;
|
||||
@ -53,11 +62,7 @@ __be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb)
|
||||
if (!addrs)
|
||||
return 0;
|
||||
|
||||
net_get_random_once(&ip6_proxy_idents_hashrnd,
|
||||
sizeof(ip6_proxy_idents_hashrnd));
|
||||
|
||||
id = __ipv6_select_ident(net, ip6_proxy_idents_hashrnd,
|
||||
&addrs[1], &addrs[0]);
|
||||
id = __ipv6_select_ident(net, &addrs[1], &addrs[0]);
|
||||
return htonl(id);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident);
|
||||
@ -66,12 +71,9 @@ __be32 ipv6_select_ident(struct net *net,
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr)
|
||||
{
|
||||
static u32 ip6_idents_hashrnd __read_mostly;
|
||||
u32 id;
|
||||
|
||||
net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd));
|
||||
|
||||
id = __ipv6_select_ident(net, ip6_idents_hashrnd, daddr, saddr);
|
||||
id = __ipv6_select_ident(net, daddr, saddr);
|
||||
return htonl(id);
|
||||
}
|
||||
EXPORT_SYMBOL(ipv6_select_ident);
|
||||
|
@ -288,7 +288,9 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
||||
/* Binding to link-local address requires an interface */
|
||||
if (!sk->sk_bound_dev_if)
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (sk->sk_bound_dev_if) {
|
||||
err = -ENODEV;
|
||||
dev = dev_get_by_index_rcu(sock_net(sk),
|
||||
sk->sk_bound_dev_if);
|
||||
|
@ -72,6 +72,8 @@ int llc_build_and_send_ui_pkt(struct llc_sap *sap, struct sk_buff *skb,
|
||||
rc = llc_mac_hdr_init(skb, skb->dev->dev_addr, dmac);
|
||||
if (likely(!rc))
|
||||
rc = dev_queue_xmit(skb);
|
||||
else
|
||||
kfree_skb(skb);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -62,10 +62,6 @@ static int __net_init tipc_init_net(struct net *net)
|
||||
INIT_LIST_HEAD(&tn->node_list);
|
||||
spin_lock_init(&tn->node_list_lock);
|
||||
|
||||
err = tipc_socket_init();
|
||||
if (err)
|
||||
goto out_socket;
|
||||
|
||||
err = tipc_sk_rht_init(net);
|
||||
if (err)
|
||||
goto out_sk_rht;
|
||||
@ -75,9 +71,6 @@ static int __net_init tipc_init_net(struct net *net)
|
||||
goto out_nametbl;
|
||||
|
||||
INIT_LIST_HEAD(&tn->dist_queue);
|
||||
err = tipc_topsrv_start(net);
|
||||
if (err)
|
||||
goto out_subscr;
|
||||
|
||||
err = tipc_bcast_init(net);
|
||||
if (err)
|
||||
@ -86,25 +79,19 @@ static int __net_init tipc_init_net(struct net *net)
|
||||
return 0;
|
||||
|
||||
out_bclink:
|
||||
tipc_bcast_stop(net);
|
||||
out_subscr:
|
||||
tipc_nametbl_stop(net);
|
||||
out_nametbl:
|
||||
tipc_sk_rht_destroy(net);
|
||||
out_sk_rht:
|
||||
tipc_socket_stop();
|
||||
out_socket:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __net_exit tipc_exit_net(struct net *net)
|
||||
{
|
||||
tipc_topsrv_stop(net);
|
||||
tipc_net_stop(net);
|
||||
tipc_bcast_stop(net);
|
||||
tipc_nametbl_stop(net);
|
||||
tipc_sk_rht_destroy(net);
|
||||
tipc_socket_stop();
|
||||
}
|
||||
|
||||
static struct pernet_operations tipc_net_ops = {
|
||||
@ -114,6 +101,11 @@ static struct pernet_operations tipc_net_ops = {
|
||||
.size = sizeof(struct tipc_net),
|
||||
};
|
||||
|
||||
static struct pernet_operations tipc_topsrv_net_ops = {
|
||||
.init = tipc_topsrv_init_net,
|
||||
.exit = tipc_topsrv_exit_net,
|
||||
};
|
||||
|
||||
static int __init tipc_init(void)
|
||||
{
|
||||
int err;
|
||||
@ -140,6 +132,14 @@ static int __init tipc_init(void)
|
||||
if (err)
|
||||
goto out_pernet;
|
||||
|
||||
err = tipc_socket_init();
|
||||
if (err)
|
||||
goto out_socket;
|
||||
|
||||
err = register_pernet_subsys(&tipc_topsrv_net_ops);
|
||||
if (err)
|
||||
goto out_pernet_topsrv;
|
||||
|
||||
err = tipc_bearer_setup();
|
||||
if (err)
|
||||
goto out_bearer;
|
||||
@ -147,6 +147,10 @@ static int __init tipc_init(void)
|
||||
pr_info("Started in single node mode\n");
|
||||
return 0;
|
||||
out_bearer:
|
||||
unregister_pernet_subsys(&tipc_topsrv_net_ops);
|
||||
out_pernet_topsrv:
|
||||
tipc_socket_stop();
|
||||
out_socket:
|
||||
unregister_pernet_subsys(&tipc_net_ops);
|
||||
out_pernet:
|
||||
tipc_unregister_sysctl();
|
||||
@ -162,6 +166,8 @@ out_netlink:
|
||||
static void __exit tipc_exit(void)
|
||||
{
|
||||
tipc_bearer_cleanup();
|
||||
unregister_pernet_subsys(&tipc_topsrv_net_ops);
|
||||
tipc_socket_stop();
|
||||
unregister_pernet_subsys(&tipc_net_ops);
|
||||
tipc_netlink_stop();
|
||||
tipc_netlink_compat_stop();
|
||||
|
@ -344,7 +344,7 @@ static void *tipc_subscrb_connect_cb(int conid)
|
||||
return (void *)tipc_subscrb_create(conid);
|
||||
}
|
||||
|
||||
int tipc_topsrv_start(struct net *net)
|
||||
static int tipc_topsrv_start(struct net *net)
|
||||
{
|
||||
struct tipc_net *tn = net_generic(net, tipc_net_id);
|
||||
const char name[] = "topology_server";
|
||||
@ -382,7 +382,7 @@ int tipc_topsrv_start(struct net *net)
|
||||
return tipc_server_start(topsrv);
|
||||
}
|
||||
|
||||
void tipc_topsrv_stop(struct net *net)
|
||||
static void tipc_topsrv_stop(struct net *net)
|
||||
{
|
||||
struct tipc_net *tn = net_generic(net, tipc_net_id);
|
||||
struct tipc_server *topsrv = tn->topsrv;
|
||||
@ -391,3 +391,13 @@ void tipc_topsrv_stop(struct net *net)
|
||||
kfree(topsrv->saddr);
|
||||
kfree(topsrv);
|
||||
}
|
||||
|
||||
int __net_init tipc_topsrv_init_net(struct net *net)
|
||||
{
|
||||
return tipc_topsrv_start(net);
|
||||
}
|
||||
|
||||
void __net_exit tipc_topsrv_exit_net(struct net *net)
|
||||
{
|
||||
tipc_topsrv_stop(net);
|
||||
}
|
||||
|
@ -75,8 +75,9 @@ void tipc_subscrp_report_overlap(struct tipc_subscription *sub,
|
||||
void tipc_subscrp_convert_seq(struct tipc_name_seq *in, int swap,
|
||||
struct tipc_name_seq *out);
|
||||
u32 tipc_subscrp_convert_seq_type(u32 type, int swap);
|
||||
int tipc_topsrv_start(struct net *net);
|
||||
void tipc_topsrv_stop(struct net *net);
|
||||
|
||||
int __net_init tipc_topsrv_init_net(struct net *net);
|
||||
void __net_exit tipc_topsrv_exit_net(struct net *net);
|
||||
|
||||
void tipc_subscrp_put(struct tipc_subscription *subscription);
|
||||
void tipc_subscrp_get(struct tipc_subscription *subscription);
|
||||
|
@ -150,8 +150,12 @@ void print_gimple_expr(FILE *, gimple, int, int);
|
||||
void dump_gimple_stmt(pretty_printer *, gimple, int, int);
|
||||
#endif
|
||||
|
||||
#ifndef __unused
|
||||
#define __unused __attribute__((__unused__))
|
||||
#endif
|
||||
#ifndef __visible
|
||||
#define __visible __attribute__((visibility("default")))
|
||||
#endif
|
||||
|
||||
#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
|
||||
#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
|
||||
|
@ -964,10 +964,10 @@ enum {
|
||||
};
|
||||
|
||||
static const char *const mask_tokens[] = {
|
||||
"MAY_EXEC",
|
||||
"MAY_WRITE",
|
||||
"MAY_READ",
|
||||
"MAY_APPEND"
|
||||
"^MAY_EXEC",
|
||||
"^MAY_WRITE",
|
||||
"^MAY_READ",
|
||||
"^MAY_APPEND"
|
||||
};
|
||||
|
||||
#define __ima_hook_stringify(str) (#str),
|
||||
@ -1027,6 +1027,7 @@ int ima_policy_show(struct seq_file *m, void *v)
|
||||
struct ima_rule_entry *entry = v;
|
||||
int i;
|
||||
char tbuf[64] = {0,};
|
||||
int offset = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
@ -1046,15 +1047,17 @@ int ima_policy_show(struct seq_file *m, void *v)
|
||||
if (entry->flags & IMA_FUNC)
|
||||
policy_func_show(m, entry->func);
|
||||
|
||||
if (entry->flags & IMA_MASK) {
|
||||
if ((entry->flags & IMA_MASK) || (entry->flags & IMA_INMASK)) {
|
||||
if (entry->flags & IMA_MASK)
|
||||
offset = 1;
|
||||
if (entry->mask & MAY_EXEC)
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_exec));
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_exec) + offset);
|
||||
if (entry->mask & MAY_WRITE)
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_write));
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_write) + offset);
|
||||
if (entry->mask & MAY_READ)
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_read));
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_read) + offset);
|
||||
if (entry->mask & MAY_APPEND)
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_append));
|
||||
seq_printf(m, pt(Opt_mask), mt(mask_append) + offset);
|
||||
seq_puts(m, " ");
|
||||
}
|
||||
|
||||
|
@ -7078,7 +7078,7 @@ static int patch_alc269(struct hda_codec *codec)
|
||||
|
||||
spec = codec->spec;
|
||||
spec->gen.shared_mic_vref_pin = 0x18;
|
||||
codec->power_save_node = 1;
|
||||
codec->power_save_node = 0;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
codec->patch_ops.suspend = alc269_suspend;
|
||||
|
@ -217,6 +217,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||
case KVM_CAP_MAX_VCPUS:
|
||||
r = KVM_MAX_VCPUS;
|
||||
break;
|
||||
case KVM_CAP_MAX_VCPU_ID:
|
||||
r = KVM_MAX_VCPU_ID;
|
||||
break;
|
||||
case KVM_CAP_NR_MEMSLOTS:
|
||||
r = KVM_USER_MEM_SLOTS;
|
||||
break;
|
||||
|
@ -2964,8 +2964,6 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
|
||||
case KVM_CAP_MULTI_ADDRESS_SPACE:
|
||||
return KVM_ADDRESS_SPACE_NUM;
|
||||
#endif
|
||||
case KVM_CAP_MAX_VCPU_ID:
|
||||
return KVM_MAX_VCPU_ID;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user