Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Conflicts:
	drivers/net/ethernet/amd/xgbe/xgbe-desc.c
	drivers/net/ethernet/renesas/sh_eth.c

Overlapping changes in both conflict cases.

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2014-12-10 15:48:20 -05:00
commit 22f10923dd
77 changed files with 540 additions and 330 deletions

View File

@ -383,7 +383,7 @@ o <http://www.iptables.org/downloads.html>
Ip-route2 Ip-route2
--------- ---------
o <ftp://ftp.tux.org/pub/net/ip-routing/iproute2-2.2.4-now-ss991023.tar.gz> o <https://www.kernel.org/pub/linux/utils/net/iproute2/>
OProfile OProfile
-------- --------

View File

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 18 PATCHLEVEL = 18
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc6 EXTRAVERSION = -rc7
NAME = Diseased Newt NAME = Diseased Newt
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -426,7 +426,7 @@ static inline void emit_mod(unsigned int dst, unsigned int src,
u32 *p = &ctx->target[ctx->idx]; u32 *p = &ctx->target[ctx->idx];
uasm_i_divu(&p, dst, src); uasm_i_divu(&p, dst, src);
p = &ctx->target[ctx->idx + 1]; p = &ctx->target[ctx->idx + 1];
uasm_i_mflo(&p, dst); uasm_i_mfhi(&p, dst);
} }
ctx->idx += 2; /* 2 insts */ ctx->idx += 2; /* 2 insts */
} }
@ -971,7 +971,7 @@ load_ind:
break; break;
case BPF_ALU | BPF_MOD | BPF_K: case BPF_ALU | BPF_MOD | BPF_K:
/* A %= k */ /* A %= k */
if (k == 1 || optimize_div(&k)) { if (k == 1) {
ctx->flags |= SEEN_A; ctx->flags |= SEEN_A;
emit_jit_reg_move(r_A, r_zero, ctx); emit_jit_reg_move(r_A, r_zero, ctx);
} else { } else {

View File

@ -54,12 +54,8 @@ void s390_handle_mcck(void)
*/ */
local_irq_save(flags); local_irq_save(flags);
local_mcck_disable(); local_mcck_disable();
/* mcck = *this_cpu_ptr(&cpu_mcck);
* Ummm... Does this make sense at all? Copying the percpu struct memset(this_cpu_ptr(&cpu_mcck), 0, sizeof(mcck));
* and then zapping it one statement later?
*/
memcpy(&mcck, this_cpu_ptr(&cpu_mcck), sizeof(mcck));
memset(&mcck, 0, sizeof(struct mcck_struct));
clear_cpu_flag(CIF_MCCK_PENDING); clear_cpu_flag(CIF_MCCK_PENDING);
local_mcck_enable(); local_mcck_enable();
local_irq_restore(flags); local_irq_restore(flags);

View File

@ -178,7 +178,7 @@ static void jit_fill_hole(void *area, unsigned int size)
} }
struct jit_context { struct jit_context {
unsigned int cleanup_addr; /* epilogue code offset */ int cleanup_addr; /* epilogue code offset */
bool seen_ld_abs; bool seen_ld_abs;
}; };
@ -192,6 +192,7 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
struct bpf_insn *insn = bpf_prog->insnsi; struct bpf_insn *insn = bpf_prog->insnsi;
int insn_cnt = bpf_prog->len; int insn_cnt = bpf_prog->len;
bool seen_ld_abs = ctx->seen_ld_abs | (oldproglen == 0); bool seen_ld_abs = ctx->seen_ld_abs | (oldproglen == 0);
bool seen_exit = false;
u8 temp[BPF_MAX_INSN_SIZE + BPF_INSN_SAFETY]; u8 temp[BPF_MAX_INSN_SIZE + BPF_INSN_SAFETY];
int i; int i;
int proglen = 0; int proglen = 0;
@ -854,10 +855,11 @@ common_load:
goto common_load; goto common_load;
case BPF_JMP | BPF_EXIT: case BPF_JMP | BPF_EXIT:
if (i != insn_cnt - 1) { if (seen_exit) {
jmp_offset = ctx->cleanup_addr - addrs[i]; jmp_offset = ctx->cleanup_addr - addrs[i];
goto emit_jmp; goto emit_jmp;
} }
seen_exit = true;
/* update cleanup_addr */ /* update cleanup_addr */
ctx->cleanup_addr = proglen; ctx->cleanup_addr = proglen;
/* mov rbx, qword ptr [rbp-X] */ /* mov rbx, qword ptr [rbp-X] */

View File

@ -216,9 +216,10 @@ static int bio_integrity_process(struct bio *bio,
{ {
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
struct blk_integrity_iter iter; struct blk_integrity_iter iter;
struct bio_vec *bv; struct bvec_iter bviter;
struct bio_vec bv;
struct bio_integrity_payload *bip = bio_integrity(bio); struct bio_integrity_payload *bip = bio_integrity(bio);
unsigned int i, ret = 0; unsigned int ret = 0;
void *prot_buf = page_address(bip->bip_vec->bv_page) + void *prot_buf = page_address(bip->bip_vec->bv_page) +
bip->bip_vec->bv_offset; bip->bip_vec->bv_offset;
@ -227,11 +228,11 @@ static int bio_integrity_process(struct bio *bio,
iter.seed = bip_get_seed(bip); iter.seed = bip_get_seed(bip);
iter.prot_buf = prot_buf; iter.prot_buf = prot_buf;
bio_for_each_segment_all(bv, bio, i) { bio_for_each_segment(bv, bio, bviter) {
void *kaddr = kmap_atomic(bv->bv_page); void *kaddr = kmap_atomic(bv.bv_page);
iter.data_buf = kaddr + bv->bv_offset; iter.data_buf = kaddr + bv.bv_offset;
iter.data_size = bv->bv_len; iter.data_size = bv.bv_len;
ret = proc_fn(&iter); ret = proc_fn(&iter);
if (ret) { if (ret) {

View File

@ -9408,6 +9408,10 @@ static bool page_flip_finished(struct intel_crtc *crtc)
struct drm_device *dev = crtc->base.dev; struct drm_device *dev = crtc->base.dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
if (i915_reset_in_progress(&dev_priv->gpu_error) ||
crtc->reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter))
return true;
/* /*
* The relevant registers doen't exist on pre-ctg. * The relevant registers doen't exist on pre-ctg.
* As the flip done interrupt doesn't trigger for mmio * As the flip done interrupt doesn't trigger for mmio

View File

@ -4450,6 +4450,7 @@ static void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
* vdd might still be enabled do to the delayed vdd off. * vdd might still be enabled do to the delayed vdd off.
* Make sure vdd is actually turned off here. * Make sure vdd is actually turned off here.
*/ */
cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
pps_lock(intel_dp); pps_lock(intel_dp);
edp_panel_vdd_off_sync(intel_dp); edp_panel_vdd_off_sync(intel_dp);
pps_unlock(intel_dp); pps_unlock(intel_dp);

View File

@ -218,7 +218,6 @@ nvc0_identify(struct nouveau_device *device)
device->oclass[NVDEV_ENGINE_BSP ] = &nvc0_bsp_oclass; device->oclass[NVDEV_ENGINE_BSP ] = &nvc0_bsp_oclass;
device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass; device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass;
device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass; device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass;
device->oclass[NVDEV_ENGINE_COPY1 ] = &nvc0_copy1_oclass;
device->oclass[NVDEV_ENGINE_DISP ] = nva3_disp_oclass; device->oclass[NVDEV_ENGINE_DISP ] = nva3_disp_oclass;
device->oclass[NVDEV_ENGINE_PERFMON] = &nvc0_perfmon_oclass; device->oclass[NVDEV_ENGINE_PERFMON] = &nvc0_perfmon_oclass;
break; break;

View File

@ -551,8 +551,8 @@ nv04_fifo_intr(struct nouveau_subdev *subdev)
} }
if (status & 0x40000000) { if (status & 0x40000000) {
nouveau_fifo_uevent(&priv->base);
nv_wr32(priv, 0x002100, 0x40000000); nv_wr32(priv, 0x002100, 0x40000000);
nouveau_fifo_uevent(&priv->base);
status &= ~0x40000000; status &= ~0x40000000;
} }
} }

View File

@ -740,6 +740,8 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn)
u32 inte = nv_rd32(priv, 0x002628); u32 inte = nv_rd32(priv, 0x002628);
u32 unkn; u32 unkn;
nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr);
for (unkn = 0; unkn < 8; unkn++) { for (unkn = 0; unkn < 8; unkn++) {
u32 ints = (intr >> (unkn * 0x04)) & inte; u32 ints = (intr >> (unkn * 0x04)) & inte;
if (ints & 0x1) { if (ints & 0x1) {
@ -751,8 +753,6 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn)
nv_mask(priv, 0x002628, ints, 0); nv_mask(priv, 0x002628, ints, 0);
} }
} }
nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr);
} }
static void static void

View File

@ -952,8 +952,8 @@ nve0_fifo_intr(struct nouveau_subdev *subdev)
} }
if (stat & 0x80000000) { if (stat & 0x80000000) {
nve0_fifo_intr_engine(priv);
nv_wr32(priv, 0x002100, 0x80000000); nv_wr32(priv, 0x002100, 0x80000000);
nve0_fifo_intr_engine(priv);
stat &= ~0x80000000; stat &= ~0x80000000;
} }

View File

@ -629,7 +629,6 @@ int nouveau_pmops_suspend(struct device *dev)
pci_save_state(pdev); pci_save_state(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
pci_ignore_hotplug(pdev);
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
return 0; return 0;
} }
@ -933,6 +932,7 @@ static int nouveau_pmops_runtime_suspend(struct device *dev)
ret = nouveau_do_suspend(drm_dev, true); ret = nouveau_do_suspend(drm_dev, true);
pci_save_state(pdev); pci_save_state(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
pci_ignore_hotplug(pdev);
pci_set_power_state(pdev, PCI_D3cold); pci_set_power_state(pdev, PCI_D3cold);
drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
return ret; return ret;

View File

@ -52,20 +52,24 @@ nouveau_fctx(struct nouveau_fence *fence)
return container_of(fence->base.lock, struct nouveau_fence_chan, lock); return container_of(fence->base.lock, struct nouveau_fence_chan, lock);
} }
static void static int
nouveau_fence_signal(struct nouveau_fence *fence) nouveau_fence_signal(struct nouveau_fence *fence)
{ {
int drop = 0;
fence_signal_locked(&fence->base); fence_signal_locked(&fence->base);
list_del(&fence->head); list_del(&fence->head);
rcu_assign_pointer(fence->channel, NULL);
if (test_bit(FENCE_FLAG_USER_BITS, &fence->base.flags)) { if (test_bit(FENCE_FLAG_USER_BITS, &fence->base.flags)) {
struct nouveau_fence_chan *fctx = nouveau_fctx(fence); struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
if (!--fctx->notify_ref) if (!--fctx->notify_ref)
nvif_notify_put(&fctx->notify); drop = 1;
} }
fence_put(&fence->base); fence_put(&fence->base);
return drop;
} }
static struct nouveau_fence * static struct nouveau_fence *
@ -88,16 +92,23 @@ nouveau_fence_context_del(struct nouveau_fence_chan *fctx)
{ {
struct nouveau_fence *fence; struct nouveau_fence *fence;
nvif_notify_fini(&fctx->notify);
spin_lock_irq(&fctx->lock); spin_lock_irq(&fctx->lock);
while (!list_empty(&fctx->pending)) { while (!list_empty(&fctx->pending)) {
fence = list_entry(fctx->pending.next, typeof(*fence), head); fence = list_entry(fctx->pending.next, typeof(*fence), head);
nouveau_fence_signal(fence); if (nouveau_fence_signal(fence))
fence->channel = NULL; nvif_notify_put(&fctx->notify);
} }
spin_unlock_irq(&fctx->lock); spin_unlock_irq(&fctx->lock);
nvif_notify_fini(&fctx->notify);
fctx->dead = 1;
/*
* Ensure that all accesses to fence->channel complete before freeing
* the channel.
*/
synchronize_rcu();
} }
static void static void
@ -112,21 +123,23 @@ nouveau_fence_context_free(struct nouveau_fence_chan *fctx)
kref_put(&fctx->fence_ref, nouveau_fence_context_put); kref_put(&fctx->fence_ref, nouveau_fence_context_put);
} }
static void static int
nouveau_fence_update(struct nouveau_channel *chan, struct nouveau_fence_chan *fctx) nouveau_fence_update(struct nouveau_channel *chan, struct nouveau_fence_chan *fctx)
{ {
struct nouveau_fence *fence; struct nouveau_fence *fence;
int drop = 0;
u32 seq = fctx->read(chan); u32 seq = fctx->read(chan);
while (!list_empty(&fctx->pending)) { while (!list_empty(&fctx->pending)) {
fence = list_entry(fctx->pending.next, typeof(*fence), head); fence = list_entry(fctx->pending.next, typeof(*fence), head);
if ((int)(seq - fence->base.seqno) < 0) if ((int)(seq - fence->base.seqno) < 0)
return; break;
nouveau_fence_signal(fence); drop |= nouveau_fence_signal(fence);
} }
return drop;
} }
static int static int
@ -135,18 +148,21 @@ nouveau_fence_wait_uevent_handler(struct nvif_notify *notify)
struct nouveau_fence_chan *fctx = struct nouveau_fence_chan *fctx =
container_of(notify, typeof(*fctx), notify); container_of(notify, typeof(*fctx), notify);
unsigned long flags; unsigned long flags;
int ret = NVIF_NOTIFY_KEEP;
spin_lock_irqsave(&fctx->lock, flags); spin_lock_irqsave(&fctx->lock, flags);
if (!list_empty(&fctx->pending)) { if (!list_empty(&fctx->pending)) {
struct nouveau_fence *fence; struct nouveau_fence *fence;
struct nouveau_channel *chan;
fence = list_entry(fctx->pending.next, typeof(*fence), head); fence = list_entry(fctx->pending.next, typeof(*fence), head);
nouveau_fence_update(fence->channel, fctx); chan = rcu_dereference_protected(fence->channel, lockdep_is_held(&fctx->lock));
if (nouveau_fence_update(fence->channel, fctx))
ret = NVIF_NOTIFY_DROP;
} }
spin_unlock_irqrestore(&fctx->lock, flags); spin_unlock_irqrestore(&fctx->lock, flags);
/* Always return keep here. NVIF refcount is handled with nouveau_fence_update */ return ret;
return NVIF_NOTIFY_KEEP;
} }
void void
@ -262,7 +278,10 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)
if (!ret) { if (!ret) {
fence_get(&fence->base); fence_get(&fence->base);
spin_lock_irq(&fctx->lock); spin_lock_irq(&fctx->lock);
nouveau_fence_update(chan, fctx);
if (nouveau_fence_update(chan, fctx))
nvif_notify_put(&fctx->notify);
list_add_tail(&fence->head, &fctx->pending); list_add_tail(&fence->head, &fctx->pending);
spin_unlock_irq(&fctx->lock); spin_unlock_irq(&fctx->lock);
} }
@ -276,13 +295,16 @@ nouveau_fence_done(struct nouveau_fence *fence)
if (fence->base.ops == &nouveau_fence_ops_legacy || if (fence->base.ops == &nouveau_fence_ops_legacy ||
fence->base.ops == &nouveau_fence_ops_uevent) { fence->base.ops == &nouveau_fence_ops_uevent) {
struct nouveau_fence_chan *fctx = nouveau_fctx(fence); struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
struct nouveau_channel *chan;
unsigned long flags; unsigned long flags;
if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags)) if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags))
return true; return true;
spin_lock_irqsave(&fctx->lock, flags); spin_lock_irqsave(&fctx->lock, flags);
nouveau_fence_update(fence->channel, fctx); chan = rcu_dereference_protected(fence->channel, lockdep_is_held(&fctx->lock));
if (chan && nouveau_fence_update(chan, fctx))
nvif_notify_put(&fctx->notify);
spin_unlock_irqrestore(&fctx->lock, flags); spin_unlock_irqrestore(&fctx->lock, flags);
} }
return fence_is_signaled(&fence->base); return fence_is_signaled(&fence->base);
@ -387,12 +409,18 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
if (fence && (!exclusive || !fobj || !fobj->shared_count)) { if (fence && (!exclusive || !fobj || !fobj->shared_count)) {
struct nouveau_channel *prev = NULL; struct nouveau_channel *prev = NULL;
bool must_wait = true;
f = nouveau_local_fence(fence, chan->drm); f = nouveau_local_fence(fence, chan->drm);
if (f) if (f) {
prev = f->channel; rcu_read_lock();
prev = rcu_dereference(f->channel);
if (prev && (prev == chan || fctx->sync(f, prev, chan) == 0))
must_wait = false;
rcu_read_unlock();
}
if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan)))) if (must_wait)
ret = fence_wait(fence, intr); ret = fence_wait(fence, intr);
return ret; return ret;
@ -403,19 +431,22 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
for (i = 0; i < fobj->shared_count && !ret; ++i) { for (i = 0; i < fobj->shared_count && !ret; ++i) {
struct nouveau_channel *prev = NULL; struct nouveau_channel *prev = NULL;
bool must_wait = true;
fence = rcu_dereference_protected(fobj->shared[i], fence = rcu_dereference_protected(fobj->shared[i],
reservation_object_held(resv)); reservation_object_held(resv));
f = nouveau_local_fence(fence, chan->drm); f = nouveau_local_fence(fence, chan->drm);
if (f) if (f) {
prev = f->channel; rcu_read_lock();
prev = rcu_dereference(f->channel);
if (prev && (prev == chan || fctx->sync(f, prev, chan) == 0))
must_wait = false;
rcu_read_unlock();
}
if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan)))) if (must_wait)
ret = fence_wait(fence, intr); ret = fence_wait(fence, intr);
if (ret)
break;
} }
return ret; return ret;
@ -463,7 +494,7 @@ static const char *nouveau_fence_get_timeline_name(struct fence *f)
struct nouveau_fence *fence = from_fence(f); struct nouveau_fence *fence = from_fence(f);
struct nouveau_fence_chan *fctx = nouveau_fctx(fence); struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
return fence->channel ? fctx->name : "dead channel"; return !fctx->dead ? fctx->name : "dead channel";
} }
/* /*
@ -476,9 +507,16 @@ static bool nouveau_fence_is_signaled(struct fence *f)
{ {
struct nouveau_fence *fence = from_fence(f); struct nouveau_fence *fence = from_fence(f);
struct nouveau_fence_chan *fctx = nouveau_fctx(fence); struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
struct nouveau_channel *chan = fence->channel; struct nouveau_channel *chan;
bool ret = false;
return (int)(fctx->read(chan) - fence->base.seqno) >= 0; rcu_read_lock();
chan = rcu_dereference(fence->channel);
if (chan)
ret = (int)(fctx->read(chan) - fence->base.seqno) >= 0;
rcu_read_unlock();
return ret;
} }
static bool nouveau_fence_no_signaling(struct fence *f) static bool nouveau_fence_no_signaling(struct fence *f)

View File

@ -14,7 +14,7 @@ struct nouveau_fence {
bool sysmem; bool sysmem;
struct nouveau_channel *channel; struct nouveau_channel __rcu *channel;
unsigned long timeout; unsigned long timeout;
}; };
@ -47,7 +47,7 @@ struct nouveau_fence_chan {
char name[32]; char name[32];
struct nvif_notify notify; struct nvif_notify notify;
int notify_ref; int notify_ref, dead;
}; };
struct nouveau_fence_priv { struct nouveau_fence_priv {

View File

@ -322,6 +322,12 @@ static void radeon_connector_get_edid(struct drm_connector *connector)
} }
if (!radeon_connector->edid) { if (!radeon_connector->edid) {
/* don't fetch the edid from the vbios if ddc fails and runpm is
* enabled so we report disconnected.
*/
if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
return;
if (rdev->is_atom_bios) { if (rdev->is_atom_bios) {
/* some laptops provide a hardcoded edid in rom for LCDs */ /* some laptops provide a hardcoded edid in rom for LCDs */
if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) || if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) ||
@ -826,6 +832,8 @@ static int radeon_lvds_mode_valid(struct drm_connector *connector,
static enum drm_connector_status static enum drm_connector_status
radeon_lvds_detect(struct drm_connector *connector, bool force) radeon_lvds_detect(struct drm_connector *connector, bool force)
{ {
struct drm_device *dev = connector->dev;
struct radeon_device *rdev = dev->dev_private;
struct radeon_connector *radeon_connector = to_radeon_connector(connector); struct radeon_connector *radeon_connector = to_radeon_connector(connector);
struct drm_encoder *encoder = radeon_best_single_encoder(connector); struct drm_encoder *encoder = radeon_best_single_encoder(connector);
enum drm_connector_status ret = connector_status_disconnected; enum drm_connector_status ret = connector_status_disconnected;
@ -842,7 +850,11 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)
/* check if panel is valid */ /* check if panel is valid */
if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
ret = connector_status_connected; ret = connector_status_connected;
/* don't fetch the edid from the vbios if ddc fails and runpm is
* enabled so we report disconnected.
*/
if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
ret = connector_status_disconnected;
} }
/* check for edid as well */ /* check for edid as well */
@ -1589,6 +1601,11 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
/* check if panel is valid */ /* check if panel is valid */
if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
ret = connector_status_connected; ret = connector_status_connected;
/* don't fetch the edid from the vbios if ddc fails and runpm is
* enabled so we report disconnected.
*/
if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
ret = connector_status_disconnected;
} }
/* eDP is always DP */ /* eDP is always DP */
radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT; radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;

View File

@ -251,23 +251,20 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
static int radeon_cs_sync_rings(struct radeon_cs_parser *p) static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
{ {
int i, r = 0; struct radeon_cs_reloc *reloc;
int r;
for (i = 0; i < p->nrelocs; i++) { list_for_each_entry(reloc, &p->validated, tv.head) {
struct reservation_object *resv; struct reservation_object *resv;
if (!p->relocs[i].robj) resv = reloc->robj->tbo.resv;
continue;
resv = p->relocs[i].robj->tbo.resv;
r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv, r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
p->relocs[i].tv.shared); reloc->tv.shared);
if (r) if (r)
break;
}
return r; return r;
} }
return 0;
}
/* XXX: note that this is called from the legacy UMS CS ioctl as well */ /* XXX: note that this is called from the legacy UMS CS ioctl as well */
int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)

View File

@ -795,6 +795,8 @@ int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
/* Get associated drm_crtc: */ /* Get associated drm_crtc: */
drmcrtc = &rdev->mode_info.crtcs[crtc]->base; drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
if (!drmcrtc)
return -EINVAL;
/* Helper routine in DRM core does all the work: */ /* Helper routine in DRM core does all the work: */
return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,

View File

@ -213,6 +213,13 @@ int radeon_bo_create(struct radeon_device *rdev,
if (!(rdev->flags & RADEON_IS_PCIE)) if (!(rdev->flags & RADEON_IS_PCIE))
bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC); bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC);
#ifdef CONFIG_X86_32
/* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
* See https://bugs.freedesktop.org/show_bug.cgi?id=84627
*/
bo->flags &= ~RADEON_GEM_GTT_WC;
#endif
radeon_ttm_placement_from_domain(bo, domain); radeon_ttm_placement_from_domain(bo, domain);
/* Kernel allocation are uninterruptible */ /* Kernel allocation are uninterruptible */
down_read(&rdev->pm.mclk_lock); down_read(&rdev->pm.mclk_lock);

View File

@ -359,7 +359,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
} }
/* Configure Tx/Rx FIFO threshold levels */ /* Configure Tx/Rx FIFO threshold levels */
dw_writel(dev, dev->tx_fifo_depth - 1, DW_IC_TX_TL); dw_writel(dev, dev->tx_fifo_depth / 2, DW_IC_TX_TL);
dw_writel(dev, 0, DW_IC_RX_TL); dw_writel(dev, 0, DW_IC_RX_TL);
/* configure the i2c master */ /* configure the i2c master */

View File

@ -922,14 +922,12 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
if (stat & OMAP_I2C_STAT_NACK) { if (stat & OMAP_I2C_STAT_NACK) {
err |= OMAP_I2C_STAT_NACK; err |= OMAP_I2C_STAT_NACK;
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK);
break;
} }
if (stat & OMAP_I2C_STAT_AL) { if (stat & OMAP_I2C_STAT_AL) {
dev_err(dev->dev, "Arbitration lost\n"); dev_err(dev->dev, "Arbitration lost\n");
err |= OMAP_I2C_STAT_AL; err |= OMAP_I2C_STAT_AL;
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL);
break;
} }
/* /*
@ -954,11 +952,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
if (dev->fifo_size) if (dev->fifo_size)
num_bytes = dev->buf_len; num_bytes = dev->buf_len;
omap_i2c_receive_data(dev, num_bytes, true); if (dev->errata & I2C_OMAP_ERRATA_I207) {
if (dev->errata & I2C_OMAP_ERRATA_I207)
i2c_omap_errata_i207(dev, stat); i2c_omap_errata_i207(dev, stat);
num_bytes = (omap_i2c_read_reg(dev,
OMAP_I2C_BUFSTAT_REG) >> 8) & 0x3F;
}
omap_i2c_receive_data(dev, num_bytes, true);
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR);
continue; continue;
} }

View File

@ -421,7 +421,7 @@ static int evdev_open(struct inode *inode, struct file *file)
err_free_client: err_free_client:
evdev_detach_client(evdev, client); evdev_detach_client(evdev, client);
kfree(client); kvfree(client);
return error; return error;
} }

View File

@ -225,7 +225,12 @@ static int bond_changelink(struct net_device *bond_dev,
bond_option_arp_ip_targets_clear(bond); bond_option_arp_ip_targets_clear(bond);
nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) { nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) {
__be32 target = nla_get_be32(attr); __be32 target;
if (nla_len(attr) < sizeof(target))
return -EINVAL;
target = nla_get_be32(attr);
bond_opt_initval(&newval, (__force u64)target); bond_opt_initval(&newval, (__force u64)target);
err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS, err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS,

View File

@ -316,7 +316,7 @@ static int pcan_usb_get_serial(struct peak_usb_device *dev, u32 *serial_number)
if (err) { if (err) {
netdev_err(dev->netdev, "getting serial failure: %d\n", err); netdev_err(dev->netdev, "getting serial failure: %d\n", err);
} else if (serial_number) { } else if (serial_number) {
u32 tmp32; __le32 tmp32;
memcpy(&tmp32, args, 4); memcpy(&tmp32, args, 4);
*serial_number = le32_to_cpu(tmp32); *serial_number = le32_to_cpu(tmp32);
@ -347,7 +347,7 @@ static int pcan_usb_get_device_id(struct peak_usb_device *dev, u32 *device_id)
*/ */
static int pcan_usb_update_ts(struct pcan_usb_msg_context *mc) static int pcan_usb_update_ts(struct pcan_usb_msg_context *mc)
{ {
u16 tmp16; __le16 tmp16;
if ((mc->ptr+2) > mc->end) if ((mc->ptr+2) > mc->end)
return -EINVAL; return -EINVAL;
@ -371,7 +371,7 @@ static int pcan_usb_decode_ts(struct pcan_usb_msg_context *mc, u8 first_packet)
{ {
/* only 1st packet supplies a word timestamp */ /* only 1st packet supplies a word timestamp */
if (first_packet) { if (first_packet) {
u16 tmp16; __le16 tmp16;
if ((mc->ptr + 2) > mc->end) if ((mc->ptr + 2) > mc->end)
return -EINVAL; return -EINVAL;
@ -614,7 +614,7 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
return -ENOMEM; return -ENOMEM;
if (status_len & PCAN_USB_STATUSLEN_EXT_ID) { if (status_len & PCAN_USB_STATUSLEN_EXT_ID) {
u32 tmp32; __le32 tmp32;
if ((mc->ptr + 4) > mc->end) if ((mc->ptr + 4) > mc->end)
goto decode_failed; goto decode_failed;
@ -622,9 +622,9 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
memcpy(&tmp32, mc->ptr, 4); memcpy(&tmp32, mc->ptr, 4);
mc->ptr += 4; mc->ptr += 4;
cf->can_id = le32_to_cpu(tmp32 >> 3) | CAN_EFF_FLAG; cf->can_id = (le32_to_cpu(tmp32) >> 3) | CAN_EFF_FLAG;
} else { } else {
u16 tmp16; __le16 tmp16;
if ((mc->ptr + 2) > mc->end) if ((mc->ptr + 2) > mc->end)
goto decode_failed; goto decode_failed;
@ -632,7 +632,7 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
memcpy(&tmp16, mc->ptr, 2); memcpy(&tmp16, mc->ptr, 2);
mc->ptr += 2; mc->ptr += 2;
cf->can_id = le16_to_cpu(tmp16 >> 5); cf->can_id = le16_to_cpu(tmp16) >> 5;
} }
cf->can_dlc = get_can_dlc(rec_len); cf->can_dlc = get_can_dlc(rec_len);

View File

@ -735,7 +735,7 @@ static int peak_usb_create_dev(struct peak_usb_adapter *peak_usb_adapter,
dev->cmd_buf = kmalloc(PCAN_USB_MAX_CMD_LEN, GFP_KERNEL); dev->cmd_buf = kmalloc(PCAN_USB_MAX_CMD_LEN, GFP_KERNEL);
if (!dev->cmd_buf) { if (!dev->cmd_buf) {
err = -ENOMEM; err = -ENOMEM;
goto lbl_set_intf_data; goto lbl_free_candev;
} }
dev->udev = usb_dev; dev->udev = usb_dev;
@ -775,7 +775,7 @@ static int peak_usb_create_dev(struct peak_usb_adapter *peak_usb_adapter,
err = register_candev(netdev); err = register_candev(netdev);
if (err) { if (err) {
dev_err(&intf->dev, "couldn't register CAN device: %d\n", err); dev_err(&intf->dev, "couldn't register CAN device: %d\n", err);
goto lbl_free_cmd_buf; goto lbl_restore_intf_data;
} }
if (dev->prev_siblings) if (dev->prev_siblings)
@ -788,14 +788,14 @@ static int peak_usb_create_dev(struct peak_usb_adapter *peak_usb_adapter,
if (dev->adapter->dev_init) { if (dev->adapter->dev_init) {
err = dev->adapter->dev_init(dev); err = dev->adapter->dev_init(dev);
if (err) if (err)
goto lbl_free_cmd_buf; goto lbl_unregister_candev;
} }
/* set bus off */ /* set bus off */
if (dev->adapter->dev_set_bus) { if (dev->adapter->dev_set_bus) {
err = dev->adapter->dev_set_bus(dev, 0); err = dev->adapter->dev_set_bus(dev, 0);
if (err) if (err)
goto lbl_free_cmd_buf; goto lbl_unregister_candev;
} }
/* get device number early */ /* get device number early */
@ -807,11 +807,14 @@ static int peak_usb_create_dev(struct peak_usb_adapter *peak_usb_adapter,
return 0; return 0;
lbl_free_cmd_buf: lbl_unregister_candev:
unregister_candev(netdev);
lbl_restore_intf_data:
usb_set_intfdata(intf, dev->prev_siblings);
kfree(dev->cmd_buf); kfree(dev->cmd_buf);
lbl_set_intf_data: lbl_free_candev:
usb_set_intfdata(intf, dev->prev_siblings);
free_candev(netdev); free_candev(netdev);
return err; return err;
@ -853,6 +856,7 @@ static int peak_usb_probe(struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
struct usb_device *usb_dev = interface_to_usbdev(intf); struct usb_device *usb_dev = interface_to_usbdev(intf);
const u16 usb_id_product = le16_to_cpu(usb_dev->descriptor.idProduct);
struct peak_usb_adapter *peak_usb_adapter, **pp; struct peak_usb_adapter *peak_usb_adapter, **pp;
int i, err = -ENOMEM; int i, err = -ENOMEM;
@ -860,7 +864,7 @@ static int peak_usb_probe(struct usb_interface *intf,
/* get corresponding PCAN-USB adapter */ /* get corresponding PCAN-USB adapter */
for (pp = peak_usb_adapters_list; *pp; pp++) for (pp = peak_usb_adapters_list; *pp; pp++)
if ((*pp)->device_id == usb_dev->descriptor.idProduct) if ((*pp)->device_id == usb_id_product)
break; break;
peak_usb_adapter = *pp; peak_usb_adapter = *pp;

View File

@ -78,8 +78,8 @@ struct pcan_usb_pro_msg {
int rec_buffer_size; int rec_buffer_size;
int rec_buffer_len; int rec_buffer_len;
union { union {
u16 *rec_cnt_rd; __le16 *rec_cnt_rd;
u32 *rec_cnt; __le32 *rec_cnt;
u8 *rec_buffer; u8 *rec_buffer;
} u; } u;
}; };
@ -155,7 +155,7 @@ static int pcan_msg_add_rec(struct pcan_usb_pro_msg *pm, u8 id, ...)
*pc++ = va_arg(ap, int); *pc++ = va_arg(ap, int);
*pc++ = va_arg(ap, int); *pc++ = va_arg(ap, int);
*pc++ = va_arg(ap, int); *pc++ = va_arg(ap, int);
*(u32 *)pc = cpu_to_le32(va_arg(ap, u32)); *(__le32 *)pc = cpu_to_le32(va_arg(ap, u32));
pc += 4; pc += 4;
memcpy(pc, va_arg(ap, int *), i); memcpy(pc, va_arg(ap, int *), i);
pc += i; pc += i;
@ -165,7 +165,7 @@ static int pcan_msg_add_rec(struct pcan_usb_pro_msg *pm, u8 id, ...)
case PCAN_USBPRO_GETDEVID: case PCAN_USBPRO_GETDEVID:
*pc++ = va_arg(ap, int); *pc++ = va_arg(ap, int);
pc += 2; pc += 2;
*(u32 *)pc = cpu_to_le32(va_arg(ap, u32)); *(__le32 *)pc = cpu_to_le32(va_arg(ap, u32));
pc += 4; pc += 4;
break; break;
@ -173,21 +173,21 @@ static int pcan_msg_add_rec(struct pcan_usb_pro_msg *pm, u8 id, ...)
case PCAN_USBPRO_SETBUSACT: case PCAN_USBPRO_SETBUSACT:
case PCAN_USBPRO_SETSILENT: case PCAN_USBPRO_SETSILENT:
*pc++ = va_arg(ap, int); *pc++ = va_arg(ap, int);
*(u16 *)pc = cpu_to_le16(va_arg(ap, int)); *(__le16 *)pc = cpu_to_le16(va_arg(ap, int));
pc += 2; pc += 2;
break; break;
case PCAN_USBPRO_SETLED: case PCAN_USBPRO_SETLED:
*pc++ = va_arg(ap, int); *pc++ = va_arg(ap, int);
*(u16 *)pc = cpu_to_le16(va_arg(ap, int)); *(__le16 *)pc = cpu_to_le16(va_arg(ap, int));
pc += 2; pc += 2;
*(u32 *)pc = cpu_to_le32(va_arg(ap, u32)); *(__le32 *)pc = cpu_to_le32(va_arg(ap, u32));
pc += 4; pc += 4;
break; break;
case PCAN_USBPRO_SETTS: case PCAN_USBPRO_SETTS:
pc++; pc++;
*(u16 *)pc = cpu_to_le16(va_arg(ap, int)); *(__le16 *)pc = cpu_to_le16(va_arg(ap, int));
pc += 2; pc += 2;
break; break;
@ -200,7 +200,7 @@ static int pcan_msg_add_rec(struct pcan_usb_pro_msg *pm, u8 id, ...)
len = pc - pm->rec_ptr; len = pc - pm->rec_ptr;
if (len > 0) { if (len > 0) {
*pm->u.rec_cnt = cpu_to_le32(*pm->u.rec_cnt+1); *pm->u.rec_cnt = cpu_to_le32(le32_to_cpu(*pm->u.rec_cnt) + 1);
*pm->rec_ptr = id; *pm->rec_ptr = id;
pm->rec_ptr = pc; pm->rec_ptr = pc;
@ -333,8 +333,6 @@ static int pcan_usb_pro_send_req(struct peak_usb_device *dev, int req_id,
if (!(dev->state & PCAN_USB_STATE_CONNECTED)) if (!(dev->state & PCAN_USB_STATE_CONNECTED))
return 0; return 0;
memset(req_addr, '\0', req_size);
req_type = USB_TYPE_VENDOR | USB_RECIP_OTHER; req_type = USB_TYPE_VENDOR | USB_RECIP_OTHER;
switch (req_id) { switch (req_id) {
@ -345,6 +343,7 @@ static int pcan_usb_pro_send_req(struct peak_usb_device *dev, int req_id,
default: default:
p = usb_rcvctrlpipe(dev->udev, 0); p = usb_rcvctrlpipe(dev->udev, 0);
req_type |= USB_DIR_IN; req_type |= USB_DIR_IN;
memset(req_addr, '\0', req_size);
break; break;
} }
@ -572,7 +571,7 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if,
static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if, static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if,
struct pcan_usb_pro_rxstatus *er) struct pcan_usb_pro_rxstatus *er)
{ {
const u32 raw_status = le32_to_cpu(er->status); const u16 raw_status = le16_to_cpu(er->status);
const unsigned int ctrl_idx = (er->channel >> 4) & 0x0f; const unsigned int ctrl_idx = (er->channel >> 4) & 0x0f;
struct peak_usb_device *dev = usb_if->dev[ctrl_idx]; struct peak_usb_device *dev = usb_if->dev[ctrl_idx];
struct net_device *netdev = dev->netdev; struct net_device *netdev = dev->netdev;

View File

@ -33,27 +33,27 @@
/* PCAN_USBPRO_INFO_BL vendor request record type */ /* PCAN_USBPRO_INFO_BL vendor request record type */
struct __packed pcan_usb_pro_blinfo { struct __packed pcan_usb_pro_blinfo {
u32 ctrl_type; __le32 ctrl_type;
u8 version[4]; u8 version[4];
u8 day; u8 day;
u8 month; u8 month;
u8 year; u8 year;
u8 dummy; u8 dummy;
u32 serial_num_hi; __le32 serial_num_hi;
u32 serial_num_lo; __le32 serial_num_lo;
u32 hw_type; __le32 hw_type;
u32 hw_rev; __le32 hw_rev;
}; };
/* PCAN_USBPRO_INFO_FW vendor request record type */ /* PCAN_USBPRO_INFO_FW vendor request record type */
struct __packed pcan_usb_pro_fwinfo { struct __packed pcan_usb_pro_fwinfo {
u32 ctrl_type; __le32 ctrl_type;
u8 version[4]; u8 version[4];
u8 day; u8 day;
u8 month; u8 month;
u8 year; u8 year;
u8 dummy; u8 dummy;
u32 fw_type; __le32 fw_type;
}; };
/* /*
@ -80,46 +80,46 @@ struct __packed pcan_usb_pro_fwinfo {
struct __packed pcan_usb_pro_btr { struct __packed pcan_usb_pro_btr {
u8 data_type; u8 data_type;
u8 channel; u8 channel;
u16 dummy; __le16 dummy;
u32 CCBT; __le32 CCBT;
}; };
struct __packed pcan_usb_pro_busact { struct __packed pcan_usb_pro_busact {
u8 data_type; u8 data_type;
u8 channel; u8 channel;
u16 onoff; __le16 onoff;
}; };
struct __packed pcan_usb_pro_silent { struct __packed pcan_usb_pro_silent {
u8 data_type; u8 data_type;
u8 channel; u8 channel;
u16 onoff; __le16 onoff;
}; };
struct __packed pcan_usb_pro_filter { struct __packed pcan_usb_pro_filter {
u8 data_type; u8 data_type;
u8 dummy; u8 dummy;
u16 filter_mode; __le16 filter_mode;
}; };
struct __packed pcan_usb_pro_setts { struct __packed pcan_usb_pro_setts {
u8 data_type; u8 data_type;
u8 dummy; u8 dummy;
u16 mode; __le16 mode;
}; };
struct __packed pcan_usb_pro_devid { struct __packed pcan_usb_pro_devid {
u8 data_type; u8 data_type;
u8 channel; u8 channel;
u16 dummy; __le16 dummy;
u32 serial_num; __le32 serial_num;
}; };
struct __packed pcan_usb_pro_setled { struct __packed pcan_usb_pro_setled {
u8 data_type; u8 data_type;
u8 channel; u8 channel;
u16 mode; __le16 mode;
u32 timeout; __le32 timeout;
}; };
struct __packed pcan_usb_pro_rxmsg { struct __packed pcan_usb_pro_rxmsg {
@ -127,8 +127,8 @@ struct __packed pcan_usb_pro_rxmsg {
u8 client; u8 client;
u8 flags; u8 flags;
u8 len; u8 len;
u32 ts32; __le32 ts32;
u32 id; __le32 id;
u8 data[8]; u8 data[8];
}; };
@ -141,15 +141,15 @@ struct __packed pcan_usb_pro_rxmsg {
struct __packed pcan_usb_pro_rxstatus { struct __packed pcan_usb_pro_rxstatus {
u8 data_type; u8 data_type;
u8 channel; u8 channel;
u16 status; __le16 status;
u32 ts32; __le32 ts32;
u32 err_frm; __le32 err_frm;
}; };
struct __packed pcan_usb_pro_rxts { struct __packed pcan_usb_pro_rxts {
u8 data_type; u8 data_type;
u8 dummy[3]; u8 dummy[3];
u32 ts64[2]; __le32 ts64[2];
}; };
struct __packed pcan_usb_pro_txmsg { struct __packed pcan_usb_pro_txmsg {
@ -157,7 +157,7 @@ struct __packed pcan_usb_pro_txmsg {
u8 client; u8 client;
u8 flags; u8 flags;
u8 len; u8 len;
u32 id; __le32 id;
u8 data[8]; u8 data[8];
}; };

View File

@ -473,7 +473,6 @@ static void xgbe_unmap_rdata(struct xgbe_prv_data *pdata,
memset(&rdata->tx, 0, sizeof(rdata->tx)); memset(&rdata->tx, 0, sizeof(rdata->tx));
memset(&rdata->rx, 0, sizeof(rdata->rx)); memset(&rdata->rx, 0, sizeof(rdata->rx));
rdata->interrupt = 0;
rdata->mapped_as_page = 0; rdata->mapped_as_page = 0;
if (rdata->state_saved) { if (rdata->state_saved) {
@ -597,7 +596,11 @@ static int xgbe_map_tx_skb(struct xgbe_channel *channel, struct sk_buff *skb)
} }
} }
/* Save the skb address in the last entry */ /* Save the skb address in the last entry. We always have some data
* that has been mapped so rdata is always advanced past the last
* piece of mapped data - use the entry pointed to by cur_index - 1.
*/
rdata = XGBE_GET_DESC_DATA(ring, cur_index - 1);
rdata->skb = skb; rdata->skb = skb;
/* Save the number of descriptor entries used */ /* Save the number of descriptor entries used */

View File

@ -1839,7 +1839,7 @@ static int xgbe_tx_poll(struct xgbe_channel *channel)
spin_lock_irqsave(&ring->lock, flags); spin_lock_irqsave(&ring->lock, flags);
while ((processed < XGBE_TX_DESC_MAX_PROC) && while ((processed < XGBE_TX_DESC_MAX_PROC) &&
(ring->dirty < ring->cur)) { (ring->dirty != ring->cur)) {
rdata = XGBE_GET_DESC_DATA(ring, ring->dirty); rdata = XGBE_GET_DESC_DATA(ring, ring->dirty);
rdesc = rdata->rdesc; rdesc = rdata->rdesc;

View File

@ -8119,10 +8119,11 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
case SFP_EEPROM_CON_TYPE_VAL_LC: case SFP_EEPROM_CON_TYPE_VAL_LC:
case SFP_EEPROM_CON_TYPE_VAL_RJ45: case SFP_EEPROM_CON_TYPE_VAL_RJ45:
check_limiting_mode = 1; check_limiting_mode = 1;
if ((val[SFP_EEPROM_10G_COMP_CODE_ADDR] & if (((val[SFP_EEPROM_10G_COMP_CODE_ADDR] &
(SFP_EEPROM_10G_COMP_CODE_SR_MASK | (SFP_EEPROM_10G_COMP_CODE_SR_MASK |
SFP_EEPROM_10G_COMP_CODE_LR_MASK | SFP_EEPROM_10G_COMP_CODE_LR_MASK |
SFP_EEPROM_10G_COMP_CODE_LRM_MASK)) == 0) { SFP_EEPROM_10G_COMP_CODE_LRM_MASK)) == 0) &&
(val[SFP_EEPROM_1G_COMP_CODE_ADDR] != 0)) {
DP(NETIF_MSG_LINK, "1G SFP module detected\n"); DP(NETIF_MSG_LINK, "1G SFP module detected\n");
phy->media_type = ETH_PHY_SFP_1G_FIBER; phy->media_type = ETH_PHY_SFP_1G_FIBER;
if (phy->req_line_speed != SPEED_1000) { if (phy->req_line_speed != SPEED_1000) {

View File

@ -45,6 +45,7 @@
#include <net/ip.h> #include <net/ip.h>
#include <net/ipv6.h> #include <net/ipv6.h>
#include <net/tcp.h> #include <net/tcp.h>
#include <net/vxlan.h>
#include <net/checksum.h> #include <net/checksum.h>
#include <net/ip6_checksum.h> #include <net/ip6_checksum.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
@ -12552,6 +12553,11 @@ static int bnx2x_get_phys_port_id(struct net_device *netdev,
return 0; return 0;
} }
static bool bnx2x_gso_check(struct sk_buff *skb, struct net_device *dev)
{
return vxlan_gso_check(skb);
}
static const struct net_device_ops bnx2x_netdev_ops = { static const struct net_device_ops bnx2x_netdev_ops = {
.ndo_open = bnx2x_open, .ndo_open = bnx2x_open,
.ndo_stop = bnx2x_close, .ndo_stop = bnx2x_close,
@ -12583,6 +12589,7 @@ static const struct net_device_ops bnx2x_netdev_ops = {
#endif #endif
.ndo_get_phys_port_id = bnx2x_get_phys_port_id, .ndo_get_phys_port_id = bnx2x_get_phys_port_id,
.ndo_set_vf_link_state = bnx2x_set_vf_link_state, .ndo_set_vf_link_state = bnx2x_set_vf_link_state,
.ndo_gso_check = bnx2x_gso_check,
}; };
static int bnx2x_set_coherency_mask(struct bnx2x *bp) static int bnx2x_set_coherency_mask(struct bnx2x *bp)

View File

@ -50,13 +50,13 @@
#include "cxgb4_uld.h" #include "cxgb4_uld.h"
#define T4FW_VERSION_MAJOR 0x01 #define T4FW_VERSION_MAJOR 0x01
#define T4FW_VERSION_MINOR 0x0B #define T4FW_VERSION_MINOR 0x0C
#define T4FW_VERSION_MICRO 0x1B #define T4FW_VERSION_MICRO 0x19
#define T4FW_VERSION_BUILD 0x00 #define T4FW_VERSION_BUILD 0x00
#define T5FW_VERSION_MAJOR 0x01 #define T5FW_VERSION_MAJOR 0x01
#define T5FW_VERSION_MINOR 0x0B #define T5FW_VERSION_MINOR 0x0C
#define T5FW_VERSION_MICRO 0x1B #define T5FW_VERSION_MICRO 0x19
#define T5FW_VERSION_BUILD 0x00 #define T5FW_VERSION_BUILD 0x00
#define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__) #define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__)

View File

@ -2354,9 +2354,13 @@ static unsigned int from_fw_linkcaps(unsigned int type, unsigned int caps)
SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full | SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full |
SUPPORTED_10000baseKX4_Full; SUPPORTED_10000baseKX4_Full;
else if (type == FW_PORT_TYPE_FIBER_XFI || else if (type == FW_PORT_TYPE_FIBER_XFI ||
type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP) type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP) {
v |= SUPPORTED_FIBRE; v |= SUPPORTED_FIBRE;
else if (type == FW_PORT_TYPE_BP40_BA) if (caps & FW_PORT_CAP_SPEED_1G)
v |= SUPPORTED_1000baseT_Full;
if (caps & FW_PORT_CAP_SPEED_10G)
v |= SUPPORTED_10000baseT_Full;
} else if (type == FW_PORT_TYPE_BP40_BA)
v |= SUPPORTED_40000baseSR4_Full; v |= SUPPORTED_40000baseSR4_Full;
if (caps & FW_PORT_CAP_ANEG) if (caps & FW_PORT_CAP_ANEG)

View File

@ -1132,6 +1132,27 @@ unsigned int t4_flash_cfg_addr(struct adapter *adapter)
return FLASH_CFG_START; return FLASH_CFG_START;
} }
/* Return TRUE if the specified firmware matches the adapter. I.e. T4
* firmware for T4 adapters, T5 firmware for T5 adapters, etc. We go ahead
* and emit an error message for mismatched firmware to save our caller the
* effort ...
*/
static bool t4_fw_matches_chip(const struct adapter *adap,
const struct fw_hdr *hdr)
{
/* The expression below will return FALSE for any unsupported adapter
* which will keep us "honest" in the future ...
*/
if ((is_t4(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T4) ||
(is_t5(adap->params.chip) && hdr->chip == FW_HDR_CHIP_T5))
return true;
dev_err(adap->pdev_dev,
"FW image (%d) is not suitable for this adapter (%d)\n",
hdr->chip, CHELSIO_CHIP_VERSION(adap->params.chip));
return false;
}
/** /**
* t4_load_fw - download firmware * t4_load_fw - download firmware
* @adap: the adapter * @adap: the adapter
@ -1171,6 +1192,8 @@ int t4_load_fw(struct adapter *adap, const u8 *fw_data, unsigned int size)
FW_MAX_SIZE); FW_MAX_SIZE);
return -EFBIG; return -EFBIG;
} }
if (!t4_fw_matches_chip(adap, hdr))
return -EINVAL;
for (csum = 0, i = 0; i < size / sizeof(csum); i++) for (csum = 0, i = 0; i < size / sizeof(csum); i++)
csum += ntohl(p[i]); csum += ntohl(p[i]);
@ -3083,6 +3106,9 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data; const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data;
int reset, ret; int reset, ret;
if (!t4_fw_matches_chip(adap, fw_hdr))
return -EINVAL;
ret = t4_fw_halt(adap, mbox, force); ret = t4_fw_halt(adap, mbox, force);
if (ret < 0 && !force) if (ret < 0 && !force)
return ret; return ret;

View File

@ -216,7 +216,7 @@
/* Various constants */ /* Various constants */
/* Coalescing */ /* Coalescing */
#define MVNETA_TXDONE_COAL_PKTS 16 #define MVNETA_TXDONE_COAL_PKTS 1
#define MVNETA_RX_COAL_PKTS 32 #define MVNETA_RX_COAL_PKTS 32
#define MVNETA_RX_COAL_USEC 100 #define MVNETA_RX_COAL_USEC 100
@ -1721,6 +1721,7 @@ static int mvneta_tx(struct sk_buff *skb, struct net_device *dev)
u16 txq_id = skb_get_queue_mapping(skb); u16 txq_id = skb_get_queue_mapping(skb);
struct mvneta_tx_queue *txq = &pp->txqs[txq_id]; struct mvneta_tx_queue *txq = &pp->txqs[txq_id];
struct mvneta_tx_desc *tx_desc; struct mvneta_tx_desc *tx_desc;
int len = skb->len;
int frags = 0; int frags = 0;
u32 tx_cmd; u32 tx_cmd;
@ -1788,7 +1789,7 @@ out:
u64_stats_update_begin(&stats->syncp); u64_stats_update_begin(&stats->syncp);
stats->tx_packets++; stats->tx_packets++;
stats->tx_bytes += skb->len; stats->tx_bytes += len;
u64_stats_update_end(&stats->syncp); u64_stats_update_end(&stats->syncp);
} else { } else {
dev->stats.tx_dropped++; dev->stats.tx_dropped++;

View File

@ -1173,8 +1173,8 @@ static int pxa168_eth_open(struct net_device *dev)
pep->rx_used_desc_q = 0; pep->rx_used_desc_q = 0;
pep->rx_curr_desc_q = 0; pep->rx_curr_desc_q = 0;
netif_carrier_off(dev); netif_carrier_off(dev);
eth_port_start(dev);
napi_enable(&pep->napi); napi_enable(&pep->napi);
eth_port_start(dev);
return 0; return 0;
out_free_rx_skb: out_free_rx_skb:
rxq_deinit(dev); rxq_deinit(dev);

View File

@ -3433,10 +3433,9 @@ static irqreturn_t skge_intr(int irq, void *dev_id)
if (status & IS_HW_ERR) if (status & IS_HW_ERR)
skge_error_irq(hw); skge_error_irq(hw);
out:
skge_write32(hw, B0_IMSK, hw->intr_mask); skge_write32(hw, B0_IMSK, hw->intr_mask);
skge_read32(hw, B0_IMSK); skge_read32(hw, B0_IMSK);
out:
spin_unlock(&hw->hw_lock); spin_unlock(&hw->hw_lock);
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);

View File

@ -2416,6 +2416,7 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu)
imask = sky2_read32(hw, B0_IMSK); imask = sky2_read32(hw, B0_IMSK);
sky2_write32(hw, B0_IMSK, 0); sky2_write32(hw, B0_IMSK, 0);
sky2_read32(hw, B0_IMSK);
dev->trans_start = jiffies; /* prevent tx timeout */ dev->trans_start = jiffies; /* prevent tx timeout */
napi_disable(&hw->napi); napi_disable(&hw->napi);
@ -3484,8 +3485,8 @@ static void sky2_all_down(struct sky2_hw *hw)
int i; int i;
if (hw->flags & SKY2_HW_IRQ_SETUP) { if (hw->flags & SKY2_HW_IRQ_SETUP) {
sky2_read32(hw, B0_IMSK);
sky2_write32(hw, B0_IMSK, 0); sky2_write32(hw, B0_IMSK, 0);
sky2_read32(hw, B0_IMSK);
synchronize_irq(hw->pdev->irq); synchronize_irq(hw->pdev->irq);
napi_disable(&hw->napi); napi_disable(&hw->napi);

View File

@ -918,21 +918,13 @@ static int sh_eth_reset(struct net_device *ndev)
return ret; return ret;
} }
#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
static void sh_eth_set_receive_align(struct sk_buff *skb) static void sh_eth_set_receive_align(struct sk_buff *skb)
{ {
int reserve; uintptr_t reserve = (uintptr_t)skb->data & (SH_ETH_RX_ALIGN - 1);
reserve = SH4_SKB_RX_ALIGN - ((u32)skb->data & (SH4_SKB_RX_ALIGN - 1));
if (reserve) if (reserve)
skb_reserve(skb, reserve); skb_reserve(skb, SH_ETH_RX_ALIGN - reserve);
} }
#else
static void sh_eth_set_receive_align(struct sk_buff *skb)
{
skb_reserve(skb, SH2_SH3_SKB_RX_ALIGN);
}
#endif
/* CPU <-> EDMAC endian convert */ /* CPU <-> EDMAC endian convert */
@ -1120,6 +1112,7 @@ static void sh_eth_ring_format(struct net_device *ndev)
struct sh_eth_txdesc *txdesc = NULL; struct sh_eth_txdesc *txdesc = NULL;
int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring; int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring;
int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring; int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring;
int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1;
mdp->cur_rx = 0; mdp->cur_rx = 0;
mdp->cur_tx = 0; mdp->cur_tx = 0;
@ -1132,21 +1125,21 @@ static void sh_eth_ring_format(struct net_device *ndev)
for (i = 0; i < mdp->num_rx_ring; i++) { for (i = 0; i < mdp->num_rx_ring; i++) {
/* skb */ /* skb */
mdp->rx_skbuff[i] = NULL; mdp->rx_skbuff[i] = NULL;
skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz); skb = netdev_alloc_skb(ndev, skbuff_size);
mdp->rx_skbuff[i] = skb; mdp->rx_skbuff[i] = skb;
if (skb == NULL) if (skb == NULL)
break; break;
dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
DMA_FROM_DEVICE);
sh_eth_set_receive_align(skb); sh_eth_set_receive_align(skb);
/* RX descriptor */ /* RX descriptor */
rxdesc = &mdp->rx_ring[i]; rxdesc = &mdp->rx_ring[i];
/* The size of the buffer is a multiple of 16 bytes. */
rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
dma_map_single(&ndev->dev, skb->data, rxdesc->buffer_length,
DMA_FROM_DEVICE);
rxdesc->addr = virt_to_phys(skb->data); rxdesc->addr = virt_to_phys(skb->data);
rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP);
/* The size of the buffer is 16 byte boundary. */
rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
/* Rx descriptor address set */ /* Rx descriptor address set */
if (i == 0) { if (i == 0) {
sh_eth_write(ndev, mdp->rx_desc_dma, RDLAR); sh_eth_write(ndev, mdp->rx_desc_dma, RDLAR);
@ -1399,6 +1392,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
struct sk_buff *skb; struct sk_buff *skb;
u16 pkt_len = 0; u16 pkt_len = 0;
u32 desc_status; u32 desc_status;
int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1;
boguscnt = min(boguscnt, *quota); boguscnt = min(boguscnt, *quota);
limit = boguscnt; limit = boguscnt;
@ -1447,7 +1441,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
if (mdp->cd->rpadir) if (mdp->cd->rpadir)
skb_reserve(skb, NET_IP_ALIGN); skb_reserve(skb, NET_IP_ALIGN);
dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr, dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr,
mdp->rx_buf_sz, ALIGN(mdp->rx_buf_sz, 16),
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
skb_put(skb, pkt_len); skb_put(skb, pkt_len);
skb->protocol = eth_type_trans(skb, ndev); skb->protocol = eth_type_trans(skb, ndev);
@ -1467,13 +1461,13 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
if (mdp->rx_skbuff[entry] == NULL) { if (mdp->rx_skbuff[entry] == NULL) {
skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz); skb = netdev_alloc_skb(ndev, skbuff_size);
mdp->rx_skbuff[entry] = skb; mdp->rx_skbuff[entry] = skb;
if (skb == NULL) if (skb == NULL)
break; /* Better luck next round. */ break; /* Better luck next round. */
dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
DMA_FROM_DEVICE);
sh_eth_set_receive_align(skb); sh_eth_set_receive_align(skb);
dma_map_single(&ndev->dev, skb->data,
rxdesc->buffer_length, DMA_FROM_DEVICE);
skb_checksum_none_assert(skb); skb_checksum_none_assert(skb);
rxdesc->addr = virt_to_phys(skb->data); rxdesc->addr = virt_to_phys(skb->data);
@ -2043,6 +2037,8 @@ static int sh_eth_open(struct net_device *ndev)
if (ret) if (ret)
goto out_free_irq; goto out_free_irq;
mdp->is_opened = 1;
return ret; return ret;
out_free_irq: out_free_irq:
@ -2132,6 +2128,36 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev)
{
struct sh_eth_private *mdp = netdev_priv(ndev);
if (sh_eth_is_rz_fast_ether(mdp))
return &ndev->stats;
if (!mdp->is_opened)
return &ndev->stats;
ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR);
sh_eth_write(ndev, 0, TROCR); /* (write clear) */
ndev->stats.collisions += sh_eth_read(ndev, CDCR);
sh_eth_write(ndev, 0, CDCR); /* (write clear) */
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
sh_eth_write(ndev, 0, LCCR); /* (write clear) */
if (sh_eth_is_gether(mdp)) {
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
sh_eth_write(ndev, 0, CERCR); /* (write clear) */
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
sh_eth_write(ndev, 0, CEECR); /* (write clear) */
} else {
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
sh_eth_write(ndev, 0, CNDCR); /* (write clear) */
}
return &ndev->stats;
}
/* device close function */ /* device close function */
static int sh_eth_close(struct net_device *ndev) static int sh_eth_close(struct net_device *ndev)
{ {
@ -2146,6 +2172,7 @@ static int sh_eth_close(struct net_device *ndev)
sh_eth_write(ndev, 0, EDTRR); sh_eth_write(ndev, 0, EDTRR);
sh_eth_write(ndev, 0, EDRRR); sh_eth_write(ndev, 0, EDRRR);
sh_eth_get_stats(ndev);
/* PHY Disconnect */ /* PHY Disconnect */
if (mdp->phydev) { if (mdp->phydev) {
phy_stop(mdp->phydev); phy_stop(mdp->phydev);
@ -2164,38 +2191,11 @@ static int sh_eth_close(struct net_device *ndev)
pm_runtime_put_sync(&mdp->pdev->dev); pm_runtime_put_sync(&mdp->pdev->dev);
mdp->is_opened = 0;
return 0; return 0;
} }
static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev)
{
struct sh_eth_private *mdp = netdev_priv(ndev);
if (sh_eth_is_rz_fast_ether(mdp))
return &ndev->stats;
pm_runtime_get_sync(&mdp->pdev->dev);
ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR);
sh_eth_write(ndev, 0, TROCR); /* (write clear) */
ndev->stats.collisions += sh_eth_read(ndev, CDCR);
sh_eth_write(ndev, 0, CDCR); /* (write clear) */
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
sh_eth_write(ndev, 0, LCCR); /* (write clear) */
if (sh_eth_is_gether(mdp)) {
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
sh_eth_write(ndev, 0, CERCR); /* (write clear) */
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
sh_eth_write(ndev, 0, CEECR); /* (write clear) */
} else {
ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
sh_eth_write(ndev, 0, CNDCR); /* (write clear) */
}
pm_runtime_put_sync(&mdp->pdev->dev);
return &ndev->stats;
}
/* ioctl to device function */ /* ioctl to device function */
static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
{ {

View File

@ -162,9 +162,9 @@ enum {
/* Driver's parameters */ /* Driver's parameters */
#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
#define SH4_SKB_RX_ALIGN 32 #define SH_ETH_RX_ALIGN 32
#else #else
#define SH2_SH3_SKB_RX_ALIGN 2 #define SH_ETH_RX_ALIGN 2
#endif #endif
/* Register's bits /* Register's bits
@ -522,6 +522,7 @@ struct sh_eth_private {
unsigned no_ether_link:1; unsigned no_ether_link:1;
unsigned ether_link_active_low:1; unsigned ether_link_active_low:1;
unsigned is_opened:1;
}; };
static inline void sh_eth_soft_swap(char *src, int len) static inline void sh_eth_soft_swap(char *src, int len)

View File

@ -696,7 +696,7 @@ static int stmmac_set_coalesce(struct net_device *dev,
(ec->tx_max_coalesced_frames == 0)) (ec->tx_max_coalesced_frames == 0))
return -EINVAL; return -EINVAL;
if ((ec->tx_coalesce_usecs > STMMAC_COAL_TX_TIMER) || if ((ec->tx_coalesce_usecs > STMMAC_MAX_COAL_TX_TICK) ||
(ec->tx_max_coalesced_frames > STMMAC_TX_MAX_FRAMES)) (ec->tx_max_coalesced_frames > STMMAC_TX_MAX_FRAMES))
return -EINVAL; return -EINVAL;

View File

@ -276,13 +276,6 @@ static int stmmac_pltfr_probe(struct platform_device *pdev)
plat_dat = dev_get_platdata(&pdev->dev); plat_dat = dev_get_platdata(&pdev->dev);
/* Set default value for multicast hash bins */
plat_dat->multicast_filter_bins = HASH_TABLE_SIZE;
/* Set default value for unicast filter entries */
plat_dat->unicast_filter_entries = 1;
if (pdev->dev.of_node) {
if (!plat_dat) if (!plat_dat)
plat_dat = devm_kzalloc(&pdev->dev, plat_dat = devm_kzalloc(&pdev->dev,
sizeof(struct plat_stmmacenet_data), sizeof(struct plat_stmmacenet_data),
@ -292,6 +285,13 @@ static int stmmac_pltfr_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
} }
/* Set default value for multicast hash bins */
plat_dat->multicast_filter_bins = HASH_TABLE_SIZE;
/* Set default value for unicast filter entries */
plat_dat->unicast_filter_entries = 1;
if (pdev->dev.of_node) {
ret = stmmac_probe_config_dt(pdev, plat_dat, &mac); ret = stmmac_probe_config_dt(pdev, plat_dat, &mac);
if (ret) { if (ret) {
pr_err("%s: main dt probe failed", __func__); pr_err("%s: main dt probe failed", __func__);

View File

@ -404,6 +404,7 @@ static int backend_create_xenvif(struct backend_info *be)
int err; int err;
long handle; long handle;
struct xenbus_device *dev = be->dev; struct xenbus_device *dev = be->dev;
struct xenvif *vif;
if (be->vif != NULL) if (be->vif != NULL)
return 0; return 0;
@ -414,13 +415,13 @@ static int backend_create_xenvif(struct backend_info *be)
return (err < 0) ? err : -EINVAL; return (err < 0) ? err : -EINVAL;
} }
be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle); vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
if (IS_ERR(be->vif)) { if (IS_ERR(vif)) {
err = PTR_ERR(be->vif); err = PTR_ERR(vif);
be->vif = NULL;
xenbus_dev_fatal(dev, err, "creating interface"); xenbus_dev_fatal(dev, err, "creating interface");
return err; return err;
} }
be->vif = vif;
kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE); kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
return 0; return 0;

View File

@ -473,9 +473,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue,
len = skb_frag_size(frag); len = skb_frag_size(frag);
offset = frag->page_offset; offset = frag->page_offset;
/* Data must not cross a page boundary. */
BUG_ON(len + offset > PAGE_SIZE<<compound_order(page));
/* Skip unused frames from start of page */ /* Skip unused frames from start of page */
page += offset >> PAGE_SHIFT; page += offset >> PAGE_SHIFT;
offset &= ~PAGE_MASK; offset &= ~PAGE_MASK;
@ -483,8 +480,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue,
while (len > 0) { while (len > 0) {
unsigned long bytes; unsigned long bytes;
BUG_ON(offset >= PAGE_SIZE);
bytes = PAGE_SIZE - offset; bytes = PAGE_SIZE - offset;
if (bytes > len) if (bytes > len)
bytes = len; bytes = len;
@ -609,6 +604,9 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
slots, skb->len); slots, skb->len);
if (skb_linearize(skb)) if (skb_linearize(skb))
goto drop; goto drop;
data = skb->data;
offset = offset_in_page(data);
len = skb_headlen(skb);
} }
spin_lock_irqsave(&queue->tx_lock, flags); spin_lock_irqsave(&queue->tx_lock, flags);

View File

@ -964,8 +964,6 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
phys_addr_t size, bool nomap) phys_addr_t size, bool nomap)
{ {
if (memblock_is_region_reserved(base, size))
return -EBUSY;
if (nomap) if (nomap)
return memblock_remove(base, size); return memblock_remove(base, size);
return memblock_reserve(base, size); return memblock_reserve(base, size);

View File

@ -276,6 +276,7 @@ struct tegra_pcie {
struct resource all; struct resource all;
struct resource io; struct resource io;
struct resource pio;
struct resource mem; struct resource mem;
struct resource prefetch; struct resource prefetch;
struct resource busn; struct resource busn;
@ -658,7 +659,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
{ {
struct tegra_pcie *pcie = sys_to_pcie(sys); struct tegra_pcie *pcie = sys_to_pcie(sys);
int err; int err;
phys_addr_t io_start;
err = devm_request_resource(pcie->dev, &pcie->all, &pcie->mem); err = devm_request_resource(pcie->dev, &pcie->all, &pcie->mem);
if (err < 0) if (err < 0)
@ -668,14 +668,12 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
if (err) if (err)
return err; return err;
io_start = pci_pio_to_address(pcie->io.start);
pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
pci_add_resource_offset(&sys->resources, &pcie->prefetch, pci_add_resource_offset(&sys->resources, &pcie->prefetch,
sys->mem_offset); sys->mem_offset);
pci_add_resource(&sys->resources, &pcie->busn); pci_add_resource(&sys->resources, &pcie->busn);
pci_ioremap_io(nr * SZ_64K, io_start); pci_ioremap_io(pcie->pio.start, pcie->io.start);
return 1; return 1;
} }
@ -786,7 +784,6 @@ static irqreturn_t tegra_pcie_isr(int irq, void *arg)
static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) static void tegra_pcie_setup_translations(struct tegra_pcie *pcie)
{ {
u32 fpci_bar, size, axi_address; u32 fpci_bar, size, axi_address;
phys_addr_t io_start = pci_pio_to_address(pcie->io.start);
/* Bar 0: type 1 extended configuration space */ /* Bar 0: type 1 extended configuration space */
fpci_bar = 0xfe100000; fpci_bar = 0xfe100000;
@ -799,7 +796,7 @@ static void tegra_pcie_setup_translations(struct tegra_pcie *pcie)
/* Bar 1: downstream IO bar */ /* Bar 1: downstream IO bar */
fpci_bar = 0xfdfc0000; fpci_bar = 0xfdfc0000;
size = resource_size(&pcie->io); size = resource_size(&pcie->io);
axi_address = io_start; axi_address = pcie->io.start;
afi_writel(pcie, axi_address, AFI_AXI_BAR1_START); afi_writel(pcie, axi_address, AFI_AXI_BAR1_START);
afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ); afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ);
afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1); afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1);
@ -1690,8 +1687,23 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
switch (res.flags & IORESOURCE_TYPE_BITS) { switch (res.flags & IORESOURCE_TYPE_BITS) {
case IORESOURCE_IO: case IORESOURCE_IO:
memcpy(&pcie->io, &res, sizeof(res)); memcpy(&pcie->pio, &res, sizeof(res));
pcie->io.name = np->full_name; pcie->pio.name = np->full_name;
/*
* The Tegra PCIe host bridge uses this to program the
* mapping of the I/O space to the physical address,
* so we override the .start and .end fields here that
* of_pci_range_to_resource() converted to I/O space.
* We also set the IORESOURCE_MEM type to clarify that
* the resource is in the physical memory space.
*/
pcie->io.start = range.cpu_addr;
pcie->io.end = range.cpu_addr + range.size - 1;
pcie->io.flags = IORESOURCE_MEM;
pcie->io.name = "I/O";
memcpy(&res, &pcie->io, sizeof(res));
break; break;
case IORESOURCE_MEM: case IORESOURCE_MEM:

View File

@ -1011,8 +1011,6 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start,
bytes = min(bytes, working_bytes); bytes = min(bytes, working_bytes);
kaddr = kmap_atomic(page_out); kaddr = kmap_atomic(page_out);
memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); memcpy(kaddr + *pg_offset, buf + buf_offset, bytes);
if (*pg_index == (vcnt - 1) && *pg_offset == 0)
memset(kaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
kunmap_atomic(kaddr); kunmap_atomic(kaddr);
flush_dcache_page(page_out); flush_dcache_page(page_out);
@ -1054,3 +1052,34 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start,
return 1; return 1;
} }
/*
* When uncompressing data, we need to make sure and zero any parts of
* the biovec that were not filled in by the decompression code. pg_index
* and pg_offset indicate the last page and the last offset of that page
* that have been filled in. This will zero everything remaining in the
* biovec.
*/
void btrfs_clear_biovec_end(struct bio_vec *bvec, int vcnt,
unsigned long pg_index,
unsigned long pg_offset)
{
while (pg_index < vcnt) {
struct page *page = bvec[pg_index].bv_page;
unsigned long off = bvec[pg_index].bv_offset;
unsigned long len = bvec[pg_index].bv_len;
if (pg_offset < off)
pg_offset = off;
if (pg_offset < off + len) {
unsigned long bytes = off + len - pg_offset;
char *kaddr;
kaddr = kmap_atomic(page);
memset(kaddr + pg_offset, 0, bytes);
kunmap_atomic(kaddr);
}
pg_index++;
pg_offset = 0;
}
}

View File

@ -45,7 +45,9 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,
unsigned long nr_pages); unsigned long nr_pages);
int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
int mirror_num, unsigned long bio_flags); int mirror_num, unsigned long bio_flags);
void btrfs_clear_biovec_end(struct bio_vec *bvec, int vcnt,
unsigned long pg_index,
unsigned long pg_offset);
struct btrfs_compress_op { struct btrfs_compress_op {
struct list_head *(*alloc_workspace)(void); struct list_head *(*alloc_workspace)(void);

View File

@ -373,6 +373,8 @@ cont:
} }
done: done:
kunmap(pages_in[page_in_index]); kunmap(pages_in[page_in_index]);
if (!ret)
btrfs_clear_biovec_end(bvec, vcnt, page_out_index, pg_offset);
return ret; return ret;
} }
@ -410,10 +412,23 @@ static int lzo_decompress(struct list_head *ws, unsigned char *data_in,
goto out; goto out;
} }
/*
* the caller is already checking against PAGE_SIZE, but lets
* move this check closer to the memcpy/memset
*/
destlen = min_t(unsigned long, destlen, PAGE_SIZE);
bytes = min_t(unsigned long, destlen, out_len - start_byte); bytes = min_t(unsigned long, destlen, out_len - start_byte);
kaddr = kmap_atomic(dest_page); kaddr = kmap_atomic(dest_page);
memcpy(kaddr, workspace->buf + start_byte, bytes); memcpy(kaddr, workspace->buf + start_byte, bytes);
/*
* btrfs_getblock is doing a zero on the tail of the page too,
* but this will cover anything missing from the decompressed
* data.
*/
if (bytes < destlen)
memset(kaddr+bytes, 0, destlen-bytes);
kunmap_atomic(kaddr); kunmap_atomic(kaddr);
out: out:
return ret; return ret;

View File

@ -299,6 +299,8 @@ done:
zlib_inflateEnd(&workspace->strm); zlib_inflateEnd(&workspace->strm);
if (data_in) if (data_in)
kunmap(pages_in[page_in_index]); kunmap(pages_in[page_in_index]);
if (!ret)
btrfs_clear_biovec_end(bvec, vcnt, page_out_index, pg_offset);
return ret; return ret;
} }
@ -310,10 +312,14 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in,
struct workspace *workspace = list_entry(ws, struct workspace, list); struct workspace *workspace = list_entry(ws, struct workspace, list);
int ret = 0; int ret = 0;
int wbits = MAX_WBITS; int wbits = MAX_WBITS;
unsigned long bytes_left = destlen; unsigned long bytes_left;
unsigned long total_out = 0; unsigned long total_out = 0;
unsigned long pg_offset = 0;
char *kaddr; char *kaddr;
destlen = min_t(unsigned long, destlen, PAGE_SIZE);
bytes_left = destlen;
workspace->strm.next_in = data_in; workspace->strm.next_in = data_in;
workspace->strm.avail_in = srclen; workspace->strm.avail_in = srclen;
workspace->strm.total_in = 0; workspace->strm.total_in = 0;
@ -341,7 +347,6 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in,
unsigned long buf_start; unsigned long buf_start;
unsigned long buf_offset; unsigned long buf_offset;
unsigned long bytes; unsigned long bytes;
unsigned long pg_offset = 0;
ret = zlib_inflate(&workspace->strm, Z_NO_FLUSH); ret = zlib_inflate(&workspace->strm, Z_NO_FLUSH);
if (ret != Z_OK && ret != Z_STREAM_END) if (ret != Z_OK && ret != Z_STREAM_END)
@ -384,6 +389,17 @@ next:
ret = 0; ret = 0;
zlib_inflateEnd(&workspace->strm); zlib_inflateEnd(&workspace->strm);
/*
* this should only happen if zlib returned fewer bytes than we
* expected. btrfs_get_block is responsible for zeroing from the
* end of the inline extent (destlen) to the end of the page
*/
if (pg_offset < destlen) {
kaddr = kmap_atomic(dest_page);
memset(kaddr + pg_offset, 0, destlen - pg_offset);
kunmap_atomic(kaddr);
}
return ret; return ret;
} }

View File

@ -736,7 +736,12 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
} }
alias = d_find_alias(inode); alias = d_find_alias(inode);
if (alias && !vfat_d_anon_disconn(alias)) { /*
* Checking "alias->d_parent == dentry->d_parent" to make sure
* FS is not corrupted (especially double linked dir).
*/
if (alias && alias->d_parent == dentry->d_parent &&
!vfat_d_anon_disconn(alias)) {
/* /*
* This inode has non anonymous-DCACHE_DISCONNECTED * This inode has non anonymous-DCACHE_DISCONNECTED
* dentry. This means, the user did ->lookup() by an * dentry. This means, the user did ->lookup() by an
@ -755,12 +760,9 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
out: out:
mutex_unlock(&MSDOS_SB(sb)->s_lock); mutex_unlock(&MSDOS_SB(sb)->s_lock);
dentry->d_time = dentry->d_parent->d_inode->i_version; if (!inode)
dentry = d_splice_alias(inode, dentry); dentry->d_time = dir->i_version;
if (dentry) return d_splice_alias(inode, dentry);
dentry->d_time = dentry->d_parent->d_inode->i_version;
return dentry;
error: error:
mutex_unlock(&MSDOS_SB(sb)->s_lock); mutex_unlock(&MSDOS_SB(sb)->s_lock);
return ERR_PTR(err); return ERR_PTR(err);
@ -793,7 +795,6 @@ static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode,
inode->i_mtime = inode->i_atime = inode->i_ctime = ts; inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
/* timestamp is already written, so mark_inode_dirty() is unneeded. */ /* timestamp is already written, so mark_inode_dirty() is unneeded. */
dentry->d_time = dentry->d_parent->d_inode->i_version;
d_instantiate(dentry, inode); d_instantiate(dentry, inode);
out: out:
mutex_unlock(&MSDOS_SB(sb)->s_lock); mutex_unlock(&MSDOS_SB(sb)->s_lock);
@ -824,6 +825,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry)
clear_nlink(inode); clear_nlink(inode);
inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
fat_detach(inode); fat_detach(inode);
dentry->d_time = dir->i_version;
out: out:
mutex_unlock(&MSDOS_SB(sb)->s_lock); mutex_unlock(&MSDOS_SB(sb)->s_lock);
@ -849,6 +851,7 @@ static int vfat_unlink(struct inode *dir, struct dentry *dentry)
clear_nlink(inode); clear_nlink(inode);
inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
fat_detach(inode); fat_detach(inode);
dentry->d_time = dir->i_version;
out: out:
mutex_unlock(&MSDOS_SB(sb)->s_lock); mutex_unlock(&MSDOS_SB(sb)->s_lock);
@ -889,7 +892,6 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
inode->i_mtime = inode->i_atime = inode->i_ctime = ts; inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
/* timestamp is already written, so mark_inode_dirty() is unneeded. */ /* timestamp is already written, so mark_inode_dirty() is unneeded. */
dentry->d_time = dentry->d_parent->d_inode->i_version;
d_instantiate(dentry, inode); d_instantiate(dentry, inode);
mutex_unlock(&MSDOS_SB(sb)->s_lock); mutex_unlock(&MSDOS_SB(sb)->s_lock);

View File

@ -1853,14 +1853,13 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat,
journal->j_chksum_driver = NULL; journal->j_chksum_driver = NULL;
return 0; return 0;
} }
}
/* Precompute checksum seed for all metadata */ /* Precompute checksum seed for all metadata */
if (jbd2_journal_has_csum_v2or3(journal))
journal->j_csum_seed = jbd2_chksum(journal, ~0, journal->j_csum_seed = jbd2_chksum(journal, ~0,
sb->s_uuid, sb->s_uuid,
sizeof(sb->s_uuid)); sizeof(sb->s_uuid));
} }
}
/* If enabling v1 checksums, downgrade superblock */ /* If enabling v1 checksums, downgrade superblock */
if (COMPAT_FEATURE_ON(JBD2_FEATURE_COMPAT_CHECKSUM)) if (COMPAT_FEATURE_ON(JBD2_FEATURE_COMPAT_CHECKSUM))

View File

@ -201,8 +201,8 @@ void fib_free_table(struct fib_table *tb);
#ifndef CONFIG_IP_MULTIPLE_TABLES #ifndef CONFIG_IP_MULTIPLE_TABLES
#define TABLE_LOCAL_INDEX 0 #define TABLE_LOCAL_INDEX (RT_TABLE_LOCAL & (FIB_TABLE_HASHSZ - 1))
#define TABLE_MAIN_INDEX 1 #define TABLE_MAIN_INDEX (RT_TABLE_MAIN & (FIB_TABLE_HASHSZ - 1))
static inline struct fib_table *fib_get_table(struct net *net, u32 id) static inline struct fib_table *fib_get_table(struct net *net, u32 id)
{ {

View File

@ -429,7 +429,7 @@ header-y += virtio_net.h
header-y += virtio_pci.h header-y += virtio_pci.h
header-y += virtio_ring.h header-y += virtio_ring.h
header-y += virtio_rng.h header-y += virtio_rng.h
header=y += vm_sockets.h header-y += vm_sockets.h
header-y += vt.h header-y += vt.h
header-y += wait.h header-y += wait.h
header-y += wanrouter.h header-y += wanrouter.h

View File

@ -507,13 +507,6 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
return retval; return retval;
} }
id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
if (id < 0) {
ipc_rcu_putref(sma, sem_rcu_free);
return id;
}
ns->used_sems += nsems;
sma->sem_base = (struct sem *) &sma[1]; sma->sem_base = (struct sem *) &sma[1];
for (i = 0; i < nsems; i++) { for (i = 0; i < nsems; i++) {
@ -528,6 +521,14 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
INIT_LIST_HEAD(&sma->list_id); INIT_LIST_HEAD(&sma->list_id);
sma->sem_nsems = nsems; sma->sem_nsems = nsems;
sma->sem_ctime = get_seconds(); sma->sem_ctime = get_seconds();
id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
if (id < 0) {
ipc_rcu_putref(sma, sem_rcu_free);
return id;
}
ns->used_sems += nsems;
sem_unlock(sma, -1); sem_unlock(sma, -1);
rcu_read_unlock(); rcu_read_unlock();

View File

@ -2874,10 +2874,14 @@ asmlinkage __visible void __sched schedule_user(void)
* or we have been woken up remotely but the IPI has not yet arrived, * or we have been woken up remotely but the IPI has not yet arrived,
* we haven't yet exited the RCU idle mode. Do it here manually until * we haven't yet exited the RCU idle mode. Do it here manually until
* we find a better solution. * we find a better solution.
*
* NB: There are buggy callers of this function. Ideally we
* should warn if prev_state != IN_USER, but that will trigger
* too frequently to make sense yet.
*/ */
user_exit(); enum ctx_state prev_state = exception_enter();
schedule(); schedule();
user_enter(); exception_exit(prev_state);
} }
#endif #endif

View File

@ -598,6 +598,7 @@ struct gen_pool *devm_gen_pool_create(struct device *dev, int min_alloc_order,
return pool; return pool;
} }
EXPORT_SYMBOL(devm_gen_pool_create);
/** /**
* dev_get_gen_pool - Obtain the gen_pool (if any) for a device * dev_get_gen_pool - Obtain the gen_pool (if any) for a device

View File

@ -28,7 +28,7 @@ void show_mem(unsigned int filter)
continue; continue;
total += zone->present_pages; total += zone->present_pages;
reserved = zone->present_pages - zone->managed_pages; reserved += zone->present_pages - zone->managed_pages;
if (is_highmem_idx(zoneid)) if (is_highmem_idx(zoneid))
highmem += zone->present_pages; highmem += zone->present_pages;

View File

@ -244,8 +244,10 @@ int __frontswap_store(struct page *page)
the (older) page from frontswap the (older) page from frontswap
*/ */
inc_frontswap_failed_stores(); inc_frontswap_failed_stores();
if (dup) if (dup) {
__frontswap_clear(sis, offset); __frontswap_clear(sis, offset);
frontswap_ops->invalidate_page(type, offset);
}
} }
if (frontswap_writethrough_enabled) if (frontswap_writethrough_enabled)
/* report failure so swap also writes to swap device */ /* report failure so swap also writes to swap device */

View File

@ -815,6 +815,7 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
if (!pte_file(pte)) { if (!pte_file(pte)) {
swp_entry_t entry = pte_to_swp_entry(pte); swp_entry_t entry = pte_to_swp_entry(pte);
if (likely(!non_swap_entry(entry))) {
if (swap_duplicate(entry) < 0) if (swap_duplicate(entry) < 0)
return entry.val; return entry.val;
@ -826,9 +827,8 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
&src_mm->mmlist); &src_mm->mmlist);
spin_unlock(&mmlist_lock); spin_unlock(&mmlist_lock);
} }
if (likely(!non_swap_entry(entry)))
rss[MM_SWAPENTS]++; rss[MM_SWAPENTS]++;
else if (is_migration_entry(entry)) { } else if (is_migration_entry(entry)) {
page = migration_entry_to_page(entry); page = migration_entry_to_page(entry);
if (PageAnon(page)) if (PageAnon(page))

View File

@ -776,8 +776,11 @@ again: remove_next = 1 + (end > next->vm_end);
* shrinking vma had, to cover any anon pages imported. * shrinking vma had, to cover any anon pages imported.
*/ */
if (exporter && exporter->anon_vma && !importer->anon_vma) { if (exporter && exporter->anon_vma && !importer->anon_vma) {
if (anon_vma_clone(importer, exporter)) int error;
return -ENOMEM;
error = anon_vma_clone(importer, exporter);
if (error)
return error;
importer->anon_vma = exporter->anon_vma; importer->anon_vma = exporter->anon_vma;
} }
} }
@ -2469,7 +2472,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
if (err) if (err)
goto out_free_vma; goto out_free_vma;
if (anon_vma_clone(new, vma)) err = anon_vma_clone(new, vma);
if (err)
goto out_free_mpol; goto out_free_mpol;
if (new->vm_file) if (new->vm_file)

View File

@ -274,6 +274,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
{ {
struct anon_vma_chain *avc; struct anon_vma_chain *avc;
struct anon_vma *anon_vma; struct anon_vma *anon_vma;
int error;
/* Don't bother if the parent process has no anon_vma here. */ /* Don't bother if the parent process has no anon_vma here. */
if (!pvma->anon_vma) if (!pvma->anon_vma)
@ -283,8 +284,9 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
* First, attach the new VMA to the parent VMA's anon_vmas, * First, attach the new VMA to the parent VMA's anon_vmas,
* so rmap can find non-COWed pages in child processes. * so rmap can find non-COWed pages in child processes.
*/ */
if (anon_vma_clone(vma, pvma)) error = anon_vma_clone(vma, pvma);
return -ENOMEM; if (error)
return error;
/* Then add our own anon_vma. */ /* Then add our own anon_vma. */
anon_vma = anon_vma_alloc(); anon_vma = anon_vma_alloc();

View File

@ -3076,7 +3076,7 @@ static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags,
void *obj; void *obj;
int x; int x;
VM_BUG_ON(nodeid > num_online_nodes()); VM_BUG_ON(nodeid < 0 || nodeid >= MAX_NUMNODES);
n = get_node(cachep, nodeid); n = get_node(cachep, nodeid);
BUG_ON(!n); BUG_ON(!n);

View File

@ -165,6 +165,7 @@ static void vmpressure_work_fn(struct work_struct *work)
unsigned long scanned; unsigned long scanned;
unsigned long reclaimed; unsigned long reclaimed;
spin_lock(&vmpr->sr_lock);
/* /*
* Several contexts might be calling vmpressure(), so it is * Several contexts might be calling vmpressure(), so it is
* possible that the work was rescheduled again before the old * possible that the work was rescheduled again before the old
@ -173,11 +174,12 @@ static void vmpressure_work_fn(struct work_struct *work)
* here. No need for any locks here since we don't care if * here. No need for any locks here since we don't care if
* vmpr->reclaimed is in sync. * vmpr->reclaimed is in sync.
*/ */
if (!vmpr->scanned)
return;
spin_lock(&vmpr->sr_lock);
scanned = vmpr->scanned; scanned = vmpr->scanned;
if (!scanned) {
spin_unlock(&vmpr->sr_lock);
return;
}
reclaimed = vmpr->reclaimed; reclaimed = vmpr->reclaimed;
vmpr->scanned = 0; vmpr->scanned = 0;
vmpr->reclaimed = 0; vmpr->reclaimed = 0;

View File

@ -1523,6 +1523,7 @@ static int do_setlink(const struct sk_buff *skb,
goto errout; goto errout;
} }
if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) { if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) {
put_net(net);
err = -EPERM; err = -EPERM;
goto errout; goto errout;
} }

View File

@ -247,6 +247,9 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff)
err = ptype->callbacks.gro_complete(skb, nhoff + grehlen); err = ptype->callbacks.gro_complete(skb, nhoff + grehlen);
rcu_read_unlock(); rcu_read_unlock();
skb_set_inner_mac_header(skb, nhoff + grehlen);
return err; return err;
} }

View File

@ -623,6 +623,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
arg.iov[0].iov_base = (unsigned char *)&rep; arg.iov[0].iov_base = (unsigned char *)&rep;
arg.iov[0].iov_len = sizeof(rep.th); arg.iov[0].iov_len = sizeof(rep.th);
net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
#ifdef CONFIG_TCP_MD5SIG #ifdef CONFIG_TCP_MD5SIG
hash_location = tcp_parse_md5sig_option(th); hash_location = tcp_parse_md5sig_option(th);
if (!sk && hash_location) { if (!sk && hash_location) {
@ -633,7 +634,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
* Incoming packet is checked with md5 hash with finding key, * Incoming packet is checked with md5 hash with finding key,
* no RST generated if md5 hash doesn't match. * no RST generated if md5 hash doesn't match.
*/ */
sk1 = __inet_lookup_listener(dev_net(skb_dst(skb)->dev), sk1 = __inet_lookup_listener(net,
&tcp_hashinfo, ip_hdr(skb)->saddr, &tcp_hashinfo, ip_hdr(skb)->saddr,
th->source, ip_hdr(skb)->daddr, th->source, ip_hdr(skb)->daddr,
ntohs(th->source), inet_iif(skb)); ntohs(th->source), inet_iif(skb));
@ -681,7 +682,6 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
if (sk) if (sk)
arg.bound_dev_if = sk->sk_bound_dev_if; arg.bound_dev_if = sk->sk_bound_dev_if;
net = dev_net(skb_dst(skb)->dev);
arg.tos = ip_hdr(skb)->tos; arg.tos = ip_hdr(skb)->tos;
ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt, ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt,
ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,

View File

@ -787,16 +787,16 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
.queue_hash_add = inet6_csk_reqsk_queue_hash_add, .queue_hash_add = inet6_csk_reqsk_queue_hash_add,
}; };
static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, static void tcp_v6_send_response(struct sock *sk, struct sk_buff *skb, u32 seq,
u32 tsval, u32 tsecr, int oif, u32 ack, u32 win, u32 tsval, u32 tsecr,
struct tcp_md5sig_key *key, int rst, u8 tclass, int oif, struct tcp_md5sig_key *key, int rst,
u32 label) u8 tclass, u32 label)
{ {
const struct tcphdr *th = tcp_hdr(skb); const struct tcphdr *th = tcp_hdr(skb);
struct tcphdr *t1; struct tcphdr *t1;
struct sk_buff *buff; struct sk_buff *buff;
struct flowi6 fl6; struct flowi6 fl6;
struct net *net = dev_net(skb_dst(skb)->dev); struct net *net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
struct sock *ctl_sk = net->ipv6.tcp_sk; struct sock *ctl_sk = net->ipv6.tcp_sk;
unsigned int tot_len = sizeof(struct tcphdr); unsigned int tot_len = sizeof(struct tcphdr);
struct dst_entry *dst; struct dst_entry *dst;
@ -946,7 +946,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
(th->doff << 2); (th->doff << 2);
oif = sk ? sk->sk_bound_dev_if : 0; oif = sk ? sk->sk_bound_dev_if : 0;
tcp_v6_send_response(skb, seq, ack_seq, 0, 0, 0, oif, key, 1, 0, 0); tcp_v6_send_response(sk, skb, seq, ack_seq, 0, 0, 0, oif, key, 1, 0, 0);
#ifdef CONFIG_TCP_MD5SIG #ifdef CONFIG_TCP_MD5SIG
release_sk1: release_sk1:
@ -957,13 +957,13 @@ release_sk1:
#endif #endif
} }
static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, static void tcp_v6_send_ack(struct sock *sk, struct sk_buff *skb, u32 seq,
u32 win, u32 tsval, u32 tsecr, int oif, u32 ack, u32 win, u32 tsval, u32 tsecr, int oif,
struct tcp_md5sig_key *key, u8 tclass, struct tcp_md5sig_key *key, u8 tclass,
u32 label) u32 label)
{ {
tcp_v6_send_response(skb, seq, ack, win, tsval, tsecr, oif, key, 0, tclass, tcp_v6_send_response(sk, skb, seq, ack, win, tsval, tsecr, oif, key, 0,
label); tclass, label);
} }
static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
@ -971,7 +971,7 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
struct inet_timewait_sock *tw = inet_twsk(sk); struct inet_timewait_sock *tw = inet_twsk(sk);
struct tcp_timewait_sock *tcptw = tcp_twsk(sk); struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt, tcp_v6_send_ack(sk, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
tcp_time_stamp + tcptw->tw_ts_offset, tcp_time_stamp + tcptw->tw_ts_offset,
tcptw->tw_ts_recent, tw->tw_bound_dev_if, tcp_twsk_md5_key(tcptw), tcptw->tw_ts_recent, tw->tw_bound_dev_if, tcp_twsk_md5_key(tcptw),
@ -986,10 +986,10 @@ static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
/* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV /* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV
* sk->sk_state == TCP_SYN_RECV -> for Fast Open. * sk->sk_state == TCP_SYN_RECV -> for Fast Open.
*/ */
tcp_v6_send_ack(skb, (sk->sk_state == TCP_LISTEN) ? tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ?
tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt, tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,
tcp_rsk(req)->rcv_nxt, tcp_rsk(req)->rcv_nxt, req->rcv_wnd,
req->rcv_wnd, tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if, tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if,
tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr),
0, 0); 0, 0);
} }

View File

@ -140,7 +140,7 @@ static bool match_validate(const struct sw_flow_match *match,
if (match->key->eth.type == htons(ETH_P_ARP) if (match->key->eth.type == htons(ETH_P_ARP)
|| match->key->eth.type == htons(ETH_P_RARP)) { || match->key->eth.type == htons(ETH_P_RARP)) {
key_expected |= 1 << OVS_KEY_ATTR_ARP; key_expected |= 1 << OVS_KEY_ATTR_ARP;
if (match->mask && (match->mask->key.tp.src == htons(0xff))) if (match->mask && (match->mask->key.eth.type == htons(0xffff)))
mask_allowed |= 1 << OVS_KEY_ATTR_ARP; mask_allowed |= 1 << OVS_KEY_ATTR_ARP;
} }
@ -221,7 +221,7 @@ static bool match_validate(const struct sw_flow_match *match,
htons(NDISC_NEIGHBOUR_SOLICITATION) || htons(NDISC_NEIGHBOUR_SOLICITATION) ||
match->key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) { match->key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) {
key_expected |= 1 << OVS_KEY_ATTR_ND; key_expected |= 1 << OVS_KEY_ATTR_ND;
if (match->mask && (match->mask->key.tp.src == htons(0xffff))) if (match->mask && (match->mask->key.tp.src == htons(0xff)))
mask_allowed |= 1 << OVS_KEY_ATTR_ND; mask_allowed |= 1 << OVS_KEY_ATTR_ND;
} }
} }

View File

@ -22,8 +22,9 @@ menuconfig NET_SCHED
This code is considered to be experimental. This code is considered to be experimental.
To administer these schedulers, you'll need the user-level utilities To administer these schedulers, you'll need the user-level utilities
from the package iproute2+tc at <ftp://ftp.tux.org/pub/net/ip-routing/>. from the package iproute2+tc at
That package also contains some documentation; for more, check out <https://www.kernel.org/pub/linux/utils/net/iproute2/>. That package
also contains some documentation; for more, check out
<http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2>. <http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2>.
This Quality of Service (QoS) support will enable you to use This Quality of Service (QoS) support will enable you to use
@ -336,7 +337,7 @@ config NET_SCH_PLUG
of virtual machines by allowing the generated network output to be rolled of virtual machines by allowing the generated network output to be rolled
back if needed. back if needed.
For more information, please refer to http://wiki.xensource.com/xenwiki/Remus For more information, please refer to <http://wiki.xenproject.org/wiki/Remus>
Say Y here if you are using this kernel for Xen dom0 and Say Y here if you are using this kernel for Xen dom0 and
want to protect Xen guests with Remus. want to protect Xen guests with Remus.

View File

@ -94,7 +94,7 @@ static unsigned int fq_codel_classify(struct sk_buff *skb, struct Qdisc *sch,
TC_H_MIN(skb->priority) <= q->flows_cnt) TC_H_MIN(skb->priority) <= q->flows_cnt)
return TC_H_MIN(skb->priority); return TC_H_MIN(skb->priority);
filter = rcu_dereference(q->filter_list); filter = rcu_dereference_bh(q->filter_list);
if (!filter) if (!filter)
return fq_codel_hash(q, skb) + 1; return fq_codel_hash(q, skb) + 1;

View File

@ -401,12 +401,12 @@ int sctp_packet_transmit(struct sctp_packet *packet)
sk = chunk->skb->sk; sk = chunk->skb->sk;
/* Allocate the new skb. */ /* Allocate the new skb. */
nskb = alloc_skb(packet->size + LL_MAX_HEADER, GFP_ATOMIC); nskb = alloc_skb(packet->size + MAX_HEADER, GFP_ATOMIC);
if (!nskb) if (!nskb)
goto nomem; goto nomem;
/* Make sure the outbound skb has enough header room reserved. */ /* Make sure the outbound skb has enough header room reserved. */
skb_reserve(nskb, packet->overhead + LL_MAX_HEADER); skb_reserve(nskb, packet->overhead + MAX_HEADER);
/* Set the owning socket so that we know where to get the /* Set the owning socket so that we know where to get the
* destination IP address. * destination IP address.

View File

@ -117,6 +117,7 @@ struct keyring_search_context {
#define KEYRING_SEARCH_NO_UPDATE_TIME 0x0004 /* Don't update times */ #define KEYRING_SEARCH_NO_UPDATE_TIME 0x0004 /* Don't update times */
#define KEYRING_SEARCH_NO_CHECK_PERM 0x0008 /* Don't check permissions */ #define KEYRING_SEARCH_NO_CHECK_PERM 0x0008 /* Don't check permissions */
#define KEYRING_SEARCH_DETECT_TOO_DEEP 0x0010 /* Give an error on excessive depth */ #define KEYRING_SEARCH_DETECT_TOO_DEEP 0x0010 /* Give an error on excessive depth */
#define KEYRING_SEARCH_SKIP_EXPIRED 0x0020 /* Ignore expired keys (intention to replace) */
int (*iterator)(const void *object, void *iterator_data); int (*iterator)(const void *object, void *iterator_data);

View File

@ -26,6 +26,8 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include "internal.h" #include "internal.h"
#define KEY_MAX_DESC_SIZE 4096
static int key_get_type_from_user(char *type, static int key_get_type_from_user(char *type,
const char __user *_type, const char __user *_type,
unsigned len) unsigned len)
@ -78,7 +80,7 @@ SYSCALL_DEFINE5(add_key, const char __user *, _type,
description = NULL; description = NULL;
if (_description) { if (_description) {
description = strndup_user(_description, PAGE_SIZE); description = strndup_user(_description, KEY_MAX_DESC_SIZE);
if (IS_ERR(description)) { if (IS_ERR(description)) {
ret = PTR_ERR(description); ret = PTR_ERR(description);
goto error; goto error;
@ -177,7 +179,7 @@ SYSCALL_DEFINE4(request_key, const char __user *, _type,
goto error; goto error;
/* pull the description into kernel space */ /* pull the description into kernel space */
description = strndup_user(_description, PAGE_SIZE); description = strndup_user(_description, KEY_MAX_DESC_SIZE);
if (IS_ERR(description)) { if (IS_ERR(description)) {
ret = PTR_ERR(description); ret = PTR_ERR(description);
goto error; goto error;
@ -287,7 +289,7 @@ long keyctl_join_session_keyring(const char __user *_name)
/* fetch the name from userspace */ /* fetch the name from userspace */
name = NULL; name = NULL;
if (_name) { if (_name) {
name = strndup_user(_name, PAGE_SIZE); name = strndup_user(_name, KEY_MAX_DESC_SIZE);
if (IS_ERR(name)) { if (IS_ERR(name)) {
ret = PTR_ERR(name); ret = PTR_ERR(name);
goto error; goto error;
@ -562,8 +564,9 @@ long keyctl_describe_key(key_serial_t keyid,
{ {
struct key *key, *instkey; struct key *key, *instkey;
key_ref_t key_ref; key_ref_t key_ref;
char *tmpbuf; char *infobuf;
long ret; long ret;
int desclen, infolen;
key_ref = lookup_user_key(keyid, KEY_LOOKUP_PARTIAL, KEY_NEED_VIEW); key_ref = lookup_user_key(keyid, KEY_LOOKUP_PARTIAL, KEY_NEED_VIEW);
if (IS_ERR(key_ref)) { if (IS_ERR(key_ref)) {
@ -586,38 +589,31 @@ long keyctl_describe_key(key_serial_t keyid,
} }
okay: okay:
/* calculate how much description we're going to return */
ret = -ENOMEM;
tmpbuf = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (!tmpbuf)
goto error2;
key = key_ref_to_ptr(key_ref); key = key_ref_to_ptr(key_ref);
desclen = strlen(key->description);
ret = snprintf(tmpbuf, PAGE_SIZE - 1, /* calculate how much information we're going to return */
"%s;%d;%d;%08x;%s", ret = -ENOMEM;
infobuf = kasprintf(GFP_KERNEL,
"%s;%d;%d;%08x;",
key->type->name, key->type->name,
from_kuid_munged(current_user_ns(), key->uid), from_kuid_munged(current_user_ns(), key->uid),
from_kgid_munged(current_user_ns(), key->gid), from_kgid_munged(current_user_ns(), key->gid),
key->perm, key->perm);
key->description ?: ""); if (!infobuf)
goto error2;
/* include a NUL char at the end of the data */ infolen = strlen(infobuf);
if (ret > PAGE_SIZE - 1) ret = infolen + desclen + 1;
ret = PAGE_SIZE - 1;
tmpbuf[ret] = 0;
ret++;
/* consider returning the data */ /* consider returning the data */
if (buffer && buflen > 0) { if (buffer && buflen >= ret) {
if (buflen > ret) if (copy_to_user(buffer, infobuf, infolen) != 0 ||
buflen = ret; copy_to_user(buffer + infolen, key->description,
desclen + 1) != 0)
if (copy_to_user(buffer, tmpbuf, buflen) != 0)
ret = -EFAULT; ret = -EFAULT;
} }
kfree(tmpbuf); kfree(infobuf);
error2: error2:
key_ref_put(key_ref); key_ref_put(key_ref);
error: error:
@ -649,7 +645,7 @@ long keyctl_keyring_search(key_serial_t ringid,
if (ret < 0) if (ret < 0)
goto error; goto error;
description = strndup_user(_description, PAGE_SIZE); description = strndup_user(_description, KEY_MAX_DESC_SIZE);
if (IS_ERR(description)) { if (IS_ERR(description)) {
ret = PTR_ERR(description); ret = PTR_ERR(description);
goto error; goto error;

View File

@ -546,6 +546,7 @@ static int keyring_search_iterator(const void *object, void *iterator_data)
} }
if (key->expiry && ctx->now.tv_sec >= key->expiry) { if (key->expiry && ctx->now.tv_sec >= key->expiry) {
if (!(ctx->flags & KEYRING_SEARCH_SKIP_EXPIRED))
ctx->result = ERR_PTR(-EKEYEXPIRED); ctx->result = ERR_PTR(-EKEYEXPIRED);
kleave(" = %d [expire]", ctx->skipped_ret); kleave(" = %d [expire]", ctx->skipped_ret);
goto skipped; goto skipped;
@ -628,6 +629,10 @@ static bool search_nested_keyrings(struct key *keyring,
ctx->index_key.type->name, ctx->index_key.type->name,
ctx->index_key.description); ctx->index_key.description);
#define STATE_CHECKS (KEYRING_SEARCH_NO_STATE_CHECK | KEYRING_SEARCH_DO_STATE_CHECK)
BUG_ON((ctx->flags & STATE_CHECKS) == 0 ||
(ctx->flags & STATE_CHECKS) == STATE_CHECKS);
if (ctx->index_key.description) if (ctx->index_key.description)
ctx->index_key.desc_len = strlen(ctx->index_key.description); ctx->index_key.desc_len = strlen(ctx->index_key.description);
@ -637,7 +642,6 @@ static bool search_nested_keyrings(struct key *keyring,
if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE || if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE ||
keyring_compare_object(keyring, &ctx->index_key)) { keyring_compare_object(keyring, &ctx->index_key)) {
ctx->skipped_ret = 2; ctx->skipped_ret = 2;
ctx->flags |= KEYRING_SEARCH_DO_STATE_CHECK;
switch (ctx->iterator(keyring_key_to_ptr(keyring), ctx)) { switch (ctx->iterator(keyring_key_to_ptr(keyring), ctx)) {
case 1: case 1:
goto found; goto found;
@ -649,8 +653,6 @@ static bool search_nested_keyrings(struct key *keyring,
} }
ctx->skipped_ret = 0; ctx->skipped_ret = 0;
if (ctx->flags & KEYRING_SEARCH_NO_STATE_CHECK)
ctx->flags &= ~KEYRING_SEARCH_DO_STATE_CHECK;
/* Start processing a new keyring */ /* Start processing a new keyring */
descend_to_keyring: descend_to_keyring:

View File

@ -516,6 +516,8 @@ struct key *request_key_and_link(struct key_type *type,
.match_data.cmp = key_default_cmp, .match_data.cmp = key_default_cmp,
.match_data.raw_data = description, .match_data.raw_data = description,
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
.flags = (KEYRING_SEARCH_DO_STATE_CHECK |
KEYRING_SEARCH_SKIP_EXPIRED),
}; };
struct key *key; struct key *key;
key_ref_t key_ref; key_ref_t key_ref;

View File

@ -249,6 +249,7 @@ struct key *key_get_instantiation_authkey(key_serial_t target_id)
.match_data.cmp = key_default_cmp, .match_data.cmp = key_default_cmp,
.match_data.raw_data = description, .match_data.raw_data = description,
.match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
.flags = KEYRING_SEARCH_DO_STATE_CHECK,
}; };
struct key *authkey; struct key *authkey;
key_ref_t authkey_ref; key_ref_t authkey_ref;