Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
Коммит
25c43bf13b
|
@ -1481,6 +1481,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
By default, super page will be supported if Intel IOMMU
|
By default, super page will be supported if Intel IOMMU
|
||||||
has the capability. With this option, super page will
|
has the capability. With this option, super page will
|
||||||
not be supported.
|
not be supported.
|
||||||
|
ecs_off [Default Off]
|
||||||
|
By default, extended context tables will be supported if
|
||||||
|
the hardware advertises that it has support both for the
|
||||||
|
extended tables themselves, and also PASID support. With
|
||||||
|
this option set, extended tables will not be used even
|
||||||
|
on hardware which claims to support them.
|
||||||
|
|
||||||
intel_idle.max_cstate= [KNL,HW,ACPI,X86]
|
intel_idle.max_cstate= [KNL,HW,ACPI,X86]
|
||||||
0 disables intel_idle and fall back on acpi_idle.
|
0 disables intel_idle and fall back on acpi_idle.
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
files/UDP-Lite-HOWTO.txt
|
files/UDP-Lite-HOWTO.txt
|
||||||
|
|
||||||
o The Wireshark UDP-Lite WiKi (with capture files):
|
o The Wireshark UDP-Lite WiKi (with capture files):
|
||||||
http://wiki.wireshark.org/Lightweight_User_Datagram_Protocol
|
https://wiki.wireshark.org/Lightweight_User_Datagram_Protocol
|
||||||
|
|
||||||
o The Protocol Spec, RFC 3828, http://www.ietf.org/rfc/rfc3828.txt
|
o The Protocol Spec, RFC 3828, http://www.ietf.org/rfc/rfc3828.txt
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
|
#include <asm/def_LPBlackfin.h>
|
||||||
|
|
||||||
#define __raw_readb bfin_read8
|
#define __raw_readb bfin_read8
|
||||||
#define __raw_readw bfin_read16
|
#define __raw_readw bfin_read16
|
||||||
|
|
|
@ -175,10 +175,10 @@ ENTRY(__clear_user)
|
||||||
br r3
|
br r3
|
||||||
|
|
||||||
.section .fixup, "ax"
|
.section .fixup, "ax"
|
||||||
|
99:
|
||||||
br r3
|
br r3
|
||||||
.previous
|
.previous
|
||||||
.section __ex_table, "a"
|
.section __ex_table, "a"
|
||||||
.align 2
|
.align 2
|
||||||
99:
|
|
||||||
.word 0b, 99b
|
.word 0b, 99b
|
||||||
.previous
|
.previous
|
||||||
|
|
|
@ -4215,13 +4215,13 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
|
||||||
u64 entry, gentry, *spte;
|
u64 entry, gentry, *spte;
|
||||||
int npte;
|
int npte;
|
||||||
bool remote_flush, local_flush, zap_page;
|
bool remote_flush, local_flush, zap_page;
|
||||||
union kvm_mmu_page_role mask = (union kvm_mmu_page_role) {
|
union kvm_mmu_page_role mask = { };
|
||||||
.cr0_wp = 1,
|
|
||||||
.cr4_pae = 1,
|
mask.cr0_wp = 1;
|
||||||
.nxe = 1,
|
mask.cr4_pae = 1;
|
||||||
.smep_andnot_wp = 1,
|
mask.nxe = 1;
|
||||||
.smap_andnot_wp = 1,
|
mask.smep_andnot_wp = 1;
|
||||||
};
|
mask.smap_andnot_wp = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't have indirect shadow pages, it means no page is
|
* If we don't have indirect shadow pages, it means no page is
|
||||||
|
|
|
@ -1600,6 +1600,7 @@ static int blk_mq_hctx_notify(void *data, unsigned long action,
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* hctx->ctxs will be freed in queue's release handler */
|
||||||
static void blk_mq_exit_hctx(struct request_queue *q,
|
static void blk_mq_exit_hctx(struct request_queue *q,
|
||||||
struct blk_mq_tag_set *set,
|
struct blk_mq_tag_set *set,
|
||||||
struct blk_mq_hw_ctx *hctx, unsigned int hctx_idx)
|
struct blk_mq_hw_ctx *hctx, unsigned int hctx_idx)
|
||||||
|
@ -1618,7 +1619,6 @@ static void blk_mq_exit_hctx(struct request_queue *q,
|
||||||
|
|
||||||
blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier);
|
blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier);
|
||||||
blk_free_flush_queue(hctx->fq);
|
blk_free_flush_queue(hctx->fq);
|
||||||
kfree(hctx->ctxs);
|
|
||||||
blk_mq_free_bitmap(&hctx->ctx_map);
|
blk_mq_free_bitmap(&hctx->ctx_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1891,8 +1891,12 @@ void blk_mq_release(struct request_queue *q)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
/* hctx kobj stays in hctx */
|
/* hctx kobj stays in hctx */
|
||||||
queue_for_each_hw_ctx(q, hctx, i)
|
queue_for_each_hw_ctx(q, hctx, i) {
|
||||||
|
if (!hctx)
|
||||||
|
continue;
|
||||||
|
kfree(hctx->ctxs);
|
||||||
kfree(hctx);
|
kfree(hctx);
|
||||||
|
}
|
||||||
|
|
||||||
kfree(q->queue_hw_ctx);
|
kfree(q->queue_hw_ctx);
|
||||||
|
|
||||||
|
|
|
@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
||||||
/* allocate ext devt */
|
/* allocate ext devt */
|
||||||
idr_preload(GFP_KERNEL);
|
idr_preload(GFP_KERNEL);
|
||||||
|
|
||||||
spin_lock(&ext_devt_lock);
|
spin_lock_bh(&ext_devt_lock);
|
||||||
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT);
|
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT);
|
||||||
spin_unlock(&ext_devt_lock);
|
spin_unlock_bh(&ext_devt_lock);
|
||||||
|
|
||||||
idr_preload_end();
|
idr_preload_end();
|
||||||
if (idx < 0)
|
if (idx < 0)
|
||||||
|
@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
|
if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
|
||||||
spin_lock(&ext_devt_lock);
|
spin_lock_bh(&ext_devt_lock);
|
||||||
idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||||
spin_unlock(&ext_devt_lock);
|
spin_unlock_bh(&ext_devt_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -690,13 +690,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
|
||||||
} else {
|
} else {
|
||||||
struct hd_struct *part;
|
struct hd_struct *part;
|
||||||
|
|
||||||
spin_lock(&ext_devt_lock);
|
spin_lock_bh(&ext_devt_lock);
|
||||||
part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||||
if (part && get_disk(part_to_disk(part))) {
|
if (part && get_disk(part_to_disk(part))) {
|
||||||
*partno = part->partno;
|
*partno = part->partno;
|
||||||
disk = part_to_disk(part);
|
disk = part_to_disk(part);
|
||||||
}
|
}
|
||||||
spin_unlock(&ext_devt_lock);
|
spin_unlock_bh(&ext_devt_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return disk;
|
return disk;
|
||||||
|
|
|
@ -406,6 +406,7 @@ config BLK_DEV_RAM_DAX
|
||||||
|
|
||||||
config BLK_DEV_PMEM
|
config BLK_DEV_PMEM
|
||||||
tristate "Persistent memory block device support"
|
tristate "Persistent memory block device support"
|
||||||
|
depends on HAS_IOMEM
|
||||||
help
|
help
|
||||||
Saying Y here will allow you to use a contiguous range of reserved
|
Saying Y here will allow you to use a contiguous range of reserved
|
||||||
memory as one or more persistent block devices.
|
memory as one or more persistent block devices.
|
||||||
|
|
|
@ -805,7 +805,9 @@ static void zram_reset_device(struct zram *zram)
|
||||||
memset(&zram->stats, 0, sizeof(zram->stats));
|
memset(&zram->stats, 0, sizeof(zram->stats));
|
||||||
zram->disksize = 0;
|
zram->disksize = 0;
|
||||||
zram->max_comp_streams = 1;
|
zram->max_comp_streams = 1;
|
||||||
|
|
||||||
set_capacity(zram->disk, 0);
|
set_capacity(zram->disk, 0);
|
||||||
|
part_stat_set_all(&zram->disk->part0, 0);
|
||||||
|
|
||||||
up_write(&zram->init_lock);
|
up_write(&zram->init_lock);
|
||||||
/* I/O operation under all of CPU are done so let's free */
|
/* I/O operation under all of CPU are done so let's free */
|
||||||
|
|
|
@ -435,7 +435,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||||||
struct intel_gmbus,
|
struct intel_gmbus,
|
||||||
adapter);
|
adapter);
|
||||||
struct drm_i915_private *dev_priv = bus->dev_priv;
|
struct drm_i915_private *dev_priv = bus->dev_priv;
|
||||||
int i, reg_offset;
|
int i = 0, inc, try = 0, reg_offset;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
intel_aux_display_runtime_get(dev_priv);
|
intel_aux_display_runtime_get(dev_priv);
|
||||||
|
@ -448,12 +448,14 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||||||
|
|
||||||
reg_offset = dev_priv->gpio_mmio_base;
|
reg_offset = dev_priv->gpio_mmio_base;
|
||||||
|
|
||||||
|
retry:
|
||||||
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
for (; i < num; i += inc) {
|
||||||
|
inc = 1;
|
||||||
if (gmbus_is_index_read(msgs, i, num)) {
|
if (gmbus_is_index_read(msgs, i, num)) {
|
||||||
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
||||||
i += 1; /* set i to the index of the read xfer */
|
inc = 2; /* an index read is two msgs */
|
||||||
} else if (msgs[i].flags & I2C_M_RD) {
|
} else if (msgs[i].flags & I2C_M_RD) {
|
||||||
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -525,6 +527,18 @@ clear_err:
|
||||||
adapter->name, msgs[i].addr,
|
adapter->name, msgs[i].addr,
|
||||||
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Passive adapters sometimes NAK the first probe. Retry the first
|
||||||
|
* message once on -ENXIO for GMBUS transfers; the bit banging algorithm
|
||||||
|
* has retries internally. See also the retry loop in
|
||||||
|
* drm_do_probe_ddc_edid, which bails out on the first -ENXIO.
|
||||||
|
*/
|
||||||
|
if (ret == -ENXIO && i == 0 && try++ == 0) {
|
||||||
|
DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n",
|
||||||
|
adapter->name);
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
timeout:
|
timeout:
|
||||||
|
|
|
@ -2550,7 +2550,7 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device)
|
||||||
|
|
||||||
DRM_DEBUG_KMS("initialising analog device %d\n", device);
|
DRM_DEBUG_KMS("initialising analog device %d\n", device);
|
||||||
|
|
||||||
intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL);
|
intel_sdvo_connector = intel_sdvo_connector_alloc();
|
||||||
if (!intel_sdvo_connector)
|
if (!intel_sdvo_connector)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -580,9 +580,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
||||||
else
|
else
|
||||||
radeon_crtc->pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
|
radeon_crtc->pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
|
||||||
|
|
||||||
/* if there is no audio, set MINM_OVER_MAXP */
|
|
||||||
if (!drm_detect_monitor_audio(radeon_connector_edid(connector)))
|
|
||||||
radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
|
|
||||||
if (rdev->family < CHIP_RV770)
|
if (rdev->family < CHIP_RV770)
|
||||||
radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
|
radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
|
||||||
/* use frac fb div on APUs */
|
/* use frac fb div on APUs */
|
||||||
|
@ -1798,9 +1795,7 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc)
|
||||||
if ((crtc->mode.clock == test_crtc->mode.clock) &&
|
if ((crtc->mode.clock == test_crtc->mode.clock) &&
|
||||||
(adjusted_clock == test_adjusted_clock) &&
|
(adjusted_clock == test_adjusted_clock) &&
|
||||||
(radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) &&
|
(radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) &&
|
||||||
(test_radeon_crtc->pll_id != ATOM_PPLL_INVALID) &&
|
(test_radeon_crtc->pll_id != ATOM_PPLL_INVALID))
|
||||||
(drm_detect_monitor_audio(radeon_connector_edid(test_radeon_crtc->connector)) ==
|
|
||||||
drm_detect_monitor_audio(radeon_connector_edid(radeon_crtc->connector))))
|
|
||||||
return test_radeon_crtc->pll_id;
|
return test_radeon_crtc->pll_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1463,6 +1463,21 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||||
if (r)
|
if (r)
|
||||||
DRM_ERROR("ib ring test failed (%d).\n", r);
|
DRM_ERROR("ib ring test failed (%d).\n", r);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Turks/Thames GPU will freeze whole laptop if DPM is not restarted
|
||||||
|
* after the CP ring have chew one packet at least. Hence here we stop
|
||||||
|
* and restart DPM after the radeon_ib_ring_tests().
|
||||||
|
*/
|
||||||
|
if (rdev->pm.dpm_enabled &&
|
||||||
|
(rdev->pm.pm_method == PM_METHOD_DPM) &&
|
||||||
|
(rdev->family == CHIP_TURKS) &&
|
||||||
|
(rdev->flags & RADEON_IS_MOBILITY)) {
|
||||||
|
mutex_lock(&rdev->pm.mutex);
|
||||||
|
radeon_dpm_disable(rdev);
|
||||||
|
radeon_dpm_enable(rdev);
|
||||||
|
mutex_unlock(&rdev->pm.mutex);
|
||||||
|
}
|
||||||
|
|
||||||
if ((radeon_testing & 1)) {
|
if ((radeon_testing & 1)) {
|
||||||
if (rdev->accel_working)
|
if (rdev->accel_working)
|
||||||
radeon_test_moves(rdev);
|
radeon_test_moves(rdev);
|
||||||
|
|
|
@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
|
||||||
/* make sure object fit at this offset */
|
/* make sure object fit at this offset */
|
||||||
eoffset = soffset + size;
|
eoffset = soffset + size;
|
||||||
if (soffset >= eoffset) {
|
if (soffset >= eoffset) {
|
||||||
return -EINVAL;
|
r = -EINVAL;
|
||||||
|
goto error_unreserve;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
|
last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
|
||||||
if (last_pfn > rdev->vm_manager.max_pfn) {
|
if (last_pfn > rdev->vm_manager.max_pfn) {
|
||||||
dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
|
dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
|
||||||
last_pfn, rdev->vm_manager.max_pfn);
|
last_pfn, rdev->vm_manager.max_pfn);
|
||||||
return -EINVAL;
|
r = -EINVAL;
|
||||||
|
goto error_unreserve;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
|
||||||
"(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
|
"(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
|
||||||
soffset, tmp->bo, tmp->it.start, tmp->it.last);
|
soffset, tmp->bo, tmp->it.start, tmp->it.last);
|
||||||
mutex_unlock(&vm->mutex);
|
mutex_unlock(&vm->mutex);
|
||||||
return -EINVAL;
|
r = -EINVAL;
|
||||||
|
goto error_unreserve;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
|
||||||
tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
|
tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
mutex_unlock(&vm->mutex);
|
mutex_unlock(&vm->mutex);
|
||||||
return -ENOMEM;
|
r = -ENOMEM;
|
||||||
|
goto error_unreserve;
|
||||||
}
|
}
|
||||||
tmp->it.start = bo_va->it.start;
|
tmp->it.start = bo_va->it.start;
|
||||||
tmp->it.last = bo_va->it.last;
|
tmp->it.last = bo_va->it.last;
|
||||||
|
@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
|
||||||
r = radeon_vm_clear_bo(rdev, pt);
|
r = radeon_vm_clear_bo(rdev, pt);
|
||||||
if (r) {
|
if (r) {
|
||||||
radeon_bo_unref(&pt);
|
radeon_bo_unref(&pt);
|
||||||
radeon_bo_reserve(bo_va->bo, false);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
|
||||||
|
|
||||||
mutex_unlock(&vm->mutex);
|
mutex_unlock(&vm->mutex);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
error_unreserve:
|
||||||
|
radeon_bo_unreserve(bo_va->bo);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -150,6 +150,11 @@ static const struct min_max_quirk min_max_pnpid_table[] = {
|
||||||
{ANY_BOARD_ID, 2961},
|
{ANY_BOARD_ID, 2961},
|
||||||
1024, 5112, 2024, 4832
|
1024, 5112, 2024, 4832
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
(const char * const []){"LEN2000", NULL},
|
||||||
|
{ANY_BOARD_ID, ANY_BOARD_ID},
|
||||||
|
1024, 5113, 2021, 4832
|
||||||
|
},
|
||||||
{
|
{
|
||||||
(const char * const []){"LEN2001", NULL},
|
(const char * const []){"LEN2001", NULL},
|
||||||
{ANY_BOARD_ID, ANY_BOARD_ID},
|
{ANY_BOARD_ID, ANY_BOARD_ID},
|
||||||
|
@ -191,7 +196,7 @@ static const char * const topbuttonpad_pnp_ids[] = {
|
||||||
"LEN0045",
|
"LEN0045",
|
||||||
"LEN0047",
|
"LEN0047",
|
||||||
"LEN0049",
|
"LEN0049",
|
||||||
"LEN2000",
|
"LEN2000", /* S540 */
|
||||||
"LEN2001", /* Edge E431 */
|
"LEN2001", /* Edge E431 */
|
||||||
"LEN2002", /* Edge E531 */
|
"LEN2002", /* Edge E531 */
|
||||||
"LEN2003",
|
"LEN2003",
|
||||||
|
|
|
@ -422,6 +422,14 @@ static int dmar_map_gfx = 1;
|
||||||
static int dmar_forcedac;
|
static int dmar_forcedac;
|
||||||
static int intel_iommu_strict;
|
static int intel_iommu_strict;
|
||||||
static int intel_iommu_superpage = 1;
|
static int intel_iommu_superpage = 1;
|
||||||
|
static int intel_iommu_ecs = 1;
|
||||||
|
|
||||||
|
/* We only actually use ECS when PASID support (on the new bit 40)
|
||||||
|
* is also advertised. Some early implementations — the ones with
|
||||||
|
* PASID support on bit 28 — have issues even when we *only* use
|
||||||
|
* extended root/context tables. */
|
||||||
|
#define ecs_enabled(iommu) (intel_iommu_ecs && ecap_ecs(iommu->ecap) && \
|
||||||
|
ecap_pasid(iommu->ecap))
|
||||||
|
|
||||||
int intel_iommu_gfx_mapped;
|
int intel_iommu_gfx_mapped;
|
||||||
EXPORT_SYMBOL_GPL(intel_iommu_gfx_mapped);
|
EXPORT_SYMBOL_GPL(intel_iommu_gfx_mapped);
|
||||||
|
@ -465,6 +473,10 @@ static int __init intel_iommu_setup(char *str)
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"Intel-IOMMU: disable supported super page\n");
|
"Intel-IOMMU: disable supported super page\n");
|
||||||
intel_iommu_superpage = 0;
|
intel_iommu_superpage = 0;
|
||||||
|
} else if (!strncmp(str, "ecs_off", 7)) {
|
||||||
|
printk(KERN_INFO
|
||||||
|
"Intel-IOMMU: disable extended context table support\n");
|
||||||
|
intel_iommu_ecs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
str += strcspn(str, ",");
|
str += strcspn(str, ",");
|
||||||
|
@ -669,7 +681,7 @@ static inline struct context_entry *iommu_context_addr(struct intel_iommu *iommu
|
||||||
struct context_entry *context;
|
struct context_entry *context;
|
||||||
u64 *entry;
|
u64 *entry;
|
||||||
|
|
||||||
if (ecap_ecs(iommu->ecap)) {
|
if (ecs_enabled(iommu)) {
|
||||||
if (devfn >= 0x80) {
|
if (devfn >= 0x80) {
|
||||||
devfn -= 0x80;
|
devfn -= 0x80;
|
||||||
entry = &root->hi;
|
entry = &root->hi;
|
||||||
|
@ -806,7 +818,7 @@ static void free_context_table(struct intel_iommu *iommu)
|
||||||
if (context)
|
if (context)
|
||||||
free_pgtable_page(context);
|
free_pgtable_page(context);
|
||||||
|
|
||||||
if (!ecap_ecs(iommu->ecap))
|
if (!ecs_enabled(iommu))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
context = iommu_context_addr(iommu, i, 0x80, 0);
|
context = iommu_context_addr(iommu, i, 0x80, 0);
|
||||||
|
@ -1141,7 +1153,7 @@ static void iommu_set_root_entry(struct intel_iommu *iommu)
|
||||||
unsigned long flag;
|
unsigned long flag;
|
||||||
|
|
||||||
addr = virt_to_phys(iommu->root_entry);
|
addr = virt_to_phys(iommu->root_entry);
|
||||||
if (ecap_ecs(iommu->ecap))
|
if (ecs_enabled(iommu))
|
||||||
addr |= DMA_RTADDR_RTT;
|
addr |= DMA_RTADDR_RTT;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&iommu->register_lock, flag);
|
raw_spin_lock_irqsave(&iommu->register_lock, flag);
|
||||||
|
|
|
@ -3834,7 +3834,7 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
}
|
}
|
||||||
spin_unlock(&mddev->lock);
|
spin_unlock(&mddev->lock);
|
||||||
return err;
|
return err ?: len;
|
||||||
}
|
}
|
||||||
err = mddev_lock(mddev);
|
err = mddev_lock(mddev);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -4217,13 +4217,14 @@ action_store(struct mddev *mddev, const char *page, size_t len)
|
||||||
set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
||||||
else
|
else
|
||||||
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
||||||
flush_workqueue(md_misc_wq);
|
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
|
||||||
if (mddev->sync_thread) {
|
mddev_lock(mddev) == 0) {
|
||||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
flush_workqueue(md_misc_wq);
|
||||||
if (mddev_lock(mddev) == 0) {
|
if (mddev->sync_thread) {
|
||||||
|
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||||
md_reap_sync_thread(mddev);
|
md_reap_sync_thread(mddev);
|
||||||
mddev_unlock(mddev);
|
|
||||||
}
|
}
|
||||||
|
mddev_unlock(mddev);
|
||||||
}
|
}
|
||||||
} else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
|
} else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
|
||||||
test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
|
test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
|
||||||
|
@ -8261,6 +8262,7 @@ void md_reap_sync_thread(struct mddev *mddev)
|
||||||
if (mddev_is_clustered(mddev))
|
if (mddev_is_clustered(mddev))
|
||||||
md_cluster_ops->metadata_update_finish(mddev);
|
md_cluster_ops->metadata_update_finish(mddev);
|
||||||
clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
|
clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
|
||||||
|
clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
|
||||||
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
||||||
clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
|
clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
|
||||||
clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
|
clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
|
||||||
|
|
|
@ -4156,6 +4156,7 @@ static int raid10_start_reshape(struct mddev *mddev)
|
||||||
|
|
||||||
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
||||||
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
||||||
|
clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
|
||||||
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
|
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
|
||||||
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
|
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
|
||||||
|
|
||||||
|
|
|
@ -7354,6 +7354,7 @@ static int raid5_start_reshape(struct mddev *mddev)
|
||||||
|
|
||||||
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
||||||
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
||||||
|
clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
|
||||||
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
|
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
|
||||||
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
|
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
|
||||||
mddev->sync_thread = md_register_thread(md_do_sync, mddev,
|
mddev->sync_thread = md_register_thread(md_do_sync, mddev,
|
||||||
|
|
|
@ -131,8 +131,15 @@ static void enic_get_drvinfo(struct net_device *netdev,
|
||||||
{
|
{
|
||||||
struct enic *enic = netdev_priv(netdev);
|
struct enic *enic = netdev_priv(netdev);
|
||||||
struct vnic_devcmd_fw_info *fw_info;
|
struct vnic_devcmd_fw_info *fw_info;
|
||||||
|
int err;
|
||||||
|
|
||||||
enic_dev_fw_info(enic, &fw_info);
|
err = enic_dev_fw_info(enic, &fw_info);
|
||||||
|
/* return only when pci_zalloc_consistent fails in vnic_dev_fw_info
|
||||||
|
* For other failures, like devcmd failure, we return previously
|
||||||
|
* recorded info.
|
||||||
|
*/
|
||||||
|
if (err == -ENOMEM)
|
||||||
|
return;
|
||||||
|
|
||||||
strlcpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
|
strlcpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
|
||||||
strlcpy(drvinfo->version, DRV_VERSION, sizeof(drvinfo->version));
|
strlcpy(drvinfo->version, DRV_VERSION, sizeof(drvinfo->version));
|
||||||
|
@ -181,8 +188,15 @@ static void enic_get_ethtool_stats(struct net_device *netdev,
|
||||||
struct enic *enic = netdev_priv(netdev);
|
struct enic *enic = netdev_priv(netdev);
|
||||||
struct vnic_stats *vstats;
|
struct vnic_stats *vstats;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
int err;
|
||||||
|
|
||||||
enic_dev_stats_dump(enic, &vstats);
|
err = enic_dev_stats_dump(enic, &vstats);
|
||||||
|
/* return only when pci_zalloc_consistent fails in vnic_dev_stats_dump
|
||||||
|
* For other failures, like devcmd failure, we return previously
|
||||||
|
* recorded stats.
|
||||||
|
*/
|
||||||
|
if (err == -ENOMEM)
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = 0; i < enic_n_tx_stats; i++)
|
for (i = 0; i < enic_n_tx_stats; i++)
|
||||||
*(data++) = ((u64 *)&vstats->tx)[enic_tx_stats[i].index];
|
*(data++) = ((u64 *)&vstats->tx)[enic_tx_stats[i].index];
|
||||||
|
|
|
@ -615,8 +615,15 @@ static struct rtnl_link_stats64 *enic_get_stats(struct net_device *netdev,
|
||||||
{
|
{
|
||||||
struct enic *enic = netdev_priv(netdev);
|
struct enic *enic = netdev_priv(netdev);
|
||||||
struct vnic_stats *stats;
|
struct vnic_stats *stats;
|
||||||
|
int err;
|
||||||
|
|
||||||
enic_dev_stats_dump(enic, &stats);
|
err = enic_dev_stats_dump(enic, &stats);
|
||||||
|
/* return only when pci_zalloc_consistent fails in vnic_dev_stats_dump
|
||||||
|
* For other failures, like devcmd failure, we return previously
|
||||||
|
* recorded stats.
|
||||||
|
*/
|
||||||
|
if (err == -ENOMEM)
|
||||||
|
return net_stats;
|
||||||
|
|
||||||
net_stats->tx_packets = stats->tx.tx_frames_ok;
|
net_stats->tx_packets = stats->tx.tx_frames_ok;
|
||||||
net_stats->tx_bytes = stats->tx.tx_bytes_ok;
|
net_stats->tx_bytes = stats->tx.tx_bytes_ok;
|
||||||
|
@ -1407,6 +1414,7 @@ static int enic_poll_msix_rq(struct napi_struct *napi, int budget)
|
||||||
*/
|
*/
|
||||||
enic_calc_int_moderation(enic, &enic->rq[rq]);
|
enic_calc_int_moderation(enic, &enic->rq[rq]);
|
||||||
|
|
||||||
|
enic_poll_unlock_napi(&enic->rq[rq]);
|
||||||
if (work_done < work_to_do) {
|
if (work_done < work_to_do) {
|
||||||
|
|
||||||
/* Some work done, but not enough to stay in polling,
|
/* Some work done, but not enough to stay in polling,
|
||||||
|
@ -1418,7 +1426,6 @@ static int enic_poll_msix_rq(struct napi_struct *napi, int budget)
|
||||||
enic_set_int_moderation(enic, &enic->rq[rq]);
|
enic_set_int_moderation(enic, &enic->rq[rq]);
|
||||||
vnic_intr_unmask(&enic->intr[intr]);
|
vnic_intr_unmask(&enic->intr[intr]);
|
||||||
}
|
}
|
||||||
enic_poll_unlock_napi(&enic->rq[rq]);
|
|
||||||
|
|
||||||
return work_done;
|
return work_done;
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,16 +188,15 @@ void vnic_rq_clean(struct vnic_rq *rq,
|
||||||
struct vnic_rq_buf *buf;
|
struct vnic_rq_buf *buf;
|
||||||
u32 fetch_index;
|
u32 fetch_index;
|
||||||
unsigned int count = rq->ring.desc_count;
|
unsigned int count = rq->ring.desc_count;
|
||||||
|
int i;
|
||||||
|
|
||||||
buf = rq->to_clean;
|
buf = rq->to_clean;
|
||||||
|
|
||||||
while (vnic_rq_desc_used(rq) > 0) {
|
for (i = 0; i < rq->ring.desc_count; i++) {
|
||||||
|
|
||||||
(*buf_clean)(rq, buf);
|
(*buf_clean)(rq, buf);
|
||||||
|
buf = buf->next;
|
||||||
buf = rq->to_clean = buf->next;
|
|
||||||
rq->ring.desc_avail++;
|
|
||||||
}
|
}
|
||||||
|
rq->ring.desc_avail = rq->ring.desc_count - 1;
|
||||||
|
|
||||||
/* Use current fetch_index as the ring starting point */
|
/* Use current fetch_index as the ring starting point */
|
||||||
fetch_index = ioread32(&rq->ctrl->fetch_index);
|
fetch_index = ioread32(&rq->ctrl->fetch_index);
|
||||||
|
|
|
@ -538,8 +538,8 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp,
|
||||||
igb->perout[i].start.tv_nsec = rq->perout.start.nsec;
|
igb->perout[i].start.tv_nsec = rq->perout.start.nsec;
|
||||||
igb->perout[i].period.tv_sec = ts.tv_sec;
|
igb->perout[i].period.tv_sec = ts.tv_sec;
|
||||||
igb->perout[i].period.tv_nsec = ts.tv_nsec;
|
igb->perout[i].period.tv_nsec = ts.tv_nsec;
|
||||||
wr32(trgttiml, rq->perout.start.sec);
|
wr32(trgttimh, rq->perout.start.sec);
|
||||||
wr32(trgttimh, rq->perout.start.nsec);
|
wr32(trgttiml, rq->perout.start.nsec);
|
||||||
tsauxc |= tsauxc_mask;
|
tsauxc |= tsauxc_mask;
|
||||||
tsim |= tsim_mask;
|
tsim |= tsim_mask;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -115,13 +115,14 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
|
||||||
* Extended Capability Register
|
* Extended Capability Register
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define ecap_pasid(e) ((e >> 40) & 0x1)
|
||||||
#define ecap_pss(e) ((e >> 35) & 0x1f)
|
#define ecap_pss(e) ((e >> 35) & 0x1f)
|
||||||
#define ecap_eafs(e) ((e >> 34) & 0x1)
|
#define ecap_eafs(e) ((e >> 34) & 0x1)
|
||||||
#define ecap_nwfs(e) ((e >> 33) & 0x1)
|
#define ecap_nwfs(e) ((e >> 33) & 0x1)
|
||||||
#define ecap_srs(e) ((e >> 31) & 0x1)
|
#define ecap_srs(e) ((e >> 31) & 0x1)
|
||||||
#define ecap_ers(e) ((e >> 30) & 0x1)
|
#define ecap_ers(e) ((e >> 30) & 0x1)
|
||||||
#define ecap_prs(e) ((e >> 29) & 0x1)
|
#define ecap_prs(e) ((e >> 29) & 0x1)
|
||||||
#define ecap_pasid(e) ((e >> 28) & 0x1)
|
/* PASID support used to be on bit 28 */
|
||||||
#define ecap_dis(e) ((e >> 27) & 0x1)
|
#define ecap_dis(e) ((e >> 27) & 0x1)
|
||||||
#define ecap_nest(e) ((e >> 26) & 0x1)
|
#define ecap_nest(e) ((e >> 26) & 0x1)
|
||||||
#define ecap_mts(e) ((e >> 25) & 0x1)
|
#define ecap_mts(e) ((e >> 25) & 0x1)
|
||||||
|
|
|
@ -2181,7 +2181,7 @@ void task_numa_work(struct callback_head *work)
|
||||||
}
|
}
|
||||||
for (; vma; vma = vma->vm_next) {
|
for (; vma; vma = vma->vm_next) {
|
||||||
if (!vma_migratable(vma) || !vma_policy_mof(vma) ||
|
if (!vma_migratable(vma) || !vma_policy_mof(vma) ||
|
||||||
is_vm_hugetlb_page(vma)) {
|
is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_MIXEDMAP)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -450,7 +450,7 @@ static int __init ring_buffer_benchmark_init(void)
|
||||||
|
|
||||||
if (producer_fifo >= 0) {
|
if (producer_fifo >= 0) {
|
||||||
struct sched_param param = {
|
struct sched_param param = {
|
||||||
.sched_priority = consumer_fifo
|
.sched_priority = producer_fifo
|
||||||
};
|
};
|
||||||
sched_setscheduler(producer, SCHED_FIFO, ¶m);
|
sched_setscheduler(producer, SCHED_FIFO, ¶m);
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -2323,6 +2323,8 @@ done_restock:
|
||||||
css_get_many(&memcg->css, batch);
|
css_get_many(&memcg->css, batch);
|
||||||
if (batch > nr_pages)
|
if (batch > nr_pages)
|
||||||
refill_stock(memcg, batch - nr_pages);
|
refill_stock(memcg, batch - nr_pages);
|
||||||
|
if (!(gfp_mask & __GFP_WAIT))
|
||||||
|
goto done;
|
||||||
/*
|
/*
|
||||||
* If the hierarchy is above the normal consumption range,
|
* If the hierarchy is above the normal consumption range,
|
||||||
* make the charging task trim their excess contribution.
|
* make the charging task trim their excess contribution.
|
||||||
|
@ -5833,9 +5835,7 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry)
|
||||||
if (!mem_cgroup_is_root(memcg))
|
if (!mem_cgroup_is_root(memcg))
|
||||||
page_counter_uncharge(&memcg->memory, 1);
|
page_counter_uncharge(&memcg->memory, 1);
|
||||||
|
|
||||||
/* XXX: caller holds IRQ-safe mapping->tree_lock */
|
/* Caller disabled preemption with mapping->tree_lock */
|
||||||
VM_BUG_ON(!irqs_disabled());
|
|
||||||
|
|
||||||
mem_cgroup_charge_statistics(memcg, page, -1);
|
mem_cgroup_charge_statistics(memcg, page, -1);
|
||||||
memcg_check_events(memcg, page);
|
memcg_check_events(memcg, page);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1969,8 +1969,10 @@ void try_offline_node(int nid)
|
||||||
* wait_table may be allocated from boot memory,
|
* wait_table may be allocated from boot memory,
|
||||||
* here only free if it's allocated by vmalloc.
|
* here only free if it's allocated by vmalloc.
|
||||||
*/
|
*/
|
||||||
if (is_vmalloc_addr(zone->wait_table))
|
if (is_vmalloc_addr(zone->wait_table)) {
|
||||||
vfree(zone->wait_table);
|
vfree(zone->wait_table);
|
||||||
|
zone->wait_table = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(try_offline_node);
|
EXPORT_SYMBOL(try_offline_node);
|
||||||
|
|
|
@ -289,7 +289,8 @@ static int create_handle_cache(struct zs_pool *pool)
|
||||||
|
|
||||||
static void destroy_handle_cache(struct zs_pool *pool)
|
static void destroy_handle_cache(struct zs_pool *pool)
|
||||||
{
|
{
|
||||||
kmem_cache_destroy(pool->handle_cachep);
|
if (pool->handle_cachep)
|
||||||
|
kmem_cache_destroy(pool->handle_cachep);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long alloc_handle(struct zs_pool *pool)
|
static unsigned long alloc_handle(struct zs_pool *pool)
|
||||||
|
|
|
@ -1164,6 +1164,9 @@ static void br_multicast_add_router(struct net_bridge *br,
|
||||||
struct net_bridge_port *p;
|
struct net_bridge_port *p;
|
||||||
struct hlist_node *slot = NULL;
|
struct hlist_node *slot = NULL;
|
||||||
|
|
||||||
|
if (!hlist_unhashed(&port->rlist))
|
||||||
|
return;
|
||||||
|
|
||||||
hlist_for_each_entry(p, &br->router_list, rlist) {
|
hlist_for_each_entry(p, &br->router_list, rlist) {
|
||||||
if ((unsigned long) port >= (unsigned long) p)
|
if ((unsigned long) port >= (unsigned long) p)
|
||||||
break;
|
break;
|
||||||
|
@ -1191,12 +1194,8 @@ static void br_multicast_mark_router(struct net_bridge *br,
|
||||||
if (port->multicast_router != 1)
|
if (port->multicast_router != 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!hlist_unhashed(&port->rlist))
|
|
||||||
goto timer;
|
|
||||||
|
|
||||||
br_multicast_add_router(br, port);
|
br_multicast_add_router(br, port);
|
||||||
|
|
||||||
timer:
|
|
||||||
mod_timer(&port->multicast_router_timer,
|
mod_timer(&port->multicast_router_timer,
|
||||||
now + br->multicast_querier_interval);
|
now + br->multicast_querier_interval);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4467,7 +4467,7 @@ struct sk_buff *alloc_skb_with_frags(unsigned long header_len,
|
||||||
|
|
||||||
while (order) {
|
while (order) {
|
||||||
if (npages >= 1 << order) {
|
if (npages >= 1 << order) {
|
||||||
page = alloc_pages(gfp_mask |
|
page = alloc_pages((gfp_mask & ~__GFP_WAIT) |
|
||||||
__GFP_COMP |
|
__GFP_COMP |
|
||||||
__GFP_NOWARN |
|
__GFP_NOWARN |
|
||||||
__GFP_NORETRY,
|
__GFP_NORETRY,
|
||||||
|
|
|
@ -354,15 +354,12 @@ void sk_clear_memalloc(struct sock *sk)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SOCK_MEMALLOC is allowed to ignore rmem limits to ensure forward
|
* SOCK_MEMALLOC is allowed to ignore rmem limits to ensure forward
|
||||||
* progress of swapping. However, if SOCK_MEMALLOC is cleared while
|
* progress of swapping. SOCK_MEMALLOC may be cleared while
|
||||||
* it has rmem allocations there is a risk that the user of the
|
* it has rmem allocations due to the last swapfile being deactivated
|
||||||
* socket cannot make forward progress due to exceeding the rmem
|
* but there is a risk that the socket is unusable due to exceeding
|
||||||
* limits. By rights, sk_clear_memalloc() should only be called
|
* the rmem limits. Reclaim the reserves and obey rmem limits again.
|
||||||
* on sockets being torn down but warn and reset the accounting if
|
|
||||||
* that assumption breaks.
|
|
||||||
*/
|
*/
|
||||||
if (WARN_ON(sk->sk_forward_alloc))
|
sk_mem_reclaim(sk);
|
||||||
sk_mem_reclaim(sk);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(sk_clear_memalloc);
|
EXPORT_SYMBOL_GPL(sk_clear_memalloc);
|
||||||
|
|
||||||
|
@ -1872,7 +1869,7 @@ bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp)
|
||||||
|
|
||||||
pfrag->offset = 0;
|
pfrag->offset = 0;
|
||||||
if (SKB_FRAG_PAGE_ORDER) {
|
if (SKB_FRAG_PAGE_ORDER) {
|
||||||
pfrag->page = alloc_pages(gfp | __GFP_COMP |
|
pfrag->page = alloc_pages((gfp & ~__GFP_WAIT) | __GFP_COMP |
|
||||||
__GFP_NOWARN | __GFP_NORETRY,
|
__GFP_NOWARN | __GFP_NORETRY,
|
||||||
SKB_FRAG_PAGE_ORDER);
|
SKB_FRAG_PAGE_ORDER);
|
||||||
if (likely(pfrag->page)) {
|
if (likely(pfrag->page)) {
|
||||||
|
|
|
@ -212,13 +212,13 @@ static int ip6_input_finish(struct sock *sk, struct sk_buff *skb)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
resubmit:
|
||||||
idev = ip6_dst_idev(skb_dst(skb));
|
idev = ip6_dst_idev(skb_dst(skb));
|
||||||
if (!pskb_pull(skb, skb_transport_offset(skb)))
|
if (!pskb_pull(skb, skb_transport_offset(skb)))
|
||||||
goto discard;
|
goto discard;
|
||||||
nhoff = IP6CB(skb)->nhoff;
|
nhoff = IP6CB(skb)->nhoff;
|
||||||
nexthdr = skb_network_header(skb)[nhoff];
|
nexthdr = skb_network_header(skb)[nhoff];
|
||||||
|
|
||||||
resubmit:
|
|
||||||
raw = raw6_local_deliver(skb, nexthdr);
|
raw = raw6_local_deliver(skb, nexthdr);
|
||||||
ipprot = rcu_dereference(inet6_protos[nexthdr]);
|
ipprot = rcu_dereference(inet6_protos[nexthdr]);
|
||||||
if (ipprot) {
|
if (ipprot) {
|
||||||
|
@ -246,12 +246,10 @@ resubmit:
|
||||||
goto discard;
|
goto discard;
|
||||||
|
|
||||||
ret = ipprot->handler(skb);
|
ret = ipprot->handler(skb);
|
||||||
if (ret < 0) {
|
if (ret > 0)
|
||||||
nexthdr = -ret;
|
|
||||||
goto resubmit;
|
goto resubmit;
|
||||||
} else if (ret == 0) {
|
else if (ret == 0)
|
||||||
IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDELIVERS);
|
IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDELIVERS);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (!raw) {
|
if (!raw) {
|
||||||
if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
|
if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
|
||||||
|
|
|
@ -564,6 +564,17 @@ static int mpls_dev_notify(struct notifier_block *this, unsigned long event,
|
||||||
case NETDEV_UNREGISTER:
|
case NETDEV_UNREGISTER:
|
||||||
mpls_ifdown(dev);
|
mpls_ifdown(dev);
|
||||||
break;
|
break;
|
||||||
|
case NETDEV_CHANGENAME:
|
||||||
|
mdev = mpls_dev_get(dev);
|
||||||
|
if (mdev) {
|
||||||
|
int err;
|
||||||
|
|
||||||
|
mpls_dev_sysctl_unregister(mdev);
|
||||||
|
err = mpls_dev_sysctl_register(dev, mdev);
|
||||||
|
if (err)
|
||||||
|
return notifier_from_errno(err);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -381,13 +381,14 @@ nomem:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Public interface to creat the association shared key.
|
/* Public interface to create the association shared key.
|
||||||
* See code above for the algorithm.
|
* See code above for the algorithm.
|
||||||
*/
|
*/
|
||||||
int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp)
|
int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct sctp_auth_bytes *secret;
|
struct sctp_auth_bytes *secret;
|
||||||
struct sctp_shared_key *ep_key;
|
struct sctp_shared_key *ep_key;
|
||||||
|
struct sctp_chunk *chunk;
|
||||||
|
|
||||||
/* If we don't support AUTH, or peer is not capable
|
/* If we don't support AUTH, or peer is not capable
|
||||||
* we don't need to do anything.
|
* we don't need to do anything.
|
||||||
|
@ -410,6 +411,14 @@ int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp)
|
||||||
sctp_auth_key_put(asoc->asoc_shared_key);
|
sctp_auth_key_put(asoc->asoc_shared_key);
|
||||||
asoc->asoc_shared_key = secret;
|
asoc->asoc_shared_key = secret;
|
||||||
|
|
||||||
|
/* Update send queue in case any chunk already in there now
|
||||||
|
* needs authenticating
|
||||||
|
*/
|
||||||
|
list_for_each_entry(chunk, &asoc->outqueue.out_chunk_list, list) {
|
||||||
|
if (sctp_auth_send_cid(chunk->chunk_hdr->type, asoc))
|
||||||
|
chunk->auth = 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2140,11 +2140,17 @@ static void tipc_sk_timeout(unsigned long data)
|
||||||
peer_node = tsk_peer_node(tsk);
|
peer_node = tsk_peer_node(tsk);
|
||||||
|
|
||||||
if (tsk->probing_state == TIPC_CONN_PROBING) {
|
if (tsk->probing_state == TIPC_CONN_PROBING) {
|
||||||
/* Previous probe not answered -> self abort */
|
if (!sock_owned_by_user(sk)) {
|
||||||
skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,
|
sk->sk_socket->state = SS_DISCONNECTING;
|
||||||
TIPC_CONN_MSG, SHORT_H_SIZE, 0,
|
tsk->connected = 0;
|
||||||
own_node, peer_node, tsk->portid,
|
tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
|
||||||
peer_port, TIPC_ERR_NO_PORT);
|
tsk_peer_port(tsk));
|
||||||
|
sk->sk_state_change(sk);
|
||||||
|
} else {
|
||||||
|
/* Try again later */
|
||||||
|
sk_reset_timer(sk, &sk->sk_timer, (HZ / 20));
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE,
|
skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE,
|
||||||
INT_H_SIZE, 0, peer_node, own_node,
|
INT_H_SIZE, 0, peer_node, own_node,
|
||||||
|
|
|
@ -1333,6 +1333,8 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
|
||||||
memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
|
memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
|
|
||||||
|
memset(&sinfo, 0, sizeof(sinfo));
|
||||||
|
|
||||||
if (rdev_get_station(rdev, dev, bssid, &sinfo))
|
if (rdev_get_station(rdev, dev, bssid, &sinfo))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
|
@ -3169,12 +3169,12 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for global initialisers.
|
# check for global initialisers.
|
||||||
if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
|
if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*(?:0|NULL|false)\s*;/) {
|
||||||
if (ERROR("GLOBAL_INITIALISERS",
|
if (ERROR("GLOBAL_INITIALISERS",
|
||||||
"do not initialise globals to 0 or NULL\n" .
|
"do not initialise globals to 0 or NULL\n" .
|
||||||
$herecurr) &&
|
$herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
$fixed[$fixlinenr] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
|
$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*(0|NULL|false)\s*;/$1;/;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# check for static initialisers.
|
# check for static initialisers.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче